Индикаторы в стратегии
В 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 OnStarted(DateTimeOffset time)
{
base.OnStarted(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);
Примеры использования
Базовый пример с двумя скользящими средними
public class SmaStrategy : Strategy
{
private SimpleMovingAverage _longSma;
private SimpleMovingAverage _shortSma;
// ...
protected override void OnStarted(DateTimeOffset time)
{
base.OnStarted(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 OnStarted(DateTimeOffset time)
{
base.OnStarted(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;
}
}