Table of Contents

Индикаторы

S# стандартно предоставляет более 70 индикаторов технического анализа. Это позволяет не создавать с нуля нужные индикаторы, а использовать уже готовые. Кроме того можно создавать собственные индикаторы, взяв за основу существующие, как показано в разделе Собственный индикатор. Все базовые классы для работы с индикаторами, а также сами индикаторы находятся в пространстве имен StockSharp.Algo.Indicators.

Подключение индикатора в робот

  1. В самом начале нужно создать индикатор. Индикатор создается как и обычный .NET объект:

    var longSma = new SimpleMovingAverage { Length = 80 };
    
  2. Далее, необходимо заполнять его данными. Например, это может быть цена закрытия свечи:

    foreach (var candle in candles)
     longSma.Process(candle);
    

    Индикатор принимает на вход IIndicatorValue. Некоторые из индикаторов оперируют простым числом, как, например, SimpleMovingAverage. Другим требуются полностью свеча, как, например, MedianPrice. Поэтому входящие значения необходимо приводить или к DecimalIndicatorValue или к CandleIndicatorValue. Результирующее значение индикатора работает по тем же правилам, что и входящее значение.

  3. Результирующее и входящее значение индикатора имеют свойство IIndicatorValue.IsFinal, которое говорит о том, что значение является окончательным и индикатор не будет изменяться в данной точке времени. Например, индикатор SimpleMovingAverage формируется по цене закрытия свечи, но в текущий момент времени окончательная цена закрытия свечи неизвестна и меняется. В таком случае результирующее значение IIndicatorValue.IsFinal будет false. Eсли в индикатор передать законченную свечу, то входящее и результирующее значения IIndicatorValue.IsFinal будут true.

  4. Для того, чтобы получить текущее значение индикатора, используется метод IIndicatorValue.GetValue<T>:

    // вычисляем новое положение относительно друг друга
    var isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue();
    // если произошло пересечение
    if (_isShortLessThenLong != isShortLessThenLong)
    {
     // если короткая меньше чем длинная, то продажа, иначе, покупка.
     var direction = isShortLessThenLong ? Sides.Sell : Sides.Buy;
     // регистрируем заявку
     var volume = Position == 0 ? Volume : Position.Abs().Min(Volume) * 2;
     var price = candle.ClosePrice + ((direction == Sides.Buy ? Security.PriceStep : -Security.PriceStep) ?? 1);
        RegisterOrder(this.CreateOrder(direction, price, volume));
     // запоминаем текущее положение относительно друг друга
     _isShortLessThenLong = isShortLessThenLong;
    }
    
  5. У всех индикаторов есть свойство BaseIndicator.IsFormed, которое говорит о том готов ли индикатор к использованию. Например, индикатор SimpleMovingAverage имеет период, и пока индикатор не обработает количество свечей, равное периоду индикатора, индикатор будет считаться не готовым к использованию. И свойство BaseIndicator.IsFormed будет false.