Не буду подробно повторять то, что мы разобрали в предыдущих занятиях — надеюсь вы запомнили, в крайнем случае всегда есть возможность взглянуть еще раз. Сегодня сделаем индикатор, отображающий прирост цены экстремума от цены открытия свечи.
Итак, открываем MetaEditor и создаём пользовательский индикатор «Growth», в окне графика. Видим такую картину:
У нас появились новые элементы:
#property indicator_chart_window – оператор, устанавливающий отображение индикатора в окне графика;
int init() – заголовок специальной функция init() c предопределенным именем «init». Это функция, вызывающаяся в процессе инициализации модуля, т.е. она исполняется один раз в момент прикрепления индикатора к графику, запуска терминала, смены инструмента, таймфрейма, входных параметров, счета; в отличии от функции start(), которая будет исполняться с приходом каждого тика.
int deinit() – заголовок специальной функция deinit() c предопределенным именем. Она вызывается в процессе деинициализации модуля, т.е. она исполняется один раз в момент снятия индикатора с графика, при завершении работы терминала, закрытии окна инструмента, перед сменой инструмента, таймфрейма, при смене входных параметров, счета. Время исполнения специальной функции deinit() ограничено периодом 2,5 секунды.
Обратите внимание – функции init(), deinit(), start() могут располагаться в любой последовательности (deinit, start, init), но только не внутри другой функции.
Теперь будем добавлять наш код.
Исправим #property indicator_chart_window на #property indicator_separate_window.
#property indicator_separate_window – оператор, устанавливающий отображение индикатора в отдельном окне;
В головной части программы (до первой функции) запишем:
#property indicator_buffers 2
Задаем количество буферов в программе, по числу отображаемых линий (2 шт.), максимально – 8.
#property indicator_color1 Blue
#property indicator_color2 Red
Задаем цвета для линия1 и линия2
double Buf_0[], Buf_1[];
Присваиваем тип значения double (действительные числа) и объявляем 2 буфера — Buf_0[] и Buf_1[]. Операцию заканчиваем «;».
В функцию init() добавим:
SetIndexBuffer(0,Buf_0);
SetIndexBuffer(1,Buf_1);
Связываем наши линии с буферами. Порядковый номер линии начинается с 0.
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);
SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1);
Устанавливаем стиль линий (порядковый номер, линия, сплошная, ширина =1).
Функцию deinit() применять не будем, поэтому ее можно оставить без изменений или удалить.
В функции start():
int Counted_bars =IndicatorCounted();
Объявляем переменную counted_bars с типом int (целое число) и присваиваем ей значение, равное значению функции IndicatorCounted() – функция возвращает количество баров, не измененных после последнего вызова индикатора. Большинство подсчитанных баров не нуждается в пересчете. Это используется для оптимизации вычислений. Тут мы получаем количество просчитанных баров.
Добавляем:
int i=Bars-Counted_bars-1;
Объявляем переменную i и присваиваем значение, равное Bars (количество баров на текущем графике) минус Counted_bars (количество посчитанных баров) – минус 1 (т.к. текущий бар имеет номер 0). Здесь мы получаем количество баров, которые программе нужно пересчитать.
while(i>=0)
{
…
}
Организуем цикл с помощью составного оператора while. Пока выражение i>=0 истинно, будут выполняться команды в фигурных скобках. Если выражение ложно – управление будет передано следующему оператору.
Внутри фигурных скобок разместим такой код:
Buf_0[i]= High[i]-Open[i];
Buf_1[i]= Open[i]-Low[i];
i—;
Здесь вычисляются значения буфера 0 и 1 для бара i, потом i уменьшается на 1 (i— равно i-1).
Таким образом, пока i>=0 , будет рассчитываться значение буфера для каждого бара с номером i.
High[], Open[], Low[] – предопределенные переменные, содержащие соответствующие цены каждого бара текущего графика.
return(0) – завершает работу функции старт до прихода следующего тика.
Ненужные комментарии можно удалить. Теперь скомпилируем программу, нажав кнопу «Компилировать».
Внизу появился результат компиляции.
Теперь можно бросить наш индикатор на график и получим подобное изображение:
Написание простого скрипта — https://forexlab.ru/mql-simple-script/