ストラテジー内のインジケーター
StockSharp では、Strategy クラスがインジケーターを扱うための特別な仕組みを提供します。これにより、インジケーターの形成状態を制御し、ストラテジーがいつ動作可能になるかを判断できます。
Indicators プロパティ
Strategy.Indicators プロパティは、ストラテジーで使用されるインジケーターのコレクションです。このコレクションは、インジケーター形成 (ウォームアップ) の状態を自動的に追跡するように設計されています。
// インジケーターコレクションへアクセス
INotifyList<IIndicator> indicators = strategy.Indicators;
IsFormed プロパティ
デフォルトでは、Strategy.IsFormed プロパティの実装は、Indicators コレクション内のすべてのインジケーターが形成済みかどうかを確認します。
// Strategy クラスの標準実装
public virtual bool IsFormed => _indicators.AllFormed;
コレクション内のすべてのインジケーターが形成済みになる (それぞれの IIndicator.IsFormed プロパティが true を返す) と、ストラテジーは「ウォームアップ済み」で動作可能な状態と見なされます。
コレクションへのインジケーター追加
ストラテジーが準備完了かどうかを正しく判断するには、使用するインジケーターを Indicators コレクションへ追加する必要があります。
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// インジケーターを作成
_shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
_longSma = new SimpleMovingAverage { Length = LongSmaLength };
// インジケーターをコレクションへ追加
Indicators.Add(_shortSma);
Indicators.Add(_longSma);
// ...
}
追加すべきインジケーター
Indicators コレクションへ追加するのは、独立したインジケーターのみにしてください。これは不要な待機を避け、ストラテジーが準備完了になるタイミングを正しく判断するための重要なルールです。
インジケーター追加のルール:
独立したインジケーター - マーケットデータ (ローソク足、ティックなど) を直接処理するインジケーターを追加します。
// 独立したインジケーター var sma = new SimpleMovingAverage { Length = 20 }; var rsi = new RelativeStrengthIndex { Length = 14 }; Indicators.Add(sma); Indicators.Add(rsi);インジケーターチェーン - インジケーターチェーン (あるインジケーターの出力が別のインジケーターの入力になる構成) を使用する場合は、チェーン内の最初のインジケーターのみをコレクションへ追加します。
// インジケーターチェーン var sma = new SimpleMovingAverage { Length = 20 }; var stdev = new StandardDeviation { Length = 20 }; var bollingerBands = new BollingerBands { SmaIndicator = sma, DeviationIndicator = stdev }; // チェーン内の最初のインジケーターのみを追加 Indicators.Add(sma); // 他のインジケーターに依存するインジケーターは追加しない // Indicators.Add(stdev); - 不正 // Indicators.Add(bollingerBands); - 不正複合インジケーター - 複数の独立したインジケーターを使用するインジケーター (例: MACD) の場合は、それらをすべて追加します。
var fastEma = new ExponentialMovingAverage { Length = 12 }; var slowEma = new ExponentialMovingAverage { Length = 26 }; var signalEma = new ExponentialMovingAverage { Length = 9 }; var macd = new MovingAverageConvergenceDivergence { FastEma = fastEma, SlowEma = slowEma, SignalEma = signalEma }; // 基本インジケーターを追加 Indicators.Add(fastEma); Indicators.Add(slowEma);
使用例
2 つの移動平均を使う基本例
public class SmaStrategy : Strategy
{
private SimpleMovingAverage _longSma;
private SimpleMovingAverage _shortSma;
// ...
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_longSma = new SimpleMovingAverage { Length = LongSmaLength };
_shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
// 状態を追跡するため、インジケーターをコレクションへ追加
Indicators.Add(_longSma);
Indicators.Add(_shortSma);
// ...
}
private void ProcessCandle(ICandleMessage candle)
{
// インジケーターを処理
var longValue = _longSma.Process(candle);
var shortValue = _shortSma.Process(candle);
// 売買ロジックを実行する前に、ストラテジーが準備完了か確認
if (!IsFormed)
return;
// 売買ロジック
// ...
}
}
IsFormedAndOnline の使用例
ストラテジーが取引可能な状態かどうかを確認するには、IsFormedAndOnlineAndAllowTrading メソッドがよく使用されます。このメソッドは、インジケーター形成、オンライン状態、取引許可の確認を組み合わせます。
private void ProcessCandle(ICandleMessage candle)
{
// インジケーターを処理
var longValue = _longSma.Process(candle);
var shortValue = _shortSma.Process(candle);
// ストラテジー準備状態の包括的な確認
if (!IsFormedAndOnlineAndAllowTrading())
return;
// 売買ロジック
// ...
}
インジケーター使用の最適化
より複雑なストラテジーでは、インジケーターの扱いを適切に整理することが重要です。
public class ComplexStrategy : Strategy
{
private SimpleMovingAverage _sma;
private RelativeStrengthIndex _rsi;
private BollingerBands _bollinger;
private StandardDeviation _stdev;
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// インジケーターを作成
_sma = new SimpleMovingAverage { Length = 20 };
_rsi = new RelativeStrengthIndex { Length = 14 };
_stdev = new StandardDeviation { Length = 20 };
_bollinger = new BollingerBands
{
SmaIndicator = _sma,
DeviationIndicator = _stdev
};
// 独立したインジケーターのみを追加
Indicators.Add(_sma);
Indicators.Add(_rsi);
// _stdev と _bollinger は _sma に依存するため追加しない
// ...
}
// ...
}
高度な機能
標準の動作では不十分な場合は、ストラテジー内で IsFormed プロパティをオーバーライドできます。
public override bool IsFormed
{
get
{
// 標準のインジケーター確認
if (!base.IsFormed)
return false;
// 追加のストラテジー準備条件
return _customCondition && _additionalCheck;
}
}