Пользовательские индикаторы

Группа функций, используемых при оформлении пользовательских индикаторов. Данные функции нельзя использовать при написании советников и скриптов.

Функция

Действие

SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double

IndicatorSetDouble

Задает значение свойства индикатора, имеющего тип double

IndicatorSetInteger

Задает значение свойства индикатора,имеющего тип int

IndicatorSetString

Задает значение свойства индикатора, имеющего тип string

PlotIndexSetDouble

Задает значение  свойства  линии индикатора, имеющего тип double

PlotIndexSetInteger

Задает значение  свойства  линии индикатора, имеющего тип int

PlotIndexSetString

Задает значение  свойства  линии индикатора, имеющего тип string

PlotIndexGetInteger

Возвращает значение свойства линии индикатора, имеющего целый тип

Свойства индикаторов можно устанавливать как с помощью директив компилятора, так и с помощью функций. Для лучшего понимания рекомендуется изучить стили индикаторов в примерах.

Все необходимые расчеты пользовательских индикаторов необходимо размещать в предопределенной функции OnCalculate(). Если используется короткая форма вызова функции OnCalculate() вида

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

то переменная rates_total содержит значение общего количества элементов массива price[], переданного в качестве входного параметра для расчета значений индикатора.

Параметр prev_calculated – результат выполнения функции OnCalculate() на предыдущем вызове и позволяет организовать экономный алгоритм расчета значений индикатора. Например, если текущее значение rates_total=1000, а prev_calculated=999, то, возможно, нам достаточно сделать расчеты только для одного значения каждого индикаторного буфера.

Если бы информация о размере входного массива price была бы недоступна, то это привело к необходимости производить расчеты для 1000 значений каждого индикаторного буфера. При первом вызове функции OnCalculate() значение prev_calculated=0. Если массив price[] каким-либо образом изменился, то в этом случае prev_calculated также равно 0.

Параметр begin сообщает количество начальных значений массива price, которые не содержат данных для расчета. Например, если в качестве входного массива были использованы значения индикатора Accelerator Oscillator (для которого первые 37 значений не рассчитываются), то begin=37. Для примера рассмотрим простой индикатор:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Перетащим его из окна "Навигатора" на окно индикатора Accelerator Oscillator и укажем, что расчеты будут производиться на значениях предыдущего индикатора:

Расчет индикатора по значениям ранее наброшенного индикатора

В результате при первом вызове функции OnCalculate() значение prev_calculated окажется равным нулю, а при последующих вызовах оно будет равно значению rates_total (до тех пор, пока не увеличится количество баров на ценовом графике).

Параметр begin показывает количество начальных баров, на которых значения пропущены

Значение параметра begin будет в точности равно количеству начальных баров, для которых значения индикатора Accelerator не рассчитывается в соответствие с логикой этого индикатора. Если мы посмотрим исходный код пользовательского индикатора Accelerator.mq5, то увидим в функции OnInit() такие строчки:

//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Именно функцией PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) мы сообщаем количество несущественных первых значений в нулевом индикаторном массиве пользовательского индикатора, которые нам не нужно принимать для расчетов (empty_first_values). Таким образом, у нас есть механизмы, чтобы:

  1. сообщить о количестве начальных значений индикатора, которые не стоит использовать для расчетов в другом пользовательском индикаторе;
  2. получить информацию о количестве первых значений, которые необходимо игнорировать при вызове другого пользовательского индикатора, не вдаваясь в логику его расчетов.