2.5 Создаем пользовательский индикатор: цветная скользящая средняя SMA

Заставка MQL4

Всем привет! В этом уроке мы научимся создавать самый простой индикатор для МТ4 — Скользящую среднюю (Moving Averages), рассчитывать ее значения, сохранять данные в буфер и отображать на графике. Поехали.

Создаем индикатор Скользящая средняя

Зажимаем Ctrl+N и создаем новый пользовательский индикатор. Имя можно начать вводить по номеру урока — 2.5, остальную информацию об авторе по желанию. Далее. Дополнительные функции нам не нужны, жмем Далее. Отображение должно быть на графике, галочку на подвальный индикатор не ставим. Буферы мы лучше создадим вручную, поэтому отрисовку задавать не нужно. Но хочу заметить, что с помощью этой функции можно проделать ту же работу с буферами индикатора, которую я опишу ниже, просто в качестве объяснения удобнее и проще все сделать вручную в данном случае.

Данные свойств индикатора, отображаемые сверху программного кода, будут иметь вид:

Так как одна из целей этого урока познакомить вас с буферами индикатора, которые содержат все числовые данные индикатора, то создадим два буфера. Один будет выполнять отрисовку скользящей средней красного цвета, а второй зеленого для тех участков, где цена выше линии MA.

Поэтому добавляем ниже новое свойство индикатора indicator_buffersкоторое определяет количество буферов.

Теперь введем внешние переменные для настройки индикатора: непосредственно период для нашей скользящей и сдвиг на указанное число баров вправо относительно графика.

Буфер индикатора должен где-то хранить данные. Для этого нужно создать пользовательский массив, который будет передавать данные в буфер. В нашем случае нужно два массива для двух буферов. Так как мы не может знать количество свечей, которые будут проанализированы, то массив для буферов всегда задается динамическим.

В итоге вне функций наш код будет иметь вид:

Переходим к функции обработки событий OnInit. При инициализации мы должны задать необходимые настройки для буферов индикатора, такие как тип линии, толщина, цвет, имя и т.д. 

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

Значения буферов индикатора отображаются в окне «Окно Данных» (Ctrl+D). Так как точность скользящей средней по количеству знаков после запятой должна быть аналогична точности цены на графике, то укажем формат Digits соответствующий текущему символу:

Теперь нужно настроить стиль отображения линии скользящей средней для каждого буфера. Для этого воспользуемся функцией SetIndexStyle, которая имеет пять параметров:

  • Порядковый номер буфера, для которого эти свойства задаются. Отсчет начинается с нуля.
  • Тип отрисовки линии на графике: простая линия, отрезок, гистограмма, стрелки и т.д. В нашем случае это простая линия DRAW_LINE.
  • Стиль отображения созданной линии: сплошная, штриховая, пунктирная, штрих-пунктирная и т.д. Наша линия будет сплошной STYLE_SOLID.
  • Толщина линии. Действует только для сплошных линий. Вы не можете задать толщину для пунктирной или штриховой линии, она должна быть равна единице.
  • Цвет линии. Линия не может быть радужной, ей задается один конкретный цвет на всю ее длину.
Мы задали для первого буфера (порядковый номер 0) сплошную линию толщиной в 2 пикселя красного цвета. Эта линия будет отображаться на каждом баре в истории. Теперь для второго буфера данных (порядковый номер 1) нужно задать зеленую линию, которая будет появляться только, когда цена будет выше скользящей средней.
Имя буфера данных. Оно нужно, чтобы не запутаться, когда у вас количество буферов больше, чем один. Может быть любым текстовым значением. В нашем случае имя будет «SMA» плюс период индикатора из настроек:
Теперь это имя нужно назначить обоим буферам. И чтобы они отличались, для второго мы добавим слово «Green».
Соответственно, когда индикатор будет готов и установлен на график, в «Окне данных» вы сможете увидеть под заданным нами именем округленное значение с точностью цены символа для каждого буфера на выбранном мышью баре графика.

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

Последнее, что осталось сделать в функции инициализации — назначить каждому буферу свой массив, в котором будут храниться данные индикатора. Массивы уже были созданы, осталось их связать с буфером.

В итоге вся функция OnInit будет выглядеть так:

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

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

Для этого воспользуемся двумя первыми параметрами функции OnCalculate: rates_total и prev_calculated. Подробнее их мы рассматривали на уроке 2.0 Пишем первый Индикатор.

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

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

В итоге функция OnCalculate будет иметь следующий вид:

Нам осталось разобрать последнюю функцию — sma(). В нее мы передаем значение переменной limit. Тип функции будет void, потому функция не должна ничего возвращать. Введем переменную значения суммы цен анализируемых свечей sum, а также сравнение, чтобы limits не был меньше заданного пользователем периода скользящей MA_Period.

Как мы знаем, простая скользящая средняя рассчитывается по формуле:

То есть цены закрытия последних N свечей делятся на количество этих свечей (что и является периодом индикатора). Соответственно мы должны просуммировать количество заданных свечей, чтобы получить суммарное значение их цен закрытия. Для этого воспользуемся циклом for, который запишем строчкой ниже:

Узнав сумму цен, можно запустить последний расчет, цель которого будет в том, чтобы полученное значение разделить на период индикатора и получить в итоге цену SMA для каждого бара. Для этого нам нужен цикл while

После расчетов нам необходимо построить две линии индикатора на графике. Первая линия будет строиться на каждой свече, поэтому массиву MABuffer1 передаем значение SMA. Массив уже привязан к буферу, поэтому построение графика произойдет автоматически. Для второго массива мы добавили условие по которому он будет использоваться только, если цена закрытия анализируемого бара выше, чем скользящая средняя. Соответственно зеленая линия будет строиться поверх красной только при соблюдении данного условия. Осталось вычесть уже ненужную цену закрытия свечи из общей суммы и уменьшить количество свечей limits в цикле.

В итоге готовая пользовательская функция будет иметь вид:

Все, теперь можно установить индикатор на график и посмотреть, что получилось.

Проверьте «Окно Данных», там должно быть два значения данных буферов, которые будут изменяться в зависимости от выделенной мышью свечи. Там, где зеленая линия будет два одинаковых значения, потому что второй массив построен поверх первого. На красной линии значение будет только у первого массива. 

Если вы захотите улучшить данный код и добавить в расчет другие типы скользящих средних, такие как: Exponential MA, Smoothed MA или Linear Weighted MA, то их открытый код можно скачать с официального сайта MQL5.

На этом все, весь код урока приложен во вложении с комментариями к каждой строчке. Подписывайтесь на рассылку, чтобы не пропустить новые статьи. 

До встречи на нашем сайте DaVinci FX Group.

0. Начало работы

Скачать код урока

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Меню