Написание элементарного индикатора

Не буду подробно повторять то, что мы разобрали в предыдущих занятиях — надеюсь вы запомнили, в крайнем случае всегда есть возможность взглянуть еще раз. Сегодня сделаем индикатор, отображающий прирост цены экстремума от цены открытия свечи.

Итак, открываем 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/

You May Also Like