Приветствую вас, друзья! Эта серия уроков направлена на новичков, которые вообще никогда не программировали. Для тех, кто пробовал, знает уже какой-то язык, особенно Си и mql4, многие из этих уроков будут простыми.
В первом уроке мы рассмотрим отличия MQL5 от 4 версии, устройство редактора кода MetaEditor 5 и основные функции устройства MQL-программ.
Что такое 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
Центовые счета
Быстрый ввод и вывод
Платформа CopyFx для копирования сигналов
Отличное исполнение
На рынке с 1998 года
Низкие спреды
Быстрый ввод и вывод
Хорошее исполнение
Множество способов пополнения
С 2007 года на рынке
Счета Zero с нулевыми спредами
Система Копи-трейдинга
Хорошее исполнение
Более 500 торговых инструментов
Комиссия на пополнение 0%
Лицензия ЦБ РФ
Удобный ввод и вывод средств
Подходит для крупных трейдеров
Крупнейший форекс дилер в России
Компания – налоговый агент, выплата налогов без участия клиента
Торговля через MetaTrader 5
Форекс, фондовые индексы и нефть
Низкие спреды
Хорошее исполнение
Подходит для торговли советниками
Торговля криптовалютами
Центовые счета со стартовым лотом 0.01
Система копирования сделок Share4You
Низкие спреды
Подходит для новичков
Лучшие на рынке условия для работы с сеточниками и мартингейлом
Исполнение без вмешательства дилинга
Низкие спреды
Трейдинг Forex, CFD и Crypto
Полная прозрачность работы
Множество представительств компании, в том числе в Великобритании
На рынке с 2006 года
| ||
| ||
| ||
| ||
| ||
| ||
|