MQL5 Урок 1 – Редактор кода, События, Устройство mql-программ

Приветствую вас, друзья! Эта серия уроков направлена на новичков, которые вообще никогда не программировали. Для тех, кто пробовал, знает уже какой-то язык, особенно Си и mql4, многие из этих уроков будут простыми.

В первом уроке мы рассмотрим отличия MQL5 от 4 версии, устройство редактора кода MetaEditor 5 и основные функции устройства MQL-программ.

MQL5 для чайников - Урок 1: Редактор кода, События, устройство mql5 программ

Что такое MQL5?

Mql5 – это объектно-ориентированный язык, в нем можно оперировать сложными типами данных, такими как классы. Он очень сильно похож на C++. В mql5 по сравнению со старой 4 версией присутствует больше обработчиков событий и самих событий, поэтому и возможности написания более сложных алгоритмов выше. Сейчас в 4 версии также появилась возможность применения объектно-ориентированного подхода и еще множество разных плюшек, которые доступны в mql5 изначально, поэтому mql4 сейчас сильно приближен к 5 версии, за исключение нескольких вещей – в mql4 меньше событий, немного меньше функционала в тестере, ну и еще несколько мелочей. Подозреваю, что это было сделано для более плавного перехода на 5 версию. Принципиальное отличие 4 от 5 в том, что по одному инструменту может быть открыта только одна активная позиция. Тогда как в 4 мы оперируем ордерами, которых может быть по одному инструменту множество.

Язык mql – это узкоспециализированный язык, нацеленный на написание торговых стратегий, индикаторов и скриптов для торговли. Сам код пишется в специальном редакторе MetaTrader. Попасть в него можно, кликнув на иконку редактора в терминале или нажав кнопку F4.

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

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

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

Также в редакторе кода есть отладка. Это специальный режим, который позволяет пройтись по коду построчно. В mql4 очень долго его не было, но в итоге отладчик все же добавили. В mql5 он был изначально. Для отладки нажимаем кнопочку «play» или F5. В настройках можно выбрать инструмент и таймфрейм. После нажатия открывается окно настроек совы, управление программой останавливается на указанной нами строке. Перемещаться по строкам можно с помощью F10 или кнопки «шаг с обходом». Чтобы остановить отладку, достаточно нажать кнопку «стоп».

mql – это событийно ориентированный язык. Это значит, что когда происходит определенное событие, наша программа на него каким-то образом реагирует. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления.

Функция OnInit

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

int  OnInit(void);

Функция возвращает одно из предопределенных значений:

  • INIT_SUCCEEDED — инициализация прошла успешно;
  • INIT_FAILED — неудачная инициализация, тестирование нет смысла продолжать из-за неустранимых ошибок;
  • INIT_PARAMETERS_INCORRECT — предназначен для обозначения программистом некорректного набора входных параметров;
  • INIT_AGENT_NOT_SUITABLE — ошибки в работе программы при инициализации не возникло, но по каким-то причинам программа не подходит для проведения тестирования, например, недостаточно оперативной памяти, нет поддержки OpenCL и так далее.

Функция OnDeinit

Функция OnDeinit запускается, когда советник удаляется с графика, то есть прекращает работу. Обычно тут размещают процедуры очистки графика, сохранение статистики какой-то и так далее. Вот как она выглядит:

void  OnDeinit(const int  reason);

где reason — код причины деинициализации, который может принимать значения:

  • REASON_PROGRAM — эксперт прекратил свою работу, вызвав функцию ExpertRemove();
  • REASON_REMOVE — программа удалена с графика;
  • REASON_RECOMPILE — программа перекомпилирована;
  • REASON_CHARTCHANGE — символ или период графика был изменен;
  • REASON_CHARTCLOSE — график закрыт;
  • REASON_PARAMETERS — входные параметры были изменены пользователем;
  • REASON_ACCOUNT — активирован другой счет либо произошло переподключение  к торговому серверу вследствие изменения настроек счета;
  • REASON_TEMPLATE — применен другой шаблон графика;
  • REASON_INITFAILED — обработчик OnInit() вернул ненулевое значение;
  • REASON_CLOSE — терминал был закрыт.

Функция OnTick

Функция OnTick запускается в момент получения терминалом новой котировки. Выглядит она так:

void  OnTick(void);

Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, так как событие NewTick для них не генерируется.

Событие Tick генерируется только для экспертов, но это не означает, что эксперты обязаны иметь функцию OnTick(). Дело в том, что для экспертов генерируются не только события NewTick, но и события Timer, BookEvent и ChartEvent, о которых речь будет ниже.

Событие NewTick генерируется независимо от того, запрещена или разрешена авто-торговля (кнопка «Авто-торговля»). Запрет авто-торговли означает только запрет на отправку торговых запросов из эксперта, работа эксперта при этом не прекращается.

Функция OnTimer

Вызывается в экспертах при наступлении события Timer, генерируемого терминалом с заданным программистом интервалом:

void  OnTimer(void);

Событие Timer периодически генерируется клиентским терминалом для эксперта, который активизировал таймер при помощи функции EventSetTimer(). Обычно эта функция вызывается в функции OnInit(). При завершении работы эксперта нужно уничтожить созданный таймер при помощи EventKillTimer(), которую обычно вызывают в функции OnDeinit(). Каждый эксперт и каждый индикатор работают со своим таймером и получают события только от него.

Если необходимо получать события таймера чаще, чем один раз в секунду, можно использовать EventSetMillisecondTimer() для создания таймера в миллисекундах. В тестере стратегий используется минимальный интервал в 1000 миллисекунд. В общем случае при уменьшении периода таймера увеличивается время тестирования, так как возрастает количество вызовов обработчика событий таймера. При работе в режиме реального времени события таймера генерируются не чаще 1 раза в 10-16 миллисекунд, что связано с аппаратными ограничениями.

Для каждой программы может быть запущен только один таймер. Каждая MQL5-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события. Если в очереди уже есть событие Timer или это событие находится в состоянии обработки, то новое событие Timer в очередь mql5-программы не ставится.

Функция OnTrade

Вызывается в экспертах при наступлении события Trade. Функция предназначена для обработки изменений в списках ордеров, позиций и сделок:

void  OnTrade(void);

OnTrade() вызывается только для экспертов, в индикаторах и скриптах она игнорируется, даже если добавить в них функцию с таким именем и типом. При любом торговом действии (выставлении отложенного ордера, открытии/закрытии позиции, установке стопов, срабатывании отложенных ордеров и так далее) изменяется история ордеров и сделок или список позиций и текущих ордеров.

Функция OnTradeTransaction

Функция OnTradeTransaction вызывается в экспертах при наступлении события TradeTransaction и предназначена для обработки результатов выполнения торгового запроса:

void  OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result);

где trans — структура торговой транзакции, request — структура запроса и result — структура ответа.

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

Функция OnBookEvent

Функция OnBookEvent вызывается в индикаторах и экспертах при наступлении события BookEvent и предназначена для обработки изменений стакана цен:

void  OnBookEvent(const string&  symbol);

Чтобы получать события BookEvent по любому символу, сначала нужно подписаться на получение этих событий для этого символа с помощью функции MarketBookAdd(). Чтобы отписаться от получения события BookEvent по конкретному символу, нужно вызывать функцию MarketBookRelease().

Функция OnChartEvent

Функция OnChartEvent вызывается в экспертах и индикаторах при наступлении события ChartEvent и предназначена для обработки изменений графика, вызванных действиями пользователя или работой MQL5-программ:

void  OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam);

где id — идентификатор события, lparam — параметр события типа long, dparam — параметр события типа double, sparam — параметр события типа string. О типах мы будем говорить в следующем уроке.

Функция OnTester

Функция OnTester вызывается в экспертах при наступлении события Tester для выполнения необходимых действий при окончании тестирования:

double OnTester(void);

Функция OnTester() может быть использована только в экспертах при тестировании и предназначена в первую очередь для расчета некоторого значения, используемого в качестве критерия «Custom max» при оптимизации входных параметров. Тем не менее, никто не мешает вам написать в ней и какие-то другие операции, например, сохранять результаты тестирования в файл.

Функция OnTesterInit

Функция OnTesterInit вызывается в экспертах при наступлении события TesterInit для выполнения необходимых действий перед началом оптимизации в тестере стратегий:

int OnTesterInit(void);

Функция OnTesterInit() предназначена для инициализации эксперта перед началом оптимизации для последующей обработки результатов оптимизации. Всегда используется совместно с обработчиком OnTesterDeinit().

Функция OnTesterDeinit

Функция OnTesterDeinit вызывается в экспертах при наступлении события TesterDeinit для выполнения необходимых действий при окончании оптимизации эксперта:

void OnTesterDeinit(void);

Функция OnTesterPass

Функция OnTesterPass вызывается в экспертах при наступлении события TesterPass для обработки нового фрейма данных во время оптимизации эксперта:

void OnTesterPass(void);

Функция OnStart

Функция OnStart используется только в скриптах. В ней мы пишем все, что хотим от скрипта. После прикрепления на график сразу начинает выполняться функция OnStart. Как только она выполнится, скрипт удаляется с графика.

Функция OnCalculate

Вызывается только в индикаторах при наступлении события Calculate для обработки изменений ценовых данных. В ней, собственно, и содержится вся логика работы индикатора.

На этом на сегодня все, всем пока!

Тема на форуме

С уважением, Дмитрий аkа Silentspec
Tlap.com

Уроки по MQL5 , ,