- Стили индикаторов в примерах
- Связь между свойствами индикатора и функциями
- SetIndexBuffer
- IndicatorSetDouble
- IndicatorSetInteger
- IndicatorSetString
- PlotIndexSetDouble
- PlotIndexSetInteger
- PlotIndexSetString
- PlotIndexGetInteger
Пользовательские индикаторы
Группа функций, используемых при оформлении пользовательских индикаторов. Данные функции нельзя использовать при написании советников и скриптов.
Функция |
Действие |
---|---|
Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double |
|
Задает значение свойства индикатора, имеющего тип double |
|
Задает значение свойства индикатора,имеющего тип int |
|
Задает значение свойства индикатора, имеющего тип string |
|
Задает значение свойства линии индикатора, имеющего тип double |
|
Задает значение свойства линии индикатора, имеющего тип int |
|
Задает значение свойства линии индикатора, имеющего тип string |
|
Возвращает значение свойства линии индикатора, имеющего целый тип |
Свойства индикаторов можно устанавливать как с помощью директив компилятора, так и с помощью функций. Для лучшего понимания рекомендуется изучить стили индикаторов в примерах.
Все необходимые расчеты пользовательских индикаторов необходимо размещать в предопределенной функции 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
|
Перетащим его из окна "Навигатора" на окно индикатора Accelerator Oscillator и укажем, что расчеты будут производиться на значениях предыдущего индикатора:
В результате при первом вызове функции OnCalculate() значение prev_calculated окажется равным нулю, а при последующих вызовах оно будет равно значению rates_total (до тех пор, пока не увеличится количество баров на ценовом графике).
Значение параметра begin будет в точности равно количеству начальных баров, для которых значения индикатора Accelerator не рассчитывается в соответствие с логикой этого индикатора. Если мы посмотрим исходный код пользовательского индикатора Accelerator.mq5, то увидим в функции OnInit() такие строчки:
//--- sets first bar from what index will be drawn
|
Именно функцией PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) мы сообщаем количество несущественных первых значений в нулевом индикаторном массиве пользовательского индикатора, которые нам не нужно принимать для расчетов (empty_first_values). Таким образом, у нас есть механизмы, чтобы:
- сообщить о количестве начальных значений индикатора, которые не стоит использовать для расчетов в другом пользовательском индикаторе;
- получить информацию о количестве первых значений, которые необходимо игнорировать при вызове другого пользовательского индикатора, не вдаваясь в логику его расчетов.