Индикаторы
S# стандартно предоставляет более 70 индикаторов технического анализа. Это позволяет не создавать с нуля нужные индикаторы, а использовать уже готовые. Кроме того можно создавать собственные индикаторы, взяв за основу существующие, как показано в разделе Собственный индикатор. Все базовые классы для работы с индикаторами, а также сами индикаторы находятся в пространстве имен StockSharp.Algo.Indicators.
Подключение индикатора в робот
В самом начале нужно создать индикатор. Индикатор создается как и обычный .NET объект:
var longSma = new SimpleMovingAverage { Length = 80 };
Далее, необходимо заполнять его данными. Например, это может быть цена закрытия свечи:
foreach (var candle in candles) longSma.Process(candle);
Индикатор принимает на вход IIndicatorValue. Некоторые из индикаторов оперируют простым числом, как, например, SimpleMovingAverage. Другим требуются полностью свеча, как, например, MedianPrice. Поэтому входящие значения необходимо приводить или к DecimalIndicatorValue или к CandleIndicatorValue. Результирующее значение индикатора работает по тем же правилам, что и входящее значение.
Результирующее и входящее значение индикатора имеют свойство IIndicatorValue.IsFinal, которое говорит о том, что значение является окончательным и индикатор не будет изменяться в данной точке времени. Например, индикатор SimpleMovingAverage формируется по цене закрытия свечи, но в текущий момент времени окончательная цена закрытия свечи неизвестна и меняется. В таком случае результирующее значение IIndicatorValue.IsFinal будет false. Eсли в индикатор передать законченную свечу, то входящее и результирующее значения IIndicatorValue.IsFinal будут true.
Для того, чтобы получить текущее значение индикатора, используется метод 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; }
У всех индикаторов есть свойство BaseIndicator.IsFormed, которое говорит о том готов ли индикатор к использованию. Например, индикатор SimpleMovingAverage имеет период, и пока индикатор не обработает количество свечей, равное периоду индикатора, индикатор будет считаться не готовым к использованию. И свойство BaseIndicator.IsFormed будет false.