Indicator class (Класс индикаторов)

Когда вы создаете новый пользовательский индикатор, вы можете видеть предустановленные шаблоны индикаторов в редакторе первичного кода:

using System;
using cAlgo.API
using cAlgo.API.Indicators;
namespace cAlgo.Indicators{
  [Indicator(IsOverlay = false)]
  public class NewIndicator : Indicator{
    [Parameter(DefaultValue = 0.0)]
    public double Parameter { get; set; }
    [Output("Main")]
    public IndicatorDataSeries Result { get; set; }
    protected override void Initialize(){
//      Initialize and create nested indicators
    }
    public override void Calculate(int index){
//      Calculate value at specified index
//      Result[index] = ...
    }
  }
}

NewIndicator класс является базовым классом программы – индикатором Indicator . Для того, чтобы использовать этот класс как индикатор, необходимо отметить его атрибутом [Indicator] . Он уже отмечен данным образом в шаблоне.

IsOverlay означает, накладывается ли данный индикатор на ценовой график или нет. Если это overlay-индикатор ( IsOverlay = true ), он будет накладываться на график, например, все индикаторы moving являются overlay-индикаторами. Если данный индикатор не является overlay-индикатором ( IsOverlay = false ), он будет открыт в новом окне.

Parameters (Параметры)

Parameter - настройка параметров индикатора, которая может быть использована для уточнения некоторых более важных внешних значений, необходимых для построения индикатора. Более подробная информация - в разделе "Заявленные параметры".

Result series (Исходные данные)

Result - это серии данных, хранящие результаты вычислений. Чтобы индикатор отображался на графике, исходные данные индикатора должны принадлежать типу IndicatorDataSeries , маркированному как [Output] . В дополнение к этому атрибуту вы также должны указать название рисуемой линии индикатора. Несмотря на то, что в существующих шаблонных индикаторах есть только одна линия, вы можете создать их несколько. Вы также можете изменить стиль и цвет линии. В коде индикатора MACD, исходными данными являются:

[Output("Main", Color = Colors.Turquoise, IsHistogram = true)]
public IndicatorDataSeries Histogram { get; set; }
[Output("Signal", Color = Colors.Red, LineStyle = LineStyle.Lines)]
public IndicatorDataSeries Signal { get; set; }
Calculation (Вычисления)

Добавляя индикатор на график, cAlgo запрашивает метод расчета Calculate(index) для каждой свечи. Этот метод должен содержать логику просчета каждой единицы значения индикатора. В качестве исходных значений для расчетов, вы можете использовать данные Open, High, Low, Close с выбранного участка графика, к которому прикреплен индикатор. В первом случае, мы используем объект MarketSeries , содержащий значения Open , High , Low и Close . Например, вычисление "High минус Low" выглядит следующим образом:

[Output("Main")]
public IndicatorDataSeries Result {{ get; set; }; }
public override void Calculate(int index){
  Result[index] = MarketSeries.High[index] - MarketSeries.Low[index];
}

Если вы хотите позволить пользователям самостоятельно вручную устанавливать исходные серии значений для индикатора, вы должны закрепить исходные данные (source series), как параметр. Для этого, задайте свободный доступ к коду DataSeries (public) и отметьте его с помощью атрибута [Parameter] . Далее, мы сможем использовать его для расчетов. Например, ниже указан код для индикатора "Simple Moving Average":

[Parameter(DefaultValue = 14)]
public int Periods { get; set; }
[Parameter]
public DataSeries Source { get; set; }
[Output("Main")]
public IndicatorDataSeries Result { get; set; }
public override void Calculate(int index){
  double sum = 0.0;   for (int i = index - Periods + 1; i <= index; i++){
    sum = sum + Source[i];
  }
  Result[index] = sum / Periods;
}

Все расчеты осуществляются для каждой свечи, по очереди. Если график содержит N свечей, значения исходных данных также будут содержать N численных символов. Сначала вычисление Calculate(index) будет осуществлено для последней свечи, index = 0, затем 1, 2, 3, ..., N-1. Затем, когда все вычисления произведены, и сформировался новый тик (последняя свеча изменена), параметр вычисления Calculate(index) будет проводиться снова для index = N-1, так, последнее значение индикатора будет пересчитано после каждого тика. Когда появится новая свеча, новое значение будет добавлено к исходным данным (source series), и параметр вычисления OnCalculate(index) будет проводиться для index = N.