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

В этой статье мы разберем:


Я подготовил для вас подробный гайд по программированию MetaTrader на языках MQL4 vs MQL5. После прочтения этого материала вы поймете что такое MQL, в чем отличия между двумя последними версиями языков и как с ними работать. Здесь вы найдете подробную инструкцию в картинках по написанию торгового советника. Ну что, приступим!

Что такое MQL4 и MQL5

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

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

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

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

  • Не пора ли выйти из сделки, пока цена на пике?
  • Как определить, будет ли цена на актив повышаться и дальше или рынок развернется?
  • Может быть, в этот раз получен ложный сигнал и не нужно рисковать и торопиться открывать позицию?

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

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

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

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

Обобщаем! MQL решает проблему написания утилит для контроля состояния торгового счета, расчетов индикаторов и уровней, получения торговых сигналов и определения точек входа и выхода из рынка. Языковые средства позволяют организовать торговому роботу или индикатору обмен информацией с удаленным сервером по протоколу 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 по популярности не составляет конкуренцию четвертой генерации.

В феврале 2014 года MQL4 обновился вместе с 600 билдом клиентского терминала MT4. MetaQuotes доработали язык, внесли большинство фичей из MQL5 и вместе с тем ускорили до уровня преемника.

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

MQL используется для создания автоматических торговых стратегий. Код на MQL предварительно интерпретируется в С++ код, который далее компилируется в исполняемый код, который работает внутри терминала как включаемая динамическая библиотека. Если мы проводить параллель с предком, то это будет аналогично включению библиотеки dll в исполняемый код основной программы. Такой подход способствует простоте разработки и низкому порогу вхождения в сферу автоматического трейдинга. Язык популярен в среде трейдеров, несмотря на его узкую специализацию и зависимость языка от платформы.

MetaQuotes позаботились о своих пользователях и снабдили все свои приложения подробной справочной информацией. Справочники для MQL4 и MQL5 в виде htm файлов поставляются вместе с MetaEditor на нескольких языках. Поэтому у вас всегда под рукой имеется подробное руководство с примерами кода по реализации необходимого поведения.

Вокруг MQL сформировалось большое сообщество трейдеров и программистов.  Существуют средства для облегчения коммуникации между программистами и трейдерами. Уже образовался пласт готовых приложений для упрощения процесса торговли. На ресурсе https://mql5.com существует маркет для обмена приложениями на платной или бесплатной основе. В торговый терминал интегрированы: магазин приложений, кодовая база, статьи и сигналы от других трейдеров. Магазин приложений предлагает сотни как платных так и бесплатных решений: индикаторы, советники, скрипты и всевозможные утилиты. Это на случай, если проще приобрести уже готовую программу, чем “изобретать свой велосипед”.

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

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

Мастер создания файлов предлагает 8 вариантов для MQL4 и 10 вариантов для MQL5. Ниже представлены скриншоты мастера для обоих версий языка.

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

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

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

  • торговый робот;
  • индикатор;
  • скрипт;
  • включаемая библиотека mqh.

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

Кроме того, теперь появилась возможность создания приложений на Python, соответственно, средства Python стали доступны в торговом терминале.

В справочнике MQL4 описаны следующие обработчики событий.

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

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

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

В дальнейшем список событий был расширен. И теперь представляет следующее:

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

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

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

Советники используются для создания пользовательских интерфейсов. Роботы, так же как и индикаторы, имеют доступ к графическими объектами.

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

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

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

Этот код компилируется и работает в MetaQuotes Language Editor 5 build 2375 31 March 2020.

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

Индикатор

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

С любым индикатором внутри MetaTrader Client Terminal ассоциирован один или несколько буферов, в который помещаются числовые данные. MQL4 предоставляет 32 буфера для одного индикатора, в MQL5 же позволяет оперировать с 512.

Ниже приведен пример исходного кода индикатора Bears, который предоставляется разработчиками платформы вместе с MetaTrader4.

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

Скрипт

Разработчики используют скрипты для создания алгоритмов, не требующих обработки данных в режиме реального времени. Например, для выгрузки статистических данных или вывода отладочной информации. Скрипты отрабатывают один раз при присоединении к какому-либо графику по событию OnStart — единственному, которое способен обработать скрипт.

На картинке ниже приведен код скрипта для закрытия всех рыночных ордеров на счете. Скрипт обработает все ордера, независимо от того, на графике какого символа он будет запущен. Отложенные ордера при этом игнорируются.

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

Результатом запуска этого скрипта будет примерно следующий вывод в журнал MetaTrader:

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

Чтобы научить этот скрипт обрабатывать отложенные ордеры отдельно MQL4 нужно будет приложить больше усилий. Для начала создадим property, чтобы скрипт мог показать окно со входными данными. Далее, добавим enum, содержащий 3 варианта закрытия сделок скриптом: только рыночные ордеры, только отложенные ордеры или все сделки, которые есть на счете данный момент. Затем добавим массив для хранения тикетов отложенных ордеров и заполним его соответствующим образом в первом цикле for. Теперь остается обработать выбранный пользователем вариант закрытия сделок.

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

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

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

Используется, как можно понять из названия, для включения в остальные типы программ для MetaTrader Client Terminal. Опытный разработчик имеет набор собственных инструментов, которые могут многократно переиспользоваться в различных приложениях.

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

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

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

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

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

Типы данных и синтаксис языка унаследованы от C++. Код на MQL перед компиляцией проходит препроцессинг и интерпретируется в соответствующий код на C++, поэтому языковые конструкции, валидные в предке, скорее всего скомпилируются и будут работать в MQL. Программист знакомый с C, C++ или C# легко разберется с написанием кода на MQL.

Типы данных

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

  • булевы значения;
  • числа с плавающей запятой одинарной и двойной точности;
  • целые числа, также одинарной и двойной точности, со знаком и беззнаковые;
  • char для хранения символьных данных;
  • перечисления enum, но enum class при этом не поддерживается;
  • структуры, классы и шаблоны классов.

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

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

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

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

Главное отличие MQL от C++ — разная семантика указателей. Если в C++ — это виртуальный адрес, по которому находятся данные, то в MQL — это дескриптор, аналог дескриптора стандарта POSIX, численный идентификатор, некая обертка над “сырым” указателем, по которому существуют объекты созданные в динамической памяти и связанные с этим идентификатором. Оператор “стрелка” “->” для указателей MQL не поддерживается, разыменование происходит с помощью оператора “точка” “.”. Дескриптор точно также, как и указатель, должен быть удален после окончания работы программы. При этом, если вы забудете уничтожить объект, на который ссылается этот дескриптор, исполняемая среда сделает это за вас при деинициализации программы.

В языке MQL отсутствуют понятия временной переменной и перемещения данных. Передача переменных по ссылке и по значению имеет отличия от C++. и осуществляется в MQL в своей манере. Любой сложный объект или пользовательский класс будет передаваться в функцию по ссылке независимо от того, используете вы оператор “амперсанд” или нет.

Существует ряд ограничений относительно предка. Вы не сможете писать функции и шаблоны с переменным числом аргументов. Но, что примечательно, ряд встроенных функций: iCustom, которую позже разберем в этой статье, printf, StringFormat, PrintFormat — принимают переменное число аргументов. Парадокс!

Работа со ссылками на данные и объекты различается в нюансах по сравнению с C++, но они все легко устраняются с помощью сообщений от компилятора. Есть различия в сигнатурах конструктора копирования и оператора копирующего присваивания из-за различной семантики передачи переменных по ссылке. Также в MQL отсутствует move-семантика перемещения переменных и экземпляров объектов.

Различия между языками MQL4 и MQL5

Различия между языками MQL четвертой и пятой генерации обусловлены различиями самих платформ MetaTrader4 и MetaTrader5. Многое за меня скажет то, что с момента выпуска 600 билда MT4 для написания и компиляции программ на MQL4 и MQL5 используется MetaQuotes Language Editor только пятой версии. В частности, языки по-разному оперируют  торговыми операциями, поскольку в пятой платформе больше режимов торговли и разделены понятия ордер, сделка и позиция.

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

 

MQL4

MQL5

Таймфремы

9 (M1, M5, M15, M30, H1, H4, D, W, MN)

21 (M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1)

Стили рисования

6

DRAW_NONE

DRAW_LINE

DRAW_SECTION

DRAW_HISTOGRAM

DRAW_ARROW

DRAW_ZIGZAG

С 600 билда количество стало соответствовать пятой версии.

18

DRAW_NONE

DRAW_LINE

DRAW_SECTION

DRAW_HISTOGRAM

DRAW_HISTOGRAM2

DRAW_ARROW

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

OnStart

OnDeinit

OnTick

OnCalculate

OnTimer

OnChartEvent

OnTester

 

OnInit

OnStart

OnDeinit

OnTick

OnCalculate

OnTimer

OnTrade

OnTradeTransaction

OnBookEvent

OnChartEvent

OnTester

OnTesterInit

OnTesterDeinit

OnTesterPass

Торговля

OrderSend

OrderModify

OrderDelete

Поведение задается отдельным набором параметров для каждой из функций. Затрудняет написание и отладку программ.

OrderSend

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

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

32

512

Встроенные индикаторы

Количество: 30

Количество: 38

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

Режимы торговли

Хеджирование

Неттинг

Хеджирование

Биржевой

Средства работы с графикой OpenCL и DirectX

Нет

Есть

Генерация торговых роботов

Нет

Есть. При этом вы можете указывать кастомные модули сигналов.

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

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

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

Итак, первое, что нужно — рабочая торговая стратегия. Вопрос выработки оной лежит вне рамок этой статьи, поэтому возьмем нечто простое для примера. Допустим следующее. В периоды низкой активности инструмента “на флете”, возможно открытие сделок в противоположные стороны с небольшими уровнями лимитов. Это позволит использовать небольшие движения бокового рынка и извлекать прибыль на этих движениях.

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

Вначале процедура одна и та же вне зависимости от версии языка. Для написания программ на MQL требуется установить торговый терминал MetaTrader Client Terminal, в пакет поставки которого входит MetaEditor. Теперь мы можем запустить MetaEditor напрямую из рабочего каталога терминала, или через главное меню в торговом терминале: Tools и далее MetaQuotes Language Editor (F4). В окне MetaEditor в главном меню нажимаем на Файл -> Новый (File -> New).То же самое делает кнопка “Создать” (“New”) в графическом меню.

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

            В мастере создания приложений выбираем Советник (шаблон) (Expert Advisor (template)) и “Далее” (“Next”).

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

Далее вводим параметры, которые предоставляют пользователю интерфейс для взаимодействия с нашей программой, и подтверждаем кликом на кнопку ОК. Здесь мы добавим:

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

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

MetaEditor автоматически включит в код обработчик события OnTick. Остальные нужно выбрать самостоятельно. Как видим, нам доступны дополнительно OnTimer, вызывается каждый раз с периодичностью установленной для таймера и OnChartEvent, которое будет вызвано в ответ на действия пользователя с графиком. Здесь видно, что для MQL5 доступно больше обработчиков.

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

Переходим далее и выбираем обработчики событий в режиме тестирования. В MQL5 опять же возможно больше событий в режиме тестере, а соответственно доступно больше обработчиков для них.

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

На двух предыдущих шагах я оставил пустыми все варианты. У нас вся логика будет выполняться в функции OnTick. Она вызывается каждый раз при поступлении нового тика по символу.

После нажатия на кнопку “Готово” MetaEditor создаст для нас один файл заготовку для будущего советника с заданным именем и параметрами. Также в код будут включены выбранные обработчики событий. Я не буду подробно останавливаться на каждом из них. Вся необходимая информация об этом есть в справке.

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

Этот код уже можно скомпилировать и запустить в торговом терминале. Но при этом происходить ничего не будет. У нас есть input переменные, но мы их пока никак не используем. Функция OnInitвсегда сообщает терминалу об успешной инициализации, а OnTickи OnDeinit— не содержат никаких инструкций.

Приступаем к написанию кода.

Сперва приберемся. Удалим лишние пробелы и сократим комментарии до одной строки. Затем определим enum TradeCmd(строки 11-14) для того, чтобы указывать направление для первой сделки естественным образом, а не числом. Изменяем тип input переменной FirstTradeDirectionс intна TradeCmd(20). И создадим статическую глобальную переменную Direction с типом TradeCmd, чтобы учитывать направление предыдущей сделки и менять его на противоположное для следующей.

Также в мастере я вначале забыл добавить переменные для объема сделок, уровней stoploss и takeprofit. Добавляем их с ключевым словом input и группируем с остальными внешними настройками.

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

Переходим к функции OnTick. Анализируем наличие открытых сделок. Для этого перебираем все открытые сделки с помощью простого цикла в диапазоне [0, TotalTrades) . Поочередно проверяем, что символ выбранной сделки совпадает с тем, что указан в InputSymbol. Как только нашлась хотя бы одна такая сделка, то делать ничего не требуется. И мы досрочно выходим из функции OnTickс помощью return (строки 29-35). Ждем до следующего запуска.

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

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

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

Рассмотрим параметры по порядку:

  1. Символ. У нас он уже есть, но мы никак не проверяем корректность и полагаемся только на корректный ввод от пользователя.
  2. Направление сделки. Для этого мы используем глобальную статическую переменную Direction.
  3. Объем. Пользователь указывает его самостоятельно. Опять же, надо бы проверить введенное значение на лимиты: минимум, максимум и минимальный шаг изменения объема.
  4. Цена. Ask, если покупаем, Bid, если продаем.
  5. Проскальзывание. В нашем случае не имеет большого значения. Установим в 2 пипса.
  6. Стоп Лосс. Опять же зависит от направления сделки. Должен быть меньше цены открытия, если покупаем, и больше цены открытия, если мы продаем.
  7. Тейкпрофит. Как и стоплосс зависит от направления сделки.

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

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

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

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

  1. Сделка успешно открылась, если resultсодержит значение больше нуля — тикер сделки. А значит нам нужно изменить значение Direction, чтобы в следующий раз открыть сделку в противоположную сторону.
  2. Если resultсодержит отрицательное значение, то сделка не была открыта. Нужно проверить последнюю ошибку с помощью GetLastError, проанализировать ее и что-то предпринять: повторить попытку, заснуть на некоторое время, вывести отладочную информацию в лог и т.п. Я для простоты вывел значение последней ошибки в лог.

Смотрим.

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

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

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

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

Компилируем код и запускаем советник в торговом терминале.

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

            MQL5 здесь имеет перед MQL4 неоспоримое преимущество. Вы можете создать торгового робота для пятой версии в несколько кликов, не написав фактически ни одной строки кода.

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

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

Назовем нашего эксперта MQL5_Generated_Robot. Опционально указываем автора и его веб-сайт или профиль. Добавляем по необходимости параметры советника: символ и таймфрейм для торговли. Двойной клик активирует параметр, клик на названии или на значении переменной позволяет изменить предложенные умолчания. Символ можно установить любой желаемый. Я определил его как текущий, на графике которого будет работать советник. И таймфрейм установил M15, чтобы повысить вероятность появления торговых сигналов.

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

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

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

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

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

Я выбрал “Торговля на пересечении двух средних” и установил периоды равными 21 и 55. Слишком короткие периоды выбирать нежелательно, если нужно сократить число ложных срабатываний. Символ оставляем текущий — мы будем торговать, например, EURJPY и получать сигналы от скользящих средних примененных к ценовым данным того же EURJPY. Выбирайте здесь другой символ, если ваша стратегия подразумевает торговлю по инструменту в зависимости от поведения какого-то иного. Таймфрейм также оставляю M15.

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

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

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

Переходим далее к настройке режима Трейлинг-стопа для наших сделок. Здесь я выбрал фиксированный размер лимитов. 150 пунктов стоплосса и 200 тейкпрофит.

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

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

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

  • фиксированным объемом;
  • фиксированным размером залога;
  • фиксированным риском;
  • минимально возможным объемом;
  • оптимизированным объемом позиции.

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

Я остановился на фиксированном риске в 1% от средств на счете.

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

Нажимаем “Готово” (“Done”)... Profit! Мы создали эксперта, не написав ни одной строчки кода.

Рассмотрим подробнее и проведем небольшой анализ исходников

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

Шапка и атрибуты — все как обычно. Затем идет включение библиотечных модулей. Expert — наш робот. MACross — генератор сигналов пересечения Moving Average, TrailingFixedPips — модуль контроля уровня лимитов, MoneyFixedRisk — модуль риск-менеджмента. И далее настройки — input переменные, определяющие интерфейс для взаимодействия с приложением. Выглядит знакомо, не так ли? Все правильно! Их мы и задавали в мастере генерации эксперта. В будущем значения по-умолчанию могут быть изменены здесь.

Дальше объявлена автоматическая глобальная переменная типа CExpert, которая проинициализирована дефолтным значением. Для объекта это означает, что был вызван конструктор по-умолчанию. В теле OnInit происходит инициализация советника, создание сигналов и фильтров и их инициализация заданными в настройках значениями. Ниже привожу код, из которого я убрал все проверки результатов инициализации на успех и дескрипторов на валидность, чтобы визуально сократить объем кода.

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

Ниже расположены функции OnDeinit, OnTick, OnTimer, OnTrade. В каждой из них просто вызывается соответствующий метод класса CExpert.

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

Если внимательно присмотреться, в навигаторе слева в Папке Include -> Experts видны доступные в генераторе сигналы и модули. Соответственно, вы можете добавлять какие-то специализированные решения в генератор. И создавать под любые нужды в несколько кликов.

Давайте попробуем скомпилировать код. 0 ошибок, 0 предупреждений — это успех. И запускаем в режиме тестирования стратегий Ctrl + F5 или кнопкой в графическом меню сверху.

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

Управление переходит в MetaTrader Client Terminal в настройки тестера стратегий. Затем мы выбираем файл, который будем тестировать. Настраиваем остальные параметры: символ, таймфрейм, глубину истории, баланс и плечо торгового счета и пр. Настроек много и для каждой из них есть описание в файле справки. Для вызова справки установите фокус на тестер и нажмите F1 для получения подробной информации о настройках и режимах тестирования.

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

Для запуска нажимаем кнопку “Старт” (“Start”) в правом нижнем углу тестера и, если тестирование происходит без оптимизации, то вы можете выбрать режим визуализации вашей стратегии.

Разработчики любезно предоставили описание для каждого встроенного модуля и сигнала. https://www.mql5.com/ru/docs/standardlibrary/expertclasses. Не ленитесь обратиться к документации лишний раз, чтобы расширить свои знания в вопросе.

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

            Главный недостаток кроется в самом предназначении этих языков. MetaQuotes Querying Language — язык для написания приложений только для MetaTrader. Компилировать и отлаживать код на MQL возможно только в среде MetaEditor. Запускать на исполнение программы способен только MetaTrader Client Terminal. Отсутствует ручное управление памятью. Вы по-прежнему выбираете, где создать переменную — на стеке или в динамической области, но в любом из этих случаев у вас нет доступа к ее виртуальному адресу.

Достоинств же у него куда больше. Низкий порог вхождения, особенно если уже имеется опыт разработки на языках со статической типизацией. Высокая производительность на уровне C и C++. Поддержка объектно-ориентированного стиля программирования: инкапсуляция и расширяемость, наследование, полиморфизм и виртуальные методы классов. Возможно создание шаблонов классов и функций, то есть параметрическая полиморфность. Все это позволяет многократно переиспользовать код. Бесплатная инфраструктура — торговый терминал, среда разработки, тестер стратегий, включаемые библиотеки.

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

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

            Начинаем по порядку. Вначале практически ничего не меняется, кроме пары нюансов:

  1. Убираем #property strict из директив препроцессора, потому она имеет смысл при компиляции MQL4 кода.
  2. Переносим создание статической переменной Direction выше функции инициализации эксперта, чтобы инициализировать ее в OnInit особым образом, в зависимости от имеющихся позиций. Это позволит в будущем изменять настройки советника на лету в середине торгового процесса.

Заметьте, что выбрать сделку по какому-либо символу в MQL5 стало проще с помощью встроенной функции PositionSelect, не прибегая к перебору всех открытых сделок.

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

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

Отправка запроса в последней версии языка выглядит намного лаконичнее. Вся информация о результате выполнения функции OrderSend теперь возвращается нам в MqlTradeResult.

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

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

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

Резюмируем. Апгрейд приложений из MQL4 в MQL5 происходит просто. При наличии базовых знаний MQL не составит труда сделать его самостоятельно.

Специально для вас, я подобрал далее ряд наиболее распространенных вопросов по MQL и постарались кратко, но в то же время обстоятельно и доходчиво на них ответить.

FAQ по MQL4 и MQL5

MetaQuotes Language — это высокоуровневый язык программирования для написания приложений к торговой платформе MetaTrader. со статической слабой типизацией с синтаксисом, во многом похожим на синтаксис предка — С++. Он также как и предок реализует мультипарадигменную концепцию. При написании кода вы можете использовать объектно-ориентированный или функциональный, процедурный или смешанный подходы. В рамках ООП поддерживается инкапсуляция, наследование, полиморфизм. Доступны шаблоны функций и классов. К сожалению, невозможно использовать метапрограммирование с вычислениями на стадии компиляции.

Для написания программ на MQL требуется установить торговый терминал MetaTrader Client Terminal, в пакет поставки которого входит MetaEditor — среда для разработки приложений на MQL. Запускаем его с помощью главного меню Tools -> MetaQuotes Language Editor (F4). Мы готовы к тому, чтобы написать свою первую программу на MQL.LiteFinance: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с кодом | LiteFinance

Результатом запуска такой программы в торговом терминале будет следующий вывод:LiteFinance: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с кодом | LiteFinance

Файл в формате mq4 является простым текстовым файлом. Такое расширение позволяет операционной системе автоматически сопоставить сам файл со средой разработки MetaEditor. Файл же в формате ex4 является исполняемым файлом, который нельзя прочитать как текстовый, и содержит в себе данные в бинарном виде — двоичный код.

В процессе компиляции код программы mq4 преобразуется в исполняемый код ex4. Такое преобразование просто и происходит повсеместно при создании программ. Это именно то, чем занимается компилятор.

Обратный процесс — декомпиляция (дизассемблирование) исполняемого кода ex4 в текстовый код mq4 происходит редко и зачастую не имеет под собой законных оснований. Проекты с открытым исходным кодом как правило предоставляют исходники любому согласному с правилами их распространения, преобразования и использования. Остальные проекты защищают все свои разработки законом об авторском праве. Стандартных средств для выполнения декомпиляции не существует.

А если все-таки очень нужно преобразовать исполняемый код ex4 файла в код программы? Вот несколько вариантов ответа на этот вопрос в порядке увеличения сложности реализации:

1. Связаться с автором программы и выяснить у него условия получения кода.

2. Найти программиста, который сможет реализовать логику заложенную в вашей ex4 программе, и договориться с ним.

3. Изучить MQL и самостоятельно написать программу эквивалентную той, что имеется у вас в виде ex4. Этот путь непрост, но только он расширит ваши возможности как никакой другой.

4. Провести декомпиляцию самостоятельно или с чьей-то помощью. Помните про ответственность, предусмотренную законом об авторских правах.

Файлы с расширением mq4 (mq5) являются простыми текстовыми файлами, которые содержат код MQL в текстовом виде. Самым простое, что можно сделать в данной ситуации, если вы не хотите делиться собственными исходным кодом, — не распространять файлы в этом формате.

Есть простой способ защиты кода — распространение его в формате ex4 (ex5). Файлы в таком формате генерируются MetaEditor’ом при компиляции кода mq4 (mq5). Инструкции в тексте в соответствии с правилами языка преобразуются в исполняемый двоичный код, который исполняется терминалом, когда вы добавляете советник, скрипт или индикатор на график.

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

MetaQuotes Language — высокоуровневый ООП язык программирования со слабой статической типизацией, наследник C++. MQL5 логичное развитие языка MQL4, увидевшее свет вместе с платформой MetaTrader 5. В дальнейшем он оказал значительное влияние на развитие MQL4 и способствовал его обновлению.

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

Загрузка индикатора не отличается от загрузки любого другого файла на ваш компьютер. Делать это нужно именно на компьютере, поскольку использовать MQL возможно только вместе с настольной версией MetaTrader Client Terminal. Открываем рабочий каталог терминала (Файл -> Открыть каталог данных) (File -> Open Data Folder). Далее заходим в директорию MQL/indicators и копируем сюда загруженный индикатор. Перезапускаем терминал и видим, что индикатор теперь стал доступен в Навигаторе. Осталось перетащить его на график и настроить входные параметры.

Фактически все программы MQL4 или MQL5 создаются с помощью пятой версии MetaQuotes Language Editor. Между старшей и младшей версиями языка существует обратная совместимость. Ограничением в данном случае выступает только сам MetaQuotes Server. Часть функций и структур отсутствует в четвертой версии платформы. Частично изменена логика обработки торговых операций в пятой версии сервера. Также существуют отличия и во внутреннем устройстве индикаторов. В четвертой версии может использоваться не более восьми индикаторных буферов. В MetaTrader 5 количество буферов было увеличено до 21.

Встроенная функция iCustom позволяет использовать сигналы от индикаторов для реализации торговой логики внутри советника. Если у вас есть собственный индикатор и вы хотите генерировать торговые сигналы в советнике для осуществления торговых операций, вам нужно использовать iCustom для этого. Заглядываем в документацию и видим такое определение для MQL4: LiteFinance: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с кодом | LiteFinance

 И следующее для MQL5:LiteFinance: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с кодом | LiteFinance

В сущности функция делает одно и то же, несмотря на то, что ее сигнатура различается в четвертой и пятой версиях языка. Рассмотрим подробнее каждый из параметров:

1. Строка string symbol — символ, которого будет производиться расчет.

2. Таймфрейм. В MQL4 это — целочисленный тип int, в MQL5 — это также целочисленный но enum, который содержит в себе перечисления таймфреймов.

3. Строковый параметр name. В него нужно передать путь к индикатору, если, например, он находится в другой директории, и название индикатора вместе с расширением, для которого мы хотим произвести расчет. Далее, передаются требуемые параметры для индикатора, который мы хотим использовать.

4. Далее идет серия параметров для индикатора, который будет запускаться функцией iCustom. Их количество зависит от того, сколько аргументов требуется для получения требуемого значения от вашего индикатора. Логично, что функция принимает переменное число параметров.Например, для Alligator (входит в установочный пакет MetaTrader Client Terminal):LiteFinance: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с кодом | LiteFinance

Для Ichimoku это будет какой-то другой набор переменных:LiteFinance: Языки MQL4 и MQL5: отличия массивов и краткий курс по работе с кодом | LiteFinance

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

6. Следующий целочисленный shift — обозначает смещение индикатора вперед или назад по временной шкале.

MQL является наследником языка C++, на котором написан торговый сервер MetaTrader и все приложения к нему, в том числе Client Terminal и Language Editor. К сожалению, если сравнивать MQL с предком, видно, что язык развивается с отставанием. В настоящее время возможности MQL соответствуют возможностям C++ стандарта 2003 года. Но стоит отметить, что MQL достаточно мощный язык и в существующем виде может покрыть 99% текущих потребностей программистов и разработчиков.

Код программ на языке 4 и 5 версии отличается на первый взгляд незначительно, но отличия все же есть. В пятой версии все макроопределения из четвертой были заменены на перечисления.

Расширена событийная модель запуска пользовательских приложений. В частности появились обработчики событий: OnTrade, OnTradeTransaction, OnTesterInit, OnTesterDeinit, OnTesterPass. Исправлено некорректное поведение OnTick и OnTimer в режиме тестера стратегий. Функция OnTimer теперь может запускаться с частотой дискретизации таймера в 1000 раз большей, чем в MQL4: раз в микросекунду по сравнению с миллисекундами.

MQL5 изменил логику отправки торговых распоряжений и механизм ответа на эти распоряжения. Несколько торговых функций в MQL4 были объединены в одну — OrderSend с разными режимами работы. Сам торговый процесс в MetaTrader 5 стал отличаться от торговли на четвертой платформе. Появился режим неттинга позиций в дополнение к хеджированию сделок. В дополнение к ордерам MT4 появились позиции и сделки. В арсенале языка появилась функция OrderSendAsync для отправки запросов на торговый сервер в асинхронном режиме.

Все макроопределения MQL4 в MQL5 заменены на перечисления, соответственно, компилятор теперь указывает разработчику на неявные приведения типов.

MetaTrader 5 позволяет работать с 21 стандартным таймфреймом по сравнению с 9 таймфреймами в MetaTrader 4. Индикаторы в MQL5 получили большее количество буферов на графике.

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

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

● В MQL4 торговый запрос реализуется с помощью одной функции OrderSend и набора параметров к ней, а модификация ордера и удаление отложенного ордера отдельными функциями. Результат запроса определяется булевым значением, вернувшимся по завершению функции. Анализ результата сводится к определению кода возврата сервера с помощью функции GetLastError.

● В MQL5 существует специальная структура MqlTradeRequest для отправки торговых приказов на сервер. Нужно ее заполнить с соответствующим типом операции и типом ордера образом. Для получения результата необходимо объявить и передать экземпляр структуры MqlTradeResult по ссылке при вызове OrderSend для получения ответа от сервера. объединить разрозненные параметры, ранее передававшиеся при вызове OrderSend, в единую структуру MqlTradeRequest и отправить на сервер. Полученную в ответ структуру MqlTradeResult анализируем. Вся необходимая информация будет доступна в ответе от сервера.

Особое внимание нужно обратить на обработчики событий в коде своих программ. В MQL5 существуют дополнительно OnTesterTick, OnTesterTimer, OnBookEvent. Запуск различных приложений происходит в ответ на события от торгового терминала.

Для экспертов:

OnInit, OnDeinit, OnTimer, OnTick, OnChartEvent, OnTester

Для индикаторов:

OnInit,OnDeinit, OnTimer, OnCalculate, OnChartEvent, OnTester

Для скриптов:

OnStart (в индикаторах и скриптах использовать этот обработчик нельзя).

Для включаемых библиотек не существует средств для запуска, поскольку используются они исключительно внутри других более масштабных проектов.

Еще одно отличие заключается в том, что предопределенные переменные Ask, Bid, а также массивы Open[], High[], Low[], Close[], Volume[], Time[] отсутствуют в MQL5. Поэтому код программы должен быть исправлен для самостоятельного получения этих данных с помощью встроенных функций доступа к тайм сериям CopyRates, CopyOpen, CopyHigh и т.д. Объявляем динамический массив и получаем в него данные. Функция, предоставляющая результат, позаботится об изменении размера массива самостоятельно.


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

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

Полезные ссылки:

  • Торговлю с проверенным брокером рекомендую попробовать тут. Система позволяет торговать самостоятельно или копировать сделки успешных трейдеров со всего мира.
  • Воспользуйтесь моим промокодом BLOG для получения бонуса 50% на депозит от LiteFinance. Промокод нужно просто ввести в соответствующее поле при пополнении счета в платформе LiteFinance и бонус зачислится одновременно с депозитом.
  • Чат трейдеров в телеграм: https://t.me/marketanalysischat. Делимся сигналами и опытом.
  • Канал в телеграм с отличной аналитикой, форекс обзорами, обучающими статьями и прочими полезностями для трейдеров: https://t.me/forexandcryptoanalysis
Языки MQL4 и MQL5: отличия и особенности

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

Оцените данную статью:
{{value}} ( {{count}} {{title}} )
Появились вопросы к автору? Вы можете обсудить их в комментариях .
Начать торговать
Мы в социальных сетях
Live-Чат
Оставить отзыв
Live Chat