ストラテジーパラメーター

ストラテジーの設定と最適化のために、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>.SetCanOptimizeStrategyParam<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.SaveStrategy.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 つの数値パラメーターについては、指定範囲で最適化できるように構成しました。

関連項目

設定の保存と読み込み