Table of Contents

Индикаторы в стратегии

В 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 следует добавлять только независимые индикаторы. Это важное правило, которое поможет избежать лишнего ожидания и корректно определить момент готовности стратегии.

Правила добавления индикаторов:

  1. Независимые индикаторы - добавляйте индикаторы, которые напрямую обрабатывают рыночные данные (свечи, тики и т.д.):

    // Независимые индикаторы
    var sma = new SimpleMovingAverage { Length = 20 };
    var rsi = new RelativeStrengthIndex { Length = 14 };
    
    Indicators.Add(sma);
    Indicators.Add(rsi);
    
  2. Цепочки индикаторов - при использовании цепочки индикаторов (когда выход одного является входом для другого), добавляйте в коллекцию только первый индикатор в цепочке:

    // Цепочка индикаторов
    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); - неправильно
    
  3. Комбинированные индикаторы - для индикаторов, которые используют несколько независимых индикаторов (например, 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;
	}
}

См. также