Вы находитесь на странице: 1из 37

DREAM DRAW

LiteForex дарит дом твоей мечты, новенький внедорожник и еще 18 крутых гаджетов

Узнать больше

Главная /  Блог /  Начинающим /  Языки MQL4 и MQL5: отличия и особенности

Языки MQL4 и MQL5: отличия и особенности

Языки MetaQuotes Language 4 и 5 — средства разработки приложений под


03
MetaTrader Client Terminal на основе платформ семейства MetaTrader,
Дек.
соответственно, четвертой и пятой генерации. Предоставляют пользователям
2020
инструменты для разработки клиентских автоматических торговых стратегий.
17:15
В этой статье мы разберем:

Что такое MQL4 и MQL5


Возможности языков MQL4 и MQL5

Типы данных и синтаксис языков MQL4 и MQL5


Различия между языками MQL4 и MQL5
Как написать советник на MQL4 или MQL5

Недостатки и преимущества языков MQL4 и MQL5


Конвертация кода MQL4 в MQL5
FAQ по MQL4 и MQL5

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Я подготовил для вас подробный гайд по программированию MetaTrader на
языках MQL4 vs MQL5. После прочтения этого материала вы поймете что такое
MQL, в чем отличия между двумя последними версиями языков и как с ними
работать. Здесь вы найдете подробную инструкцию в картинках по
написанию торгового советника. Ну что, приступим!

Что такое MQL4 и MQL5


Во многом языки MQL4 и MQL5 очень похожи. Поэтому об отличиях мы
поговорим отдельно, а пока договоримся называть их оба “MQL” — в
единственном числе и без указания версии.

MQL — это встроенный в платформу MetaTrader язык программирования. Для


написания собственных торговых роботов, индикаторов или иных
приложений на MQL, а также их компиляции и отладки используется среда
разработчика MetaQuotes Language Editor, которая вместе со всей справочной
информацией поставляется вместе с установкой MetaTrader Client Terminal.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Если вы хотя бы однажды инвестировали в те или иные активы, может просто
покупали доллары, чтобы хранить в банке, то понимаете, что инвестиция
требует неустанного контроля. Готов биться об заклад, что вы не раз задавали
себе вопросы наподобие этих:

Не пора ли выйти из сделки, пока цена на пике?

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Как определить, будет ли цена на актив повышаться и дальше или рынок
развернется?

Может быть, в этот раз получен ложный сигнал и не нужно рисковать и


торопиться открывать позицию?
Нужно успевать следить за рынком — своевременно принимать торговые
решения. Желательно делать это круглосуточно в наиболее активные сессии.
Когда работа ведется с несколькими активами одновременно, ситуация еще
более усугубляется.

MQL позволяет реализовать любую торговую стратегию или алгоритм в виде


компьютерной программы. Затем эта программа запускается и работает на
рабочей станции в MetaTrader Client Terminal постоянно. Кроме того, в
комплект поставки входит ряд торговых роботов, индикаторов и скриптов от
разработчика платформы в виде исходных кодов, что существенно облегчает
освоение языка и присущих ему техник. Также MQL снабжен подробной
онлайн и оффлайн справочной информацией. Вокруг языка существует
огромное коммьюнити.

Допустим, вы придумали какой-то крутой индикатор или хитрый торговый


алгоритм, который хотите использовать в работе. А может, вы хотите
проанализировать рынок с помощью нейронных сетей? Нет никаких
ограничений. С помощью MQL вы можете реализовать любую идею в виде
индикатора, эксперта или иного приложения. Скомпилировать, отладить,
проверить на исторических данных в тестере стратегий — без вовлечения
финансовых рисков, и использовать в торговле.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом

Обобщаем! MQL решает проблему написания утилит для контроля состояния


торгового счета, расчетов индикаторов и уровней, получения торговых
сигналов и определения точек входа и выхода из рынка. Языковые средства

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
позволяют организовать торговому роботу или индикатору обмен
информацией с удаленным сервером по протоколу TCP, включая TLS
шифрование, или по протоколу HTTP. Возможна отправка push-уведомлений в
мобильные клиенты MetaTrader или на email пользователя, или данных по
FTP. Однажды хорошо написанная и отлаженная программа будет работать до
тех пор, пока вы не решите внести изменения или полностью заменить ее на
другую. За трейдером, то есть, за вами, остается только общий контроль.

История возникновения языков MQL4 и MQL5


MQL возник как эволюционное развитие платформы — инструмент для
автоматического управления торговыми счетами в MetaTrader. Не буду
подробно останавливаться на этом пункте, пройдусь поверхностно.

MetaQuotes релизнули MetaQuotes Language вместе с платформой MetaTrader,


которая до этого была приложением FXCharts. MQL вырос до второй версии
вместе с обновлением MetaTrader 3. Здесь MetaQuotes выкатили API, который
предоставлялся клиентам как дополнительный слой между MetaTrader Client и
MetaTrader Server.
Выпуск четвертой генерации платформы состоялся 01 июля 2005 года. Вместе
с ней увидел свет MQL4. Обратная совместимость с прошлой версией языка
была утрачена. Также MetaQuotes прекратили поддержку API клиентского
терминала, но расширили возможности самого языка и предоставили способы
интеграции пользовательских dll библиотек в приложения на MQL. API
остались доступны для только брокеров на уровне сервера, администрации и
менеджмента.

В июне 2010 года после многочисленных релизов состоялся запуск MetaTrader


5. MetaQuotes переработали логику торговли, сняли большинство
ограничений, обусловленных внутренним устройством платформы. Но до сих
пор MT5 по популярности не составляет конкуренцию четвертой генерации.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
В феврале 2014 года MQL4 обновился вместе с 600 билдом клиентского
терминала MT4. MetaQuotes доработали язык, внесли большинство фичей из
MQL5 и вместе с тем ускорили до уровня преемника.

Возможности языков MQL4 и MQL5


MQL используется для создания автоматических торговых стратегий. Код на
MQL предварительно интерпретируется в С++ код, который далее
компилируется в исполняемый код, который работает внутри терминала как
включаемая динамическая библиотека. Если мы проводить параллель с
предком, то это будет аналогично включению библиотеки dll в исполняемый
код основной программы. Такой подход способствует простоте разработки и
низкому порогу вхождения в сферу автоматического трейдинга. Язык
популярен в среде трейдеров, несмотря на его узкую специализацию и
зависимость языка от платформы.
MetaQuotes позаботились о своих пользователях и снабдили все свои
приложения подробной справочной информацией. Справочники для MQL4 и
MQL5 в виде htm файлов поставляются вместе с MetaEditor на нескольких
языках. Поэтому у вас всегда под рукой имеется подробное руководство с
примерами кода по реализации необходимого поведения.
Вокруг MQL сформировалось большое сообщество трейдеров и
программистов.  Существуют средства для облегчения коммуникации между
программистами и трейдерами. Уже образовался пласт готовых приложений
для упрощения процесса торговли. На ресурсе https://mql5.com существует
маркет для обмена приложениями на платной или бесплатной основе. В
торговый терминал интегрированы: магазин приложений, кодовая база,
статьи и сигналы от других трейдеров. Магазин приложений предлагает сотни
как платных так и бесплатных решений: индикаторы, советники, скрипты и
всевозможные утилиты. Это на случай, если проще приобрести уже готовую
программу, чем “изобретать свой велосипед”.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Но, если вы твердо решили самостоятельно освоить MQL и погрузиться в мир
создания собственных приложений, в этой статье я постараюсь осветить
основные нюансы, с которыми сталкивается начинающий, совершая первые
шаги в этом направлении. Продвинутый читатель вряд ли вы узнает что-то
новое из материала ниже.

Разработчики информационно поддерживают MQL сообщество, регулярно


выпуская туториалы в виде статей на разнообразные темы из мира торговли.
Авторы статей рассматривают новые техники программирования, например,
создание нейронных сетей, разбор и решение проблем и ограничений языка,
анализ и тестирование торговых стратегий, поиск и реализация новых
алгоритмов.
Мастер создания файлов предлагает 8 вариантов для MQL4 и 10 вариантов для
MQL5. Ниже представлены скриншоты мастера для обоих версий языка.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом

LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с


кодом

Рассмотрим наиболее популярные из них:

торговый робот;
индикатор;
скрипт;

включаемая библиотека mqh.


После компиляции эти приложения в виде исполняемого кода помещаются в
соответствующую директорию MetaTrader Client Terminal (Файл -> Открыть
каталог данных) (File -> Open Data Folder): Experts, Indicators, Scripts и т. д. И
далее после инициализации на графике запускаются в ответ на события,

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
генерируемые MetaTrader Client Terminal в процессе работы. События
являются триггером для запуска пользовательских программ и позволяют
отслеживать инициализацию и деинициализацию, получение новой
котировки, пользовательское событие на графике и так далее.
Кроме того, теперь появилась возможность создания приложений на Python,
соответственно, средства Python стали доступны в торговом терминале.
В справочнике MQL4 описаны следующие обработчики событий.

LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с


кодом

В MQL5 количество обработчиков было увеличено относительно


предыдущего поколения. Список теперь выглядит следующим образом:
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
В дальнейшем список событий был расширен. И теперь представляет
следующее:

LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с


кодом

Торговый робот или советник


В сообществе трейдеров также часто называется экспертом. Советник
прикрепляется на график в MetaTrader Client Terminal и работает постоянно,
пока работает торговый терминал и доступно подключение к торговому
серверу. Советники используются для реализации абсолютно любых торговых
стратегий, контроля за состоянием счета, проведения торговых операций при
определенных условиях, управления графическими объектами. Торговый
робот запускается на исполнение каждый раз при получении нового тика по

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
инструменту. Возможен запуск советника и в ответ на ряд других событий:
OnTimer, OnChartEvent, OnTesterTimer и др.

Советники используются для создания пользовательских интерфейсов.


Роботы, так же как и индикаторы, имеют доступ к графическими объектами.
Ниже приведен код простого торгового робота. Каждый новый тик по символу,
на графике которого работает советник, происходит проверка рыночных
сделок. Если сделка по символу уже есть, советник ждет ее закрытия. Если
сделки нет, то происходит открытие сделки в сторону противоположную
предыдущей сделки. Параметры советника: объем, уровни стоп-лосс и тейк-
профит — задаются пользователем. В момент первого запуска будет
совершена покупка валюты. После ее закрытия следующая откроется на
продажу, затем опять на покупку и так далее. В случае неудачной попытки
открыть сделку, советник записывает сообщение об ошибке в журнал и
засыпает на 60 секунд, затем попытка повторяется. Советник не проверяет на
корректность введенные пользователем параметры, поэтому внимательно
следите за их корректностью. Потенциальные проблемы, которые навскидку
видны сразу:

Не проверяется в целом возможность торговли. Она может быть


отключена пользователем в терминале или конкретно для этого
советника. Торговый сервер также может иметь ограничения на
автоматическую торговлю.
Объем может быть меньше меньшего или больше большего, а также
может не подходить, если на сервере есть ограничение на шаг объема.
Например, пользователь вводит 0.23 лота, а на сервере задано
минимальное изменение в 0.05 лота. В результате сделка не откроется и
функция OrderSend вернет ошибку.

Уровни стопов для сделки также не проверяются на корректность. Они


могут не вписываться в минимальное/максимальное допустимые

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
значения или не вписываться в ограничения, заданные уровнями
заморозки.
Простейший код, который может использоваться как заготовка для
реализации более масштабных решений.
Этот код компилируется и работает в MetaQuotes Language Editor 5 build 2375
31 March 2020.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом

Индикатор
Используется для вывода информации о ценовых данных, преобразованных
некоторым образом. Всевозможные осцилляторы, трендовые линии,
фракталы — все это индикаторы. Индикаторам доступны средства для работы
с графикой. В MQL4 их 6, а в MQL5 уже 18. Например, Moving Average
отображает некоторое усредненное и/или сглаженное ценовое значение за
период цен в прошлом и косвенно указывает будущее направление цены по
инструменту. Работает на графике постоянно. Обновление и пересчет
индикатора происходит каждый раз при поступлении тика по инструменту, на
графике которого работает индикатор, или при получении событий от
пользователя.
С любым индикатором внутри MetaTrader Client Terminal ассоциирован один
или несколько буферов, в который помещаются числовые данные. MQL4
предоставляет 32 буфера для одного индикатора, в MQL5 же позволяет
оперировать с 512.
Ниже приведен пример исходного кода индикатора Bears, который
предоставляется разработчиками платформы вместе с MetaTrader4.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом

Скрипт
Разработчики используют скрипты для создания алгоритмов, не требующих
обработки данных в режиме реального времени. Например, для выгрузки
статистических данных или вывода отладочной информации. Скрипты
отрабатывают один раз при присоединении к какому-либо графику по
событию OnStart — единственному, которое способен обработать скрипт.
На картинке ниже приведен код скрипта для закрытия всех рыночных ордеров
на счете. Скрипт обработает все ордера, независимо от того, на графике
какого символа он будет запущен. Отложенные ордера при этом
игнорируются.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Результатом запуска этого скрипта будет примерно следующий вывод в
журнал MetaTrader:
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Чтобы научить этот скрипт обрабатывать отложенные ордеры отдельно MQL4
нужно будет приложить больше усилий. Для начала создадим property, чтобы
скрипт мог показать окно со входными данными. Далее, добавим enum,
содержащий 3 варианта закрытия сделок скриптом: только рыночные ордеры,
только отложенные ордеры или все сделки, которые есть на счете данный
момент. Затем добавим массив для хранения тикетов отложенных ордеров и
заполним его соответствующим образом в первом цикле for. Теперь остается
обработать выбранный пользователем вариант закрытия сделок.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
В итоге у нас получился вот такой скрипт, который теперь не просто
закрывает все сделки, а учитывает при этом выбор пользователя.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом

Включаемая библиотека mqh


Используется, как можно понять из названия, для включения в остальные
типы программ для MetaTrader Client Terminal. Опытный разработчик имеет
набор собственных инструментов, которые могут многократно
переиспользоваться в различных приложениях.
В MetaQuotes Language Editor для этого требуется только указать путь до
включаемого заголовочного файла относительно расположения файла, в
который происходит включение. При компиляции программы MetaEditor
найдет этот файл и включит код из него вместо директивы #include. Теперь
весь код библиотеки может быть использован в приложении.

Аналогично программисты C и C++ повторно используют код, путем 


включения заголовочных файлов в свои проекты и линковкой с бинарными
файлами.

В примере ниже представлена максимально упрощенная интерпретация


динамического массива aka std::vector из стандартной C++ библиотеки. Этот
код компилируется и работает с MetaEditor version: 5.00 build 2375 31 March
2020.

LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с


кодом

Типы данных и синтаксис языков MQL4 и MQL5

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Типы данных и синтаксис языка унаследованы от C++. Код на MQL перед
компиляцией проходит препроцессинг и интерпретируется в
соответствующий код на C++, поэтому языковые конструкции, валидные в
предке, скорее всего скомпилируются и будут работать в MQL. Программист
знакомый с C, C++ или C# легко разберется с написанием кода на MQL.

Типы данных
В MQL существуют следующие фундаментальные типы данных:

булевы значения;

числа с плавающей запятой одинарной и двойной точности;


целые числа, также одинарной и двойной точности, со знаком и
беззнаковые;
char для хранения символьных данных;
перечисления enum, но enum class при этом не поддерживается;
структуры, классы и шаблоны классов.
При этом дополнительно существует поддержка color, string и datetime как
встроенных типов, что, конечно же, несколько упрощает жизнь разработчику.
Работа со этими типами организована в стиле C — с помощью глобальных
функций. Поведение MQL string в корне отличается от семейства шаблонов
std::string для C++03, не стоит их путать.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом

Синтаксис языков MetaQuotes


MQL обладает синтаксисом похожим на C++. Семантика предка стандарта
C++03 перешла в MQL с незначительными изменениями. Сейчас MQL по

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
уровню возможностей соответствует на уровне стандарту C++03.
Главное отличие MQL от C++ — разная семантика указателей. Если в C++ — это
виртуальный адрес, по которому находятся данные, то в MQL — это
дескриптор, аналог дескриптора стандарта POSIX, численный идентификатор,
некая обертка над “сырым” указателем, по которому существуют объекты
созданные в динамической памяти и связанные с этим идентификатором.
Оператор “стрелка” “->” для указателей MQL не поддерживается,
разыменование происходит с помощью оператора “точка” “.”. Дескриптор
точно также, как и указатель, должен быть удален после окончания работы
программы. При этом, если вы забудете уничтожить объект, на который
ссылается этот дескриптор, исполняемая среда сделает это за вас при
деинициализации программы.
В языке MQL отсутствуют понятия временной переменной и перемещения
данных. Передача переменных по ссылке и по значению имеет отличия от
C++. и осуществляется в MQL в своей манере. Любой сложный объект или
пользовательский класс будет передаваться в функцию по ссылке независимо
от того, используете вы оператор “амперсанд” или нет.
Существует ряд ограничений относительно предка. Вы не сможете писать
функции и шаблоны с переменным числом аргументов. Но, что
примечательно, ряд встроенных функций: iCustom, которую позже разберем в
этой статье, printf, StringFormat, PrintFormat — принимают переменное число
аргументов. Парадокс!
Работа со ссылками на данные и объекты различается в нюансах по
сравнению с C++, но они все легко устраняются с помощью сообщений от
компилятора. Есть различия в сигнатурах конструктора копирования и
оператора копирующего присваивания из-за различной семантики передачи
переменных по ссылке. Также в MQL отсутствует move-семантика
перемещения переменных и экземпляров объектов.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Различия между языками MQL4 и MQL5
Различия между языками MQL четвертой и пятой генерации обусловлены
различиями самих платформ MetaTrader4 и MetaTrader5. Многое за меня
скажет то, что с момента выпуска 600 билда MT4 для написания и компиляции
программ на MQL4 и MQL5 используется MetaQuotes Language Editor только
пятой версии. В частности, языки по-разному оперируют  торговыми
операциями, поскольку в пятой платформе больше режимов торговли и
разделены понятия ордер, сделка и позиция.
Отправка запросов теперь происходит только функцией OrderSend, в отличие
от четвертой версии, где используются отдельные функции для установки
модификации или удаления ордера.

  MQL4 MQL5

Таймфремы 9 (M1, M5, M15, M30, 21 (M1, M2, M3, M4, M5, M6,
H1, H4, D, W, MN) M10, M12, M15, M20, M30,
H1, H2, H3, H4, H6, H8, H12,
D1, W1, MN1)

Стили 6 18
рисования
DRAW_NONE DRAW_NONE
DRAW_LINE DRAW_LINE
DRAW_SECTION DRAW_SECTION

DRAW_HISTOGRAM DRAW_HISTOGRAM
DRAW_ARROW DRAW_HISTOGRAM2
DRAW_ZIGZAG DRAW_ARROW

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
С 600 билда DRAW_ZIGZAG
количество стало
DRAW_FILLING
соответствовать
пятой версии. DRAW_BARS

DRAW_CANDLES
DRAW_COLOR_LINE
DRAW_COLOR_SECTION
DRAW_COLOR_HISTOGRAM
DRAW_COLOR_HISTOGRAM2

DRAW_COLOR_ARROW
DRAW_COLOR_ZIGZAG
DRAW_COLOR_BARS
DRAW_COLOR_CANDLES

Событийная OnInit OnInit


модель
OnStart OnStart
запуска
OnDeinit OnDeinit
OnTick OnTick
OnCalculate OnCalculate

OnTimer OnTimer
OnChartEvent OnTrade
OnTester OnTradeTransaction
  OnBookEvent

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
OnChartEvent
OnTester
OnTesterInit

OnTesterDeinit
OnTesterPass

Торговля OrderSend OrderSend


OrderModify Одна функция для всех
операций. Требуемое
OrderDelete
поведение задается в
Поведение структуре
задается MqlTradeRequest. Ответ
отдельным возвращается в структуру
набором MqlTradeResult. Проще
параметров для проектировать
каждой из поведение, проверять
функций. результат и отлаживать
Затрудняет программу.
написание и
отладку программ.

Индикаторные 32 512
буферы
данных

Встроенные Количество: 30 Количество: 38


индикаторы
Индикаторы создаются с
помощью хендлов.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Уменьшено число
копирований и
потребление памяти.

Режимы Хеджирование Неттинг


торговли
Хеджирование
Биржевой

Средства Нет Есть


работы с
графикой
OpenCL и
DirectX

Генерация Нет Есть. При этом вы можете


торговых указывать кастомные
роботов модули сигналов.

Итак, отличий немного, но они есть. После обновления в 600 билде MQL4
отличается от MQL5 только в той части, где отличаются сами платформы. В
блоге LiteForex уже есть статья, посвященная сравнению 4 и 5 версий
MetaTrader, которую я категорически рекомендую к прочтению, если вы
желаете углубить свои знания в этой теме.

Как написать советник на MQL4 или MQL5


Прежде чем браться за написание эксперта, необходимо понимать, что у вас
уже должна существовать торговая стратегия. Только после этого можно

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
браться за воплощение идеи в виде формального алгоритма. Сам по себе код
только дает языковые инструменты для воплощения некой идеи.
Итак, первое, что нужно — рабочая торговая стратегия. Вопрос выработки
оной лежит вне рамок этой статьи, поэтому возьмем нечто простое для
примера. Допустим следующее. В периоды низкой активности инструмента
“на флете”, возможно открытие сделок в противоположные стороны с
небольшими уровнями лимитов. Это позволит использовать небольшие
движения бокового рынка и извлекать прибыль на этих движениях.
Напишем советника, который позволит автоматизировать ручное открытие
сделок и контроль за их лимитами и будем запускать его на торговом счете в
периоды флета.
Вначале процедура одна и та же вне зависимости от версии языка. Для
написания программ на MQL требуется установить торговый терминал
MetaTrader Client Terminal, в пакет поставки которого входит MetaEditor.
Теперь мы можем запустить MetaEditor напрямую из рабочего каталога
терминала, или через главное меню в торговом терминале: Tools и далее
MetaQuotes Language Editor (F4). В окне MetaEditor в главном меню нажимаем
на Файл -> Новый (File -> New).То же самое делает кнопка “Создать” (“New”) в
графическом меню.

Как написать торгового робота на MQL4


            В мастере создания приложений выбираем Советник (шаблон) (Expert
Advisor (template)) и “Далее” (“Next”).
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Далее вводим параметры, которые предоставляют пользователю интерфейс
для взаимодействия с нашей программой, и подтверждаем кликом на кнопку
ОК. Здесь мы добавим:
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
1 Инструмент для торговли

2 Выбор направления для первой сделки, которую откроет робот. Пока это
целочисленный тип, но позже мы исправим код таким образом, чтобы
можно было выбрать только Buy или Sell.

LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с


кодом
MetaEditor автоматически включит в код обработчик события OnTick.
Остальные нужно выбрать самостоятельно. Как видим, нам доступны
дополнительно OnTimer, вызывается каждый раз с периодичностью
установленной для таймера и OnChartEvent, которое будет вызвано в ответ на
действия пользователя с графиком. Здесь видно, что для MQL5 доступно
больше обработчиков.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Переходим далее и выбираем обработчики событий в режиме тестирования. В
MQL5 опять же возможно больше событий в режиме тестере, а
соответственно доступно больше обработчиков для них.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
На двух предыдущих шагах я оставил пустыми все варианты. У нас вся логика
будет выполняться в функции OnTick. Она вызывается каждый раз при
поступлении нового тика по символу.
После нажатия на кнопку “Готово” MetaEditor создаст для нас один файл
заготовку для будущего советника с заданным именем и параметрами. Также в
код будут включены выбранные обработчики событий. Я не буду подробно

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
останавливаться на каждом из них. Вся необходимая информация об этом
есть в справке.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Этот код уже можно скомпилировать и запустить в торговом терминале. Но
при этом происходить ничего не будет. У нас есть input переменные, но мы их
пока никак не используем. Функция OnInitвсегда сообщает терминалу об
успешной инициализации, а OnTickи OnDeinit— не содержат никаких
инструкций.
Приступаем к написанию кода.
Сперва приберемся. Удалим лишние пробелы и сократим комментарии до
одной строки. Затем определим enum TradeCmd(строки 11-14) для того, чтобы
указывать направление для первой сделки естественным образом, а не
числом. Изменяем тип input переменной FirstTradeDirectionс intна
TradeCmd(20). И создадим статическую глобальную переменную Direction с
типом TradeCmd, чтобы учитывать направление предыдущей сделки и менять
его на противоположное для следующей.
Также в мастере я вначале забыл добавить переменные для объема сделок,
уровней stoploss и takepro t. Добавляем их с ключевым словом input и
группируем с остальными внешними настройками.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Переходим к функции OnTick. Анализируем наличие открытых сделок. Для
этого перебираем все открытые сделки с помощью простого цикла в
диапазоне [0, TotalTrades) . Поочередно проверяем, что символ выбранной
сделки совпадает с тем, что указан в InputSymbol. Как только нашлась хотя бы

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
одна такая сделка, то делать ничего не требуется. И мы досрочно выходим из
функции OnTickс помощью return (строки 29-35). Ждем до следующего запуска.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
В противном случае требуется открыть сделку. Обратимся к документации
MQL4, чтобы правильно использовать функцию OrderSend, с помощью
который мы будем отправлять запрос на торговый сервер. Объявление
выглядит следующим образом:
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Рассмотрим параметры по порядку:

1 Символ. У нас он уже есть, но мы никак не проверяем корректность и


полагаемся только на корректный ввод от пользователя.

2 Направление сделки. Для этого мы используем глобальную статическую


переменную Direction.

3 Объем. Пользователь указывает его самостоятельно. Опять же, надо бы


проверить введенное значение на лимиты: минимум, максимум и
минимальный шаг изменения объема.

4 Цена. Ask, если покупаем, Bid, если продаем.

5 Проскальзывание. В нашем случае не имеет большого значения.


Установим в 2 пипса.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
6 Стоп Лосс. Опять же зависит от направления сделки. Должен быть меньше
цены открытия, если покупаем, и больше цены открытия, если мы
продаем.

7 Тейкпрофит. Как и стоплосс зависит от направления сделки.

Остальные 4 параметра со значением по умолчанию нас пока не интересуют.


В итоге, для открытия сделки у нас есть: объем InputVolume, направление
сделки Direction, символ InputSymbol, проскальзывание установим равным 1
пункту. А рассчитать нам нужно в зависимости от Direction: цену открытия
price, стоп лосс sl и тейкпрофит tp. Если покупаем, то цена аск, стоплосс ниже
текущей цены, тейк профит — выше, а иначе, если продаем, то цена bid, стоп
лосс выше текущей цены, а тейк профит — ниже. Также нам потребуются 2
дополнительные переменные. Для конвертации уровня лимитов из пунктов в
номинальные значения point — минимальное значение, на которое может
измениться котировка по символу. Для нормализации значений с плавающей
точкой digit — количество значащих разрядов в дробной части котировки.

“Переводим” это на MQL.


LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Переходим непосредственно к открытию сделки. Обнуляем системную
переменную _LastError встроенной функцией ResetLastError. Отправляем
запрос с помощью OrderSend, а результат запишем в переменную result.
Существует два варианта развития событий:

1 Сделка успешно открылась, если resultсодержит значение больше нуля —


тикер сделки. А значит нам нужно изменить значение Direction, чтобы в
следующий раз открыть сделку в противоположную сторону.
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
2 Если resultсодержит отрицательное значение, то сделка не была открыта.
Нужно проверить последнюю ошибку с помощью GetLastError,
проанализировать ее и что-то предпринять: повторить попытку, заснуть
на некоторое время, вывести отладочную информацию в лог и т.п. Я для
простоты вывел значение последней ошибки в лог.

Смотрим.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Итак, мы написали буквально несколько десятков строк кода и торговый робот
готов. Признаю, он пока малофункционален, но может служить отличным
примером того, что написание кода не требует “многих знаний” и
значительных усилий.
Привожу полный листинг, вдруг окажется полезен.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Компилируем код и запускаем советник в торговом терминале.

Как написать советник на MQL5


            MQL5 здесь имеет перед MQL4 неоспоримое преимущество. Вы можете
создать торгового робота для пятой версии в несколько кликов, не написав
фактически ни одной строки кода.
            В MetaEditor нажимаем на кнопку “Создать” (“New”). И в мастере
создания приложений выбираем “Советник (сгенерировать)” (“Expert Advisor
(generate)”).

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Назовем нашего эксперта MQL5_Generated_Robot. Опционально указываем
автора и его веб-сайт или профиль. Добавляем по необходимости параметры
советника: символ и таймфрейм для торговли. Двойной клик активирует
параметр, клик на названии или на значении переменной позволяет
изменить предложенные умолчания. Символ можно установить любой
желаемый. Я определил его как текущий, на графике которого будет работать
советник. И таймфрейм установил M15, чтобы повысить вероятность
появления торговых сигналов.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Переходим далее. И теперь нам нужно выбрать сигнал и настройки для него.
Здесь можно поимпровизировать и попробовать разные комбинации из
сигналов, предложенных разработчиками. Эти сигналы будут генерировать
для эксперта события на совершение сделок.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Вы можете добавлять пользовательские сигналы в эту секцию, в том числе из
мониторинга на ресурсе mql5.com. По умолчанию вместе с платформой
предоставляются следующие варианты:
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Я выбрал “Торговля на пересечении двух средних” и установил периоды
равными 21 и 55. Слишком короткие периоды выбирать нежелательно, если
нужно сократить число ложных срабатываний. Символ оставляем текущий —
мы будем торговать, например, EURJPY и получать сигналы от скользящих

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
средних примененных к ценовым данным того же EURJPY. Выбирайте здесь
другой символ, если ваша стратегия подразумевает торговлю по инструменту
в зависимости от поведения какого-то иного. Таймфрейм также оставляю M15.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Подтверждаем. Видим, что добавился сигнал по текущему символу и
таймфрейму, который и будет генерировать события для эксперта.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Переходим далее к настройке режима Трейлинг-стопа для наших сделок.
Здесь я выбрал фиксированный размер лимитов. 150 пунктов стоплосса и 200
тейкпрофит.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Далее нам предлагают выбрать один пяти режимов управления капиталом
торгового счета. Доступна торговля:

фиксированным объемом;
фиксированным размером залога;
фиксированным риском;
минимально возможным объемом;
оптимизированным объемом позиции.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Я остановился на фиксированном риске в 1% от средств на счете.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Нажимаем “Готово” (“Done”)... Pro t! Мы создали эксперта, не написав ни одной
строчки кода.
Рассмотрим подробнее и проведем небольшой анализ исходников
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Шапка и атрибуты — все как обычно. Затем идет включение библиотечных
модулей. Expert — наш робот. MACross — генератор сигналов пересечения
Moving Average, TrailingFixedPips — модуль контроля уровня лимитов,
MoneyFixedRisk — модуль риск-менеджмента. И далее настройки — input
переменные, определяющие интерфейс для взаимодействия с приложением.
Выглядит знакомо, не так ли? Все правильно! Их мы и задавали в мастере
генерации эксперта. В будущем значения по-умолчанию могут быть изменены
здесь.
Дальше объявлена автоматическая глобальная переменная типа CExpert,
которая проинициализирована дефолтным значением. Для объекта это
означает, что был вызван конструктор по-умолчанию. В теле OnInit
происходит инициализация советника, создание сигналов и фильтров и их
инициализация заданными в настройках значениями. Ниже привожу код, из
которого я убрал все проверки результатов инициализации на успех и
дескрипторов на валидность, чтобы визуально сократить объем кода.

LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с


кодом

Ниже расположены функции OnDeinit, OnTick, OnTimer, OnTrade. В каждой из


них просто вызывается соответствующий метод класса CExpert.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Если внимательно присмотреться, в навигаторе слева в Папке Include ->
Experts видны доступные в генераторе сигналы и модули. Соответственно, вы
можете добавлять какие-то специализированные решения в генератор. И
создавать под любые нужды в несколько кликов.
Давайте попробуем скомпилировать код. 0 ошибок, 0 предупреждений — это
успех. И запускаем в режиме тестирования стратегий Ctrl + F5 или кнопкой в
графическом меню сверху.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Управление переходит в MetaTrader Client Terminal в настройки тестера
стратегий. Затем мы выбираем файл, который будем тестировать.
Настраиваем остальные параметры: символ, таймфрейм, глубину
истории, баланс и плечо торгового счета и пр. Настроек много и для каждой из
них есть описание в файле справки. Для вызова справки установите фокус на
тестер и нажмите F1 для получения подробной информации о настройках и
режимах тестирования.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Для запуска нажимаем кнопку “Старт” (“Start”) в правом нижнем углу тестера и,
если тестирование происходит без оптимизации, то вы можете выбрать
режим визуализации вашей стратегии.
Разработчики любезно предоставили описание для каждого встроенного
модуля и сигнала. https://www.mql5.com/ru/docs/standardlibrary/expertclasses.
Не ленитесь обратиться к документации лишний раз, чтобы расширить свои
знания в вопросе.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Недостатки и преимущества языков MQL4 и MQL5
            Главный недостаток кроется в самом предназначении этих языков.
MetaQuotes Querying Language — язык для написания приложений только для
MetaTrader. Компилировать и отлаживать код на MQL возможно только в
среде MetaEditor. Запускать на исполнение программы способен только
MetaTrader Client Terminal. Отсутствует ручное управление памятью. Вы по-
прежнему выбираете, где создать переменную — на стеке или в динамической
области, но в любом из этих случаев у вас нет доступа к ее виртуальному
адресу.
Достоинств же у него куда больше. Низкий порог вхождения, особенно если
уже имеется опыт разработки на языках со статической типизацией. Высокая
производительность на уровне C и C++. Поддержка объектно-
ориентированного стиля программирования: инкапсуляция и расширяемость,
наследование, полиморфизм и виртуальные методы классов. Возможно
создание шаблонов классов и функций, то есть параметрическая
полиморфность. Все это позволяет многократно переиспользовать код.
Бесплатная инфраструктура — торговый терминал, среда разработки, тестер
стратегий, включаемые библиотеки.

Конвертация кода MQL4 в MQL5


            Рассмотрим преобразование обновление программы одной версии в
другую на примере робота, который ранее уже приводился в этой статье в
разделе о возможностях языка . Создаем пустой эксперт в MetaEditor 5 и
копируем в него исходный код советника MQL4_Example_EA. Скомпилировать
этот код без изменений не получится. При попытке мы получаем множество
ошибок.
            Начинаем по порядку. Вначале практически ничего не меняется, кроме
пары нюансов:

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
1 Убираем #property strict из директив препроцессора, потому она имеет
смысл при компиляции MQL4 кода.

2 Переносим создание статической переменной Direction выше функции


инициализации эксперта, чтобы инициализировать ее в OnInit особым
образом, в зависимости от имеющихся позиций. Это позволит в будущем
изменять настройки советника на лету в середине торгового процесса.

Заметьте, что выбрать сделку по какому-либо символу в MQL5 стало проще с


помощью встроенной функции PositionSelect, не прибегая к перебору всех
открытых сделок.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Функцию OnTick привожу полностью. Используем PositionSelectдля проверки
наличия открытой позиции по символу. Если такой нет, то заходим внутрь
тела if и готовимся к отправке запроса на открытие сделки. MQL5 нам любезно
предоставляет структуру MqlTradeRequestдля создания запроса в противовес
вороху параметров в MQL4. Я не буду сейчас рассматривать каждое ее поле в
отдельности. Замечу лишь, что также как в MQL4 у нас есть 4 из 7
необходимых параметров: символ сделки, объем, направление и отклонение
от запрашиваемой цены. Оставшиеся три: цену открытия, стоплосс и
тейкпрофит мы вычисляем в зависимости от направления сделки. Заполняем
структуру по порядку. Видим также, что теперь не требуется нормализация
чисел с плавающей точкой, поэтому отсутствует необходимость в переменной
digit.
Отправка запроса в последней версии языка выглядит намного лаконичнее.
Вся информация о результате выполнения функции OrderSend теперь
возвращается нам в MqlTradeResult.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
У меня получился следующий код после отладки и серии тестов. Размер
программы не изменился, хотя мы и сделали изменение в логике,
потребовавшее дополнительных действий на этапе инициализации в OnInit.
LiteForex: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с
кодом
Резюмируем. Апгрейд приложений из MQL4 в MQL5 происходит просто. При
наличии базовых знаний MQL не составит труда сделать его самостоятельно.
Специально для вас, я подобрал далее ряд наиболее распространенных
вопросов по MQL и постарались кратко, но в то же время обстоятельно и
доходчиво на них ответить.

FAQ по MQL4 и MQL5

Что такое mql4? +


Как написать код на mql4? +
Как преобразовать файл ex4 в mq4? +
Как защитить mql4? +
Что такое MQL5? +
Как писать код MQL5? +
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Как скачать индикатор из mql5? +
Можно ли использовать mql5 в MetaTrader 4? +
Как использовать iCustom mql4? +
На каком языке основывается mql4? +
Насколько похожи коды программ mql4 и mql5? +
Как преобразовать mql4 в mql5? +

P.S. Понравилась моя статья? Поделись ей в соцсетях, это лучшее спасибо :)


Задавайте мне вопросы и комментируйте материал ниже. С удовольствием
отвечу и дам необходимые пояснения.
Полезные ссылки:

Торговлю с проверенным брокером рекомендую попробовать тут.


Система позволяет торговать самостоятельно или копировать сделки
успешных трейдеров со всего мира.
Воспользуйтесь моим промокодом BLOG для получения бонуса 50% на
депозит от LiteForex. Промокод нужно просто ввести в соответствующее

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
поле при пополнении счета в платформе LiteForex и бонус зачислится
одновременно с депозитом.
Чат трейдеров в телеграм: https://t.me/marketanalysischat. Делимся
сигналами и опытом.
Канал в телеграм с отличной аналитикой, форекс обзорами, обучающими
статьями и прочими полезностями для трейдеров:
https://t.me/forexandcryptoanalysis
Языки MQL4 и MQL5: отличия и особенности

Содержание данной статьи является исключительно частным мнением


автора и может не совпадать с официальной позицией LiteForex.
Материалы, публикуемые на данной странице, предоставлены
исключительно в информационных целях и не могут рассматриваться как
инвестиционный совет или консультация для целей Директивы 2004/39
/EC.

Оцените данную статью:

{{value}} ( {{count}} {{title}} )

Появились вопросы к автору? Вы можете обсудить их в комментариях .

Начать торговлю
Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Нет возможности читать нас каждый день? Получайте свежие статьи на вашу
электронную почту.
ФИО

Peter Smith Johnson

Email

example@example.com

Подписаться

Facebook Twitter Blogger Telegram WhatsApp E-mail

Vkontakte Еще...

НАПИСАЛ Михаил Чистюхин


Разработчик MQL, С++. Проектировщик ПО.

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Что еще почитать?
Что такое MetaTrader?
30 Дек. 2020 17:43

Что такое MetaTrader?


Подробно о том, что такое MetaTrader и как использовать эту платформу в
торговле на Форекс

Типы ордеров: Buy/Sell, Limit, Stop, Stop-Limit


08 Дек. 2020 17:03

Типы ордеров: Buy/Sell, Limit, Stop, Stop-Limit


Все что вы хотели знать об ордерах в одной статье. В каких случаях
использовать Limit, Stop и Stop-Limit ордера? Лучшие практики и примеры!
Читайте здесь!

Что дальше?

Я попробую применить полученные знания на демо-счете, доступном без регистрации

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
Покажите мне графики валют и как цена на рынке двигается в реальном времени

Я хочу начать копировать сделки профессиональных трейдеров на мой счет

Предупреждение о рисках: Торговля на финансовых рынках сопряжена с риском. Контракты на разницу


("CFDs") являются сложными финансовыми инструментами, используемыми для маржинальной
торговли. Торговля CFD имеет высокий уровень риска, так как кредитное плечо может работать как в
Вашу Япользу,
готов так и против
начать Вас. Вследствие
зарабатывать этого торговля
на финансовых CFD и
рынках подходит не всем
хочу открыть инвесторам
торговый из-за
счет
высокого риска потери инвестированного капитала. Вы не должны рисковать большими средствами,

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD
чем Вы готовы потерять. Перед началом торговли Вы должны убедиться, что Вы понимаете все риски и
учитываете их в совокупности с уровнем Вашего опыта при постановке Ваших инвестиционных целей.
Перейти к полному документу "Предупреждение о рисках".

Условия использования информации

Конфиденциальность

Предупреждение о рисках

Политика AML/KYC

Отзыв

Данный веб-сайт является собственностью группы компаний LiteForex.

LiteForex Investments Limited, зарегистрированная на Маршалловых островах


под номером 63888 и регулируемая в соответствии Marshall Islands Business
Corporation Act. Адрес компании: Ajeltake Road, Ajeltake Island, Majuro, Marshall
Islands MH96960 (предназначен исключительно для организации юридических
процессов, получения уведомлений или требований и не является рабочим
адресом юридического лица). Email: clients@liteforex.com

LiteForex Investments Limited не предоставляет сервис резидентам стран Европейской Экономической


Зоны (ЕЭЗ), США, Израиля и Японии.

Copyright © 2005-2021 LiteForex.com

Create PDF in your applications with the Pdfcrowd HTML to PDF API PDFCROWD