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

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

Часть 1 Часть 2 Часть 3 Здравствуйте, дорогие друзья. Продолжаем цикл уроков, посвященный разработке простого сеточного советника на языке MQL4. Исходный код будет приложен к последнему уроку. Мы остановились в прошлый раз на функции OnInit(), в которой создали массивы для хранения тикетов ордеров сеток, изменили их размер и инициализировали нулями. Теперь начнем, как и обещалось, работать с функцией OnTick(). Это главная и наиболее часто используемая функция в любом советнике. У нас она будет относительно короткой. Так и должно быть - в любом языке функция main() должна быть короткой и содержать только самое необходимое - для наглядности. Проверка спреда и статуса автоторговли Первое, что мы сделаем - проверим состояние кнопки "Автоторговля". Если она отжата - то никакие вычисления и уж тем более торговые операции производиться не будут: Функция TerminalInfoInteger() с аргументом TERMINAL_TRADE_ALLOWED возвращает именно то, что нам нужно - статус кнопки Автоторговля. True при разреше
Оглавление

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

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

Мы остановились в прошлый раз на функции OnInit(), в которой создали массивы для хранения тикетов ордеров сеток, изменили их размер и инициализировали нулями. Теперь начнем, как и обещалось, работать с функцией OnTick(). Это главная и наиболее часто используемая функция в любом советнике. У нас она будет относительно короткой. Так и должно быть - в любом языке функция main() должна быть короткой и содержать только самое необходимое - для наглядности.

Проверка спреда и статуса автоторговли

Первое, что мы сделаем - проверим состояние кнопки "Автоторговля". Если она отжата - то никакие вычисления и уж тем более торговые операции производиться не будут:

-2

Функция TerminalInfoInteger() с аргументом TERMINAL_TRADE_ALLOWED возвращает именно то, что нам нужно - статус кнопки Автоторговля. True при разрешенной торговле, false - при запрещенной. Мы инвертируем результат вызова оператором ! и помещаем его в инструкцию if. Таким образом, если торговля не разрешена - то мы выходим из функции (return), и на новом тике ничего не произойдет.

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

-3

Если спред большой - выходим из OnTick() и ничего не делаем.

Ну что - время открывать нашу сетку? Вот нам и начали пригождаться когда-то созданные переменные. Флаги buy_in_trade и sell_in_trade понадобятся для определения, в торгах направление или нет. Логика очень простая: если сетки в торгах нет (даже одного ордера), - то ищем условие на вход. Помним, что в Новый год советник торговать не должен, поэтому эту проверку тоже надо предусмотреть. Но если раскрытая сетка попадает на Новый год - то нужно "довести" ее, то есть открытые сетки должны обсчитываться. Попробуем набросать это в коде:

-4

Все очень наглядно. Если направление buy не в торгах и сейчас не НГ - стартуем сетку, то есть ищем условие на вход в покупку. И то же самое для продаж.Функцию start_grid() мы опишем позже.

Но что если направление в торгах, то есть у нас открыты какие-то ордера, их нужно считать и обрабатывать?

-5

Если направление в торгах, то мы отправим поток выполнения в функцию manage_grid(), которая будет обрабатывать всю логику ведения сетки.

Вот и весь OnTick :) дальше будем реализовывать функции start_grid() и manage_grid(), и еще много вспомогательных функций.

Функция start_grid()

Функция start_grid() ищет возможность для первого входа. Открывать ордера только потому, что их нет на графике - явно плохая идея, поэтому нам нужен какой-то критерий, отталкиваясь от которого мы будем стартовать сетку. Вариантов на самом деле бесконечно много. Можно использовать индикаторы, свечные паттерны, что угодно. Мы будем вызывать для этого индикатор RSI: если его значение больше указанного в настройках максимума - то открываем сетку в sell, меньше минимума - в buy. Сделаем заготовку функции:

-6

Она будет принимать параметр mode - это направление торгов в buy или sell. Первое, что нам нужно сделать - запросить значение индикатора RSI:

-7

Вызов системной функции iRSI возвращает значение индикатора, которое мы записываем в переменную типа double. Первый аргумент - символ. Здесь мы выбираем символ того графика, на котором стоит советник. Второй - период графика. Тоже запрашиваем текущий таймфрейм графика. Третий (rsi_period) - это наш параметр из настроек, период индикатора. Рассчитываться индикатор будет по ценам закрытия (PRICE_CLOSE) с нулевым сдвигом.

Теперь наконец мы подошли к моменту, когда можно открывать ордера :)

-8

Если параметр mode равен true (то есть мы передали сверху при вызову константу BUY), то функция будет искать входы на покупку. Проверяем: если запрошенный RSI меньше либо равен нижнему уровню из настроек - то открываем ордер в buy и устанавливаем значение флага buy_in_trade в true. Функцию open_order() мы реализуем позже - она будет в том числе проверять, не первый ли это ордер, то есть будет вызываться как из start_grid(), так и из manage_grid().

Примерно то же самое проделываем, если mode == false, то есть вызвали функцию с аргументом SELL. В этом случае, если текущее значение RSI больше либо равно верхнего уровня, указанного в настройках, - то продаем и устанавливаем флаг sell_in_trade в true.

На этом пока урок окончен. В следующей части мы начнем делать функцию manage_grid() - она будет большой :)

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

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

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

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