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

Топ Брокеров 2025 по версии TLAP

  • На рынке с 1998 года

  • Низкие спреды

  • Быстрый ввод и вывод

  • Хорошее исполнение

  • Множество способов пополнения

  • С 2007 года на рынке

  • Счета Zero с нулевыми спредами

  • Система Копи-трейдинга

  • Хорошее исполнение

  • Более 500 торговых инструментов

  • Комиссия на пополнение 0%

  • Лицензия ЦБ РФ

  • Удобный ввод и вывод средств

  • Подходит для крупных трейдеров

  • Крупнейший форекс дилер в России

  • Компания – налоговый агент, выплата налогов без участия клиента

  • Торговля через MetaTrader 5

  • Центовые счета со стартовым лотом 0.01

  • Система копирования сделок Share4You

  • Низкие спреды

  • Подходит для новичков

  • Лучшие на рынке условия для работы с сеточниками и мартингейлом

  • Исполнение без вмешательства дилинга

  • Низкие спреды

  • Трейдинг Forex, CFD и Crypto

  • Полная прозрачность работы

  • Множество представительств компании, в том числе в Великобритании

  • На рынке с 2006 года

Уроки по MQL5 , ,