ストラテジーの作成
Shell に含まれるストラテジーは Shell.Avalonia/Shell.Core/Strategies/ にあります。独自のストラテジーも同じ場所に追加し、3 つの手順を踏みます。ストラテジークラス、カタログへの登録、そして必要に応じて独自のパネルです。
ストラテジークラス
ストラテジーは、StockSharp の Strategy を継承した通常のクラスです。Shell 固有のものは何もありません。
public class MyStrategy : Strategy
{
private readonly StrategyParam<int> _length;
public MyStrategy()
{
Name = "マイストラテジー";
_length = Param(nameof(Length), 20)
.SetGreaterThanZero()
// 標準のパラメーターと同じグループに入るように、グループはリソースから取得します。
.SetDisplay("長さ", "移動平均の長さ", LocalizedStrings.Parameters)
.SetOptimize(10, 50, 5);
}
public int Length
{
get => _length.Value;
set => _length.Value = value;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// データのサブスクリプションと取引ロジック
}
}
エントリポイントは OnStarted ではなく OnStarted2(DateTime) です。これが呼び出される時点で、ストラテジーはすでに銘柄、ポートフォリオ、接続を受け取っているため、ここで直接データをサブスクライブできます。
SetOptimize(...) を指定して Param(...) で宣言したパラメーターは、最適化 タブに自動的に表示されます。総当たりするパラメーターの一覧とその範囲は、別途指定するのではなく、ストラテジー自体から読み取られます。
ストラテジーカタログ
ストラテジーを選択ウィンドウに表示するには、2 か所に追加する必要があります。
1 つ目は、型の識別子からインスタンスを作成する BuiltInStrategies のファクトリです。
public static Strategy TryCreate(string templateTypeId)
{
...
if (templateTypeId.Equals(MyTypeId, StringComparison.OrdinalIgnoreCase))
return new MyStrategy();
...
}
2 つ目は LegacyStrategyTemplates のテンプレートの説明です。一覧に表示されるストラテジー名と、型と既定値を持つパラメーターのセットは、ここから取得されます。
new StrategyTemplateDefinition(MyTypeId, "マイストラテジー", StrategyTemplateKind.Generic, true,
[
.. CommonParameters(),
new("Length", "長さ", StrategyParameterKind.Integer, "20", true, 1),
])
CommonParameters() は、すべてのストラテジーにある銘柄、ポートフォリオ、数量を返します。それ以外は、そのストラテジー独自のパラメーターです。説明のフィールドは、キー、ラベル、型、既定値、必須かどうか、最小値と最大値の順に並びます。
StrategyTemplateKind が区別するのは、シェルに専用のパネルがある種類(Sma、SmaIndex、StairsTrend、StairsCountertrend、Designer)だけです。専用のパネルを持たないストラテジーは Generic です。
ユーザーが ストラテジー パネルで指定した値は、StrategyMaterializer でインスタンスに適用されます。新しいパラメーターの解析もそこに追加します。
ストラテジーの設定はシェルによって保存・復元されるため、保存用のコードを別途書く必要はありません。
独自のパネル
標準のパラメーターパネルで十分な場合は、何もする必要はありません。Shell が自動的に表示します。独自のパネルが必要になるのは、ストラテジーにパラメーター以外にも表示するものがある場合です。その設定方法と監視方法は、ストラテジーパネルの作成 セクションで説明しています。