ストラテジーパラメーター
ストラテジーの設定と最適化のために、StockSharp は特別なクラス StrategyParam<T> を提供します。ストラテジーパラメーターを使用すると、コードを変更せずに取引アルゴリズムの設定を変更できます。これは、テストモードとライブ取引モードを切り替える場合に特に便利です。さらに、これらのパラメーターは最適化中に値を自動的に反復し、最適なストラテジー設定を見つけるために使用されます。
通常の C# プロパティとは異なり、このクラスで作成されたパラメーターはビジュアル設定 (たとえば Designer) に自動的に表示され、ストラテジー最適化に使用できます。
ストラテジーパラメーターの作成
パラメーターは、ストラテジーコンストラクター内で Strategy.Param メソッドを使用して作成します。
public class SmaStrategy : Strategy
{
private readonly StrategyParam<int> _longSmaLength;
public int LongSmaLength
{
get => _longSmaLength.Value;
set => _longSmaLength.Value = value;
}
public SmaStrategy()
{
_longSmaLength = Param(nameof(LongSmaLength), 80)
.SetGreaterThanZero()
.SetDisplay("長期SMAの期間", string.Empty, "基本設定");
}
}
この例では、初期値 80 の LongSmaLength パラメーターを作成し、値が 0 より大きいことを保証するバリデーターを設定し、ユーザーインターフェイス用の表示設定を構成しています。
パラメーター設定メソッド
StrategyParam<T> クラスは、パラメーター設定のためにいくつかのメソッドを提供します。
SetDisplay
StrategyParam<T>.SetDisplay メソッドは、パラメーターの表示名、説明、カテゴリーを設定します。
_longSmaLength = Param(nameof(LongSmaLength), 80)
.SetDisplay("長期SMAの期間", "長期移動平均の期間", "基本設定");
SetValidator
StrategyParam<T>.SetValidator メソッドは、パラメーター値を確認するバリデーターを設定します。StockSharp は、一般的なタスクに使用できる定義済みバリデーターを幅広く提供しています。
// 数値が 0 より大きいことを確認
_longSmaLength = Param(nameof(LongSmaLength), 80)
.SetValidator(new IntGreaterThanZeroAttribute());
// 数値が負でないことを確認
_volume = Param(nameof(Volume), 1)
.SetValidator(new DecimalNotNegativeAttribute());
// 値の範囲を確認
_percentage = Param(nameof(Percentage), 50)
.SetValidator(new RangeAttribute(0, 100));
// 必須値を確認
_security = Param<Security>(nameof(Security))
.SetValidator(new RequiredAttribute());
利便性のため、StrategyParam<T> には最も一般的なバリデーター用の組み込みメソッドがあります。
// 数値が 0 より大きいことを確認
_longSmaLength = Param(nameof(LongSmaLength), 80).SetGreaterThanZero();
// 数値が負でないことを確認
_volume = Param(nameof(Volume), 1).SetNotNegative();
// 値が NULL または負でないことを確認
_interval = Param<TimeSpan?>(nameof(Interval)).SetNullOrNotNegative();
// 値の範囲を設定
_percentage = Param(nameof(Percentage), 50).SetRange(0, 100);
組み込みバリデーターでは不十分な場合は、ValidationAttribute を継承して独自のバリデーターを作成できます。
public class EvenNumberAttribute : ValidationAttribute
{
public EvenNumberAttribute()
: base("値は偶数でなければなりません。")
{
}
public override bool IsValid(object value)
{
if (value is int intValue)
return intValue % 2 == 0;
return false;
}
}
// カスタムバリデーターを使用
_barCount = Param(nameof(BarCount), 10)
.SetValidator(new EvenNumberAttribute());
SetHidden
StrategyParam<T>.SetHidden メソッドは、プロパティエディターでパラメーターを非表示にします。
_systemParam = Param(nameof(SystemParam), "value")
.SetHidden(true);
SetBasic
StrategyParam<T>.SetBasic メソッドは、パラメーターを基本パラメーターとしてマークします。これはユーザーインターフェイスでの表示に影響します。基本パラメーターは簡易プロパティエディターモードで表示されます。
_longSmaLength = Param(nameof(LongSmaLength), 80)
.SetBasic(true);

SetReadOnly
StrategyParam<T>.SetReadOnly メソッドは、パラメーターを読み取り専用にします。
_calculatedParam = Param(nameof(CalculatedParam), 0)
.SetReadOnly(true);
SetCanOptimize と SetOptimize
StrategyParam<T>.SetCanOptimize と StrategyParam<T>.SetOptimize メソッドは、パラメーターを最適化に使用できるかどうかを指定し、最適化用の値範囲を設定します。
_longSmaLength = Param(nameof(LongSmaLength), 80)
.SetCanOptimize(true)
.SetOptimize(10, 200, 10);
上の例では、パラメーターは 10 から 200 まで、ステップ 10 の範囲で最適化されます。
ストラテジーでのパラメーター使用
ストラテジーパラメーターは通常のプロパティと同じように使用します。
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
_longSma = new SimpleMovingAverage { Length = LongSmaLength };
// ...
}
パラメーターの保存と読み込み
パラメーター値は、基底 Strategy クラスで自動的に保存および読み込みされます。Strategy.Save と Strategy.Load メソッドをオーバーライドする場合は、基底クラスのメソッドを呼び出す必要があります。
public override void Save(SettingsStorage settings)
{
base.Save(settings);
// 追加の保存ロジック...
}
public override void Load(SettingsStorage settings)
{
base.Load(settings);
// 追加の読み込みロジック...
}
例: 複数のパラメーターを持つストラテジー
以下は、複数のパラメーターを持つストラテジーの例です。
public class SmaStrategy : Strategy
{
private readonly StrategyParam<DataType> _series;
private readonly StrategyParam<int> _longSmaLength;
private readonly StrategyParam<int> _shortSmaLength;
public DataType シリーズ
{
get => _series.Value;
set => _series.Value = value;
}
public int LongSmaLength
{
get => _longSmaLength.Value;
set => _longSmaLength.Value = value;
}
public int ShortSmaLength
{
get => _shortSmaLength.Value;
set => _shortSmaLength.Value = value;
}
public SmaStrategy()
{
base.Name = "SMA strategy";
Param("TypeId", GetType().GetTypeName(false)).SetHidden();
_longSmaLength = Param(nameof(LongSmaLength), 80)
.SetGreaterThanZero()
.SetDisplay("長期SMAの期間", string.Empty, "基本設定")
.SetCanOptimize(true)
.SetOptimize(20, 200, 10);
_shortSmaLength = Param(nameof(ShortSmaLength), 30)
.SetGreaterThanZero()
.SetDisplay("短期SMAの期間", string.Empty, "基本設定")
.SetCanOptimize(true)
.SetOptimize(5, 50, 5);
_series = Param(nameof(シリーズ), DataType.TimeFrame(TimeSpan.FromMinutes(15)))
.SetDisplay("シリーズ", string.Empty, "基本設定");
}
// ...
}
この例では、2 つの移動平均のクロスに基づくストラテジーを、3 つの設定可能なパラメーターで作成しました。
シリーズ- データ型とタイムフレームLongSmaLength- 長期移動平均の期間ShortSmaLength- 短期移動平均の期間
2 つの数値パラメーターについては、指定範囲で最適化できるように構成しました。