Найти в Дзене
Romero Trading

Пишем сеточный советник RSI на MQL4: часть 2

Часть 1 Часть 2 Здравствуйте, дорогие друзья. В этой статье мы продолжим разработку простого сеточного советника на индикаторе RSI для МТ4 с целью обучения азам разработки. Прошлый урок мы закончили созданием окна настроек. Исходный код будет выложен в последнем уроке. Создаем набор переменных Помимо настроек нам понадобятся служебные переменные для хранения и обработки некоторых значений. Их не будет видно в окне настроек, но робот будет их активно использовать. Разместим их также на глобальном уровне сразу после настроек, то есть вне функций OnInit() и OnTick(). В массиваx buy_grid[] и sell_grid[] мы будем хранить тикеты ордеров, которые были открыты советником, для последующего удобного доступа к ним и их обработки. Константы BUY и SELL созданы для удобного способа отличать направление сеток. Переменные buy_in_trade и sell_in_trade - это признак наличия открытой сетки по направлению. И ради демонстрации работы со временем запретим советнику торговать в Новый год - с 20 декабря по
Оглавление

Часть 1 Часть 2

Здравствуйте, дорогие друзья.

В этой статье мы продолжим разработку простого сеточного советника на индикаторе RSI для МТ4 с целью обучения азам разработки. Прошлый урок мы закончили созданием окна настроек. Исходный код будет выложен в последнем уроке.

Создаем набор переменных

Помимо настроек нам понадобятся служебные переменные для хранения и обработки некоторых значений. Их не будет видно в окне настроек, но робот будет их активно использовать. Разместим их также на глобальном уровне сразу после настроек, то есть вне функций OnInit() и OnTick().

-2

В массиваx buy_grid[] и sell_grid[] мы будем хранить тикеты ордеров, которые были открыты советником, для последующего удобного доступа к ним и их обработки. Константы BUY и SELL созданы для удобного способа отличать направление сеток. Переменные buy_in_trade и sell_in_trade - это признак наличия открытой сетки по направлению. И ради демонстрации работы со временем запретим советнику торговать в Новый год - с 20 декабря по 10 января. В это время, как известно, движения очень сильные и непредсказуемые, что опасно как для сеточных советников, так и для скальперов. А в переменной comment мы будем хранить комментарий, который задается ордеру при его открытии.

Пишем проверку спреда и Нового года

Давайте напишем эту логику. Оформим ее в виде двух отдельных функций, которые разместим следом за OnTick():

-3

Обе они возвращают значение bool и наглядно отвечают на вопросы: "Сейчас большой спред?", "Сейчас Новый год?"

Позже мы вызовем их для проверки в соответствующих местах кода. Проверим спред:

-4

Запросим значение спреда функцией MarketInfo(). Она возвращает double, который мы сразу записываем в локальную переменную spread. Дальше проверим: если счет 3/5 значный, то спред запросился в 5-значных пунктах, и мы его должны привести к 4-знаку, так как бот будет считать в 4-знаке. Для этого поделим его на 10. Иначе (счет не 3- и не 5-значный) спред уже в 4-значных пунктах, и мы ничего не делаем.

Функция возвращает true, если текущий спред на графике больше либо равен максимальному (указанному в настройках), и false в противном случае.

Давайте подготовим теперь проверку Нового года. Создадим в разделе переменных структуру под названием MqlDateTime:

-5

В ней мы будем запрашивать время для проверки Нового года, а впоследствии и других проверок, связанных с работой по времени. И заполним функцию is_new_year():

-6

Вызов TimeCurrent(time) заполняет поля структуры текущим временем. Это год, день, месяц, часы, минуты и секунды. Условие if разбито на 2 части: если сейчас время с 20 декабря ИЛИ время до 10 января. Запрос к time.mon возвращает месяц, а к time.day - день. То есть если месяц декабрь и наш текущий день уже больше 20-го, или месяц январь и день еще пока меньше 10-го – то мы возвращаем true. Во всех остальных случаях - false.

Инициализируем советник

В OnInit() можно добавить много чего полезного, но пока ограничимся ресайзом и обнулением массивов тикетов:

-7

Вызовы функций ArrayResize() и ArrayInitialize() изменяют размеры массивов на максимально разрешенное число ордеров и заполняют их нулями соответственно.

OnDeinit() мы пока оставим пустым.

А на сегодня пока закончим. В следующем уроке начнем работать с основной функцией OnTick() и делать непосредственно логику работы с ордерами. Спасибо за внимание!

---------------------------------------------------------------

Не хочешь сам делать советник, а заработать хочется? Можно купить готовый грааль вот тут.

---------------------------------------------------------------

Платные уроки по программированию на MQL4 и MQL5 - обращайтесь в лс. Автор имеет многолетний опыт разработки советников.