Быстрое погружение в MQL5
Зачем вам нужен MQL5
Есть множество причин, по которым вы решили изучать современный язык программирования торговых стратегий MQL5, и мы только приветствуем это! Старожилы легко ориентируются как в самой документации по языку, так и в статьях и множестве сервисов, которые здесь представлены. Но если вы только открыли для себя клиентский терминал MetaTrader 5, то в первый момент многое может показаться непривычным и непонятным.
Итак, что вы можете получить от знания MQL5? Возможно, вы решили научиться программировать на современном языке с поддержкой ООП (объектно-ориентированного программирования). После MQL5 вы при желании легко сможете освоить другие высокоуровневые языки, такие как C++, С#, Java и т.д. Конечно, это не означает, что они очень похожи, но общие основы в них очень близки.
Или вы уже владеете одним из этих языков и решили создать собственного торгового робота или информационно-аналитическую систему для работы на финансовых рынках? Вам не составит в таком случае труда освоить специализированный язык MQL5, который создан именно для этих целей.
А может, вы уже хорошо знаете язык MQL4, на котором создано огромное количество торговых роботов и индикаторов для популярного торгового терминала MetaTrader 4? Тогда вам достаточно будет приложить немного усилий, и вы увидите всю мощь нового языка MQL5 и все те выгоды, которые дает новая среда разработки MetaEditor 5.
Причин для изучения MQL5 может быть множество, мы хотим в этой статье дать вам несколько советов, с чего начать и на что обратить внимание. Итак, начнем.
Возможности и особенности языка
Язык MetaQuotes Language 5 (MQL5) разработан компанией MetaQuotes Software Corp. на основе многолетнего опыта по созданию информационно-торговых платформ нескольких поколений. Основные достоинства:
- Синтаксис языка максимально приближен к языку C++, что позволяет легко переносить на него программы из других языков.
- Скорость работы MQL5-программ практически не уступает программам, написанным на С++.
- Богатые встроенные возможности по созданию технических индикаторов, графических объектов и пользовательских интерфейсов.
- Встроенная поддержка OpenCL.
- Большая стандартная библиотека и множество примеров в Code Base.
- Возможность распараллеливания математических задач оптимизации на десятки и тысячи отдельных потоков без необходимости написания специального кода.
Новичкам в программировании
Если вы не имеете опыта программирования на языках высокого уровня, то можете взять любой учебник по языку C++ и на его примере изучить основы языка MQL5: синтаксис, типы данных, переменные, операторы, функции, ООП и т.д. Разработчики языка MQL5 стремились к тому, чтобы максимально обеспечить его совместимость по возможностям с широко распространенным языком C++.
Опыт показывает, что изучить основы MQL5 с нуля можно за пару месяцев, а чтобы развернуться в нём по-настоящему, некоторым достаточно менее года - посмотрите статью Безграничные возможности с MetaTrader 5 и MQL5, и, возможно, она вдохновит вас создать что-то подобное.
Знатокам MQL4
Поначалу вам может показаться неудобным новый подход к написанию индикаторов, от множества новых функций обработки событий будут разбегаться глаза, а Си-подобный синтаксис и новые типы данных на первых порах будут непривычны.
Но пройдет совсем немного времени, и вы оцените все те преимущества, которые дает MQL5 по сравнению с привычным для вас языком предыдущего поколения MQL4. А богатые возможности по работе с чартами, графическими объектами и возможностью самому нарисовать какой угодно рисунок, как на холсте! Вы сами сможете всё оценить после знакомства с MQL5.
Профессиональным программистам
Если вы пишете на одном из современных языков, то вам не составит труда в кратчайшие сроки освоить и MQL5. ООП и событийная модель уже знакомы вам, останется только изучить специфические функции, специально заточенные под алготрейдинг:
- Операции с графиками
- Торговые функции
- Получение рыночной информации
- Пользовательские индикаторы
- Графические объекты
- и некоторые другие.
Есть и небольшие отличия в синтаксисе языка, которые сделаны из соображений безопасного написания кода и оптимального времени выполнения программы:
- нет арифметики указателей, указатели в MQL5 по сути представляют из себя дескрипторы;
- нет исключений;
- массивы любых типов всегда передаются по ссылке;
- массивы не могут иметь более 4 измерений;
- из функций нельзя возвращать массивы и объекты, но можно вернуть указатель объекта;
- нет оператора goto.
Если вы ранее не торговали, то некоторые вопросы при написании торгового робота могут вызвать торговые термины и работа с тестером стратегий. Но на этот случай в разделе Статьи есть полезные публикации:
- Основы тестирования в MetaTrader 5
- Ордерa, позиции и сделки в MetaTrader 5
- Торговые события в MetaTrader 5
- MQL5 Cloud Network ускоряет расчеты
Таким образом, для профессионального программиста сам по себе язык MQL5 не является проблемой, тут главным является знакомство с торговлей и связанными с ней понятиями.
Установка терминала MetaTrader 5
Скачать web-инсталлер терминала MetaTrader 5 можно с официального сайта по ссылке https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5setup.exe. Установка терминала MetaTrader 5 не представляет никаких трудностей, всё делается в несколько кликов. Но мы вам советуем установить терминал на любой диск, кроме того, на котором установлена операционная система Windows. Связано это с тем, что начиная с Windows Vista разработчики Microsoft внедрили новую систему контроля за действиями пользователя - UAC.
И если вы не сильны в администрировании или не любите ходить по многочисленным скрытым каталогам и копаться в них, то укажите папку для установки терминала где-нибудь вдали от Program Files, чтобы данные терминала хранились в том же каталоге, где и сам терминал MetaTrader 5. Например, установите терминал на диск D:\, если сама операционная система установлена на диске C:\.
Подробнее о различиях в режимах работы терминала MetaTrader 5 в зависимости от пути установки можно почитать во встроенной справке в разделе Начало работы → Запуск платформы.
Индикаторы, скрипты и советники
В языке MQL5 существуют три основных вида программ, каждый из которых наилучшим образом приспособлен для решения своего круга задач:
- Скрипт - программа для однократного запуска на ценовом графике. Как только выполнение дойдет до конца предопределенного обработчика OnStart(), скрипт будет завершен и выгружен с графика. Функция OnStart() предназначена только для скриптов, это единственная точка для запуска, в которой должен находиться исполняемый код. Скрипт может содержать бесконечный цикл с небольшими паузами между итерациями и таким образом висеть на графике до тех пор, пока не будет остановлен принудительно. Но на каждом графике одновременно может выполняться только один скрипт.
- Индикатор - программа для расчета массивов значений на основании ценовых данных. Специальные массивы для хранения значений индикаторов называются индикаторными буферами, количество разрешенных буферов в одном индикаторе практически не ограничено.
На каждом графике может одновременно находиться, а значит и выполняться, множество индикаторов, в том числе и несколько копий одного индикатора. Функции для работы со свойствами индикаторов доступны только из индикаторов, из скриптов или экспертов эти функции не работают. Программа считается индикатором, если в ней обнаружен обработчик OnCalculate(). Время жизни индикатора не ограничено, он выполняется до тех пор, пока его не снимут с графика. Функция OnCalculate() не может вызываться нигде, кроме как в индикаторах.
- Советники, или по-другому, эксперты - еще один вид программ, чье время жизни не ограничено и которые могут находиться на графике без принудительной выгрузки сколько угодно долго. Как правило в советниках есть обработчик события OnTick(), который четко указывает на то, что перед нами исходный код эксперта. На одном графике одновременно может находиться, а значит и выполняться, только один советник.
Прямое назначение экспертов - автоматизация торговых систем, но они могут выполнять и чисто сервисные функции - реализация графического интерфейса для ручной торговли и/или анализ и визуальное представление текущей ситуации на рынке и т.д.
Изучение основ языка MQL5 лучше всего начинать с написания скриптов, в которые можно вставлять примеры из Документации MQL5 или брать примеры скриптов из Code Вase. Далее можно приступать к работе с графическими объектами и начинать опыты с торговыми операциями на демосчете.
В качестве следующего этапа в изучении можно порекомендовать написание собственных пользовательских индикаторов и разбор примеров из Code Base и статей с примерами индикаторов. К тому времени, как вы освоите индикаторы, вы уже будете готовы к пониманию функций обработки событий.
Конечной целью является создание простых экспертов и проверка их на истории в тестере стратегий терминала MetaTrader 5. На эту тему также опубликовано множество статей в разделах Эксперты, Тестер и Торговые Системы.
И напоследок упомянем про самую интересную возможность в программировании торгового робота на MQL5 - это создание собственных модулей для автоматической сборки советников с помощью Мастера MQL5. На эту тему вы также найдете много статей, а в Code Base представлена огромная коллекция уже готовых к использованию модулей для MQL5 Wizard.
Событийная модель
Программа в MQL5 работает только по возникновению событий. Событием может быть загрузка и инициализация программы MQL5, появление тика (изменение цены финансового инструмента), изменение свойства графика, смена символа или таймфрейма на графике, срабатывание отложенного ордера и т.д.
Таким образом, событийная модель позволяет писать интерактивные программы наиболее простым путем. Тут открываются широкие возможности по созданию собственных графических панелей и удобного пользовательского интерфейса, необходимого конкретному трейдеру. Встроенные функции по работе с графикой позволяют создавать полноценные приложения как по качеству работы программы, так и по качеству её дизайна.
Возможность генерации пользовательского события функцией EventChartCustom() для любого открытого графика в терминале MetaTrader 5 позволяет создавать сложные интерактивные системы. Перехват и обработка событий производится функцией OnChartEvent(). Иллюстрацией таких возможностей могут служить статья Плеер торговли на основе истории сделок и пример для функции EventChartCustom().
Отладка и справка
Терминал MetaTrader 5 и редактор MetaEditor 5 содержат хорошо документированную встроенную справку, которую можно вызвать по F1. Вся документация обновляется автоматически по LiveUpdate. Кроме того, эта справка доступна в онлайне на официальном сайте торговой платформы MetaTrader 5 на нескольких языках:
- https://www.metatrader5.com/ru/terminal/help - справка по терминалу MetaTrader 5,
- https://www.metatrader5.com/ru/metaeditor/help - справка по среде разработки MetaEditor 5.
Наиболее важной при изучении является документация MQL5, которая представлена не только в онлайн версии на странице https://www.mql5.com/ru/docs, но доступна там же для скачивания в CHM- и PDF-форматах на множестве языков.
Клиентский терминал и редактор MetaEditor 5 тесно интегрированы между собой. Вы всегда можете перейти из одного приложения в другое по кнопке F4. Это очень удобно для правки кода, особенно если у вас открыто несколько терминалов.
Любую MQL5-программу можно запустить на отладку в терминале прямо из редактора кнопкой F5. При этом будет автоматически открыт график, на котором будет запущена ваша программа - скрипт, индикатор или эксперт. При отладке скриптов необходимо учитывать один нюанс - так как скрипт выгружается самостоятельно по окончании работы OnStart(), то отладка на этом автоматически завершается и "отладочный" график закрывается, утаскивая за собой в могилу все ваши графические построения, сделанные скриптом. Поэтому ставьте в самом конце скрипта перед оператором return() точку останова либо Sleep() с очень большим значением.
Режим отладки просто необходим как для поиска ошибок в своей программе, так и для понимания и изучения языка MQL5. При этом вы можете не только расставлять в своем коде точки останова. Существует специальная функция DebugBreak(), которая сработает только если программа работает в режиме отладки.
И конечно, стоит упомянуть о мощной поисковой системе, интегрированной в редактор MetaTrader 5, которая позволяет искать нужные результаты не только в самом исходном файле или папке, но и на сайте сообщества MQL5.community в статьях, на форуме и в Code Base.
Найденные результаты вы можете отфильтровать по категориям, выбрав только нужные. Таким образом, среда разработки предоставляет не только встроенную справку по редактору и языку MQL5, но и возможность найти полезные материалы на сайте mql5.com.
Профилировка кода
Среда разработки MetaEditor 5 предлагает полный пакет удобств для разработчика, чтобы упростить написание и отладку кода. Что еще нужно разработчику для счастья, когда у него есть отладка? Ну конечно, это возможность профилировки кода. Профилировка - это получение в удобном виде характеристик работы программы, таких как время выполнения отдельных ее фрагментов - функций и строк.
С помощью профилировки вы сразу же увидите узкие места своей программы - где больше всего времени теряется при её работе. Вы можете оценивать вносимые в код правки с точки зрения улучшения быстродействия для выбора наиболее оптимальных алгоритмов. Профессиональные разработчики знают, какие возможности это даёт, новички смогут взглянуть на свои программы другими глазами.
На картинке показан пример профилировки кода, который в свое время приводился на форуме (https://www.mql5.com/ru/forum/7134). Вы можете самостоятельно проверить его возможности, скачав код из указанной ветки.
MQL5 Storage: храните и пользуйтесь своими разработками централизованно
Еще одна интересная возможность, которой удобно пользоваться при программировании на MQL5 - это персональное хранилище исходных кодов MQL5 Storage. С его помощью вы всегда имеете прямой доступ из редактора MetaEditor 5 к своим разработкам из любой точки мира. Причем поддерживаются не только файлы с программами на MQL5, но также исходники на С++ (cpp, h) и файлы ресурсов в форматах BMP и WAV.
Вы можете добавлять и извлекать свои коды, откатывать изменения - словом, всё, что предлагают современные специализированные системы SVN. Помимо работы с хранилищем MQL5 Storage напрямую из MetaEditor 5, вы можете использовать любой внешний клиент, поддерживающий работу с Subversion 1.7, например, Tortoise SVN.
Жизнь индикаторов, чартов и графических объектов
При разработке MetaTrader 5 учитывался весь опыт разработки предыдущих версий. Именно поэтому некоторые нюансы могут показаться неожиданными с первого раза. Так, для расчета индикаторов используется экономичная модель - индикатор представляет из себя расчетную часть, и результатами одного индикатора может пользоваться множество экспертов, скриптов, других индикаторов. Это также означает, что если один и тот же индикатор наложен на несколько графиков с одинаковыми символом и периодом, расчет для них будет делаться только в одной расчетной сущности. Такой подход экономит как время, так и память.
Кроме того, в MQL5 можно вычислять значения одного индикатора на значениях другого индикатора, а также на значениях массивов. Это позволяет создавать универсальным и простым способом сложные индикаторные расчеты. И как уже упоминалось выше, возможностей по графическому представлению значений индикатора в языке MQL5 более чем достаточно.
Все операции по управлению свойствами чартов и графических объектов являются асинхронными, это позволяет не тратить время на ожидание, пока видеосистема терминала отобразит изменения цвета, размеров и т.д. Если вам необходимо получить немедленный результат выполнения функции из раздела Графические объекты или Операции с графиками, вызывайте ChartRedraw() для принудительной перерисовки графика. В остальных случаях перерисовка будет сделана терминалом автоматически при первой возможности.
Торговые операции
Торговля в MQL5 осуществляется посредством отправки запросов с помощью функции OrderSend(). Запрос представляет из себя специальную структуру MqlTradeRequest, которая заполняется необходимыми значениями в зависимости от необходимого торгового действия.
Можно совершить покупку или продажу, выставить отложенный ордер для совершения покупки/продажи по условию либо удалить существующий отложенный ордер. При успешном выполнении функции OrderSend() результат выполнения торгового запроса записывается в структуру MqlTradeResult.
На первых порах вам вовсе необязательно самостоятельно разбираться с правильностью заполнения структуры MqlTradeRequest при изучении MQL5, для проведения торговых операций в Стандартной библиотеке существует специальный класс CTrade, который как раз и призван упростить жизнь программиста на MQL5:
Операции с ордерами | |
---|---|
Размещает отложенный ордер с заданными параметрами | |
Изменяет параметры отложенного ордера | |
Удаляет отложенный ордер | |
Операции с позициями | |
Открывает позицию с заданными параметрами | |
Изменяет параметры позиции | |
Закрывает позицию | |
Дополнительные методы | |
Открывает длинную позицию с заданными параметрами | |
Открывает короткую позицию с заданными параметрами | |
Устанавливает отложенный ордер на покупку по цене лучше рыночной | |
Устанавливает отложенный ордер на покупку по цене хуже рыночной | |
Устанавливает отложенный ордер на продажу по цене лучше рыночной | |
Устанавливает отложенный ордер на продажу по цене хуже рыночной |
Пример использования класса CTrade вы можете посмотреть в учебном эксперте MACD Sample из стандартной поставки терминала, который вы можете найти в папке <каталог_терминала>\MQL5\Experts\Examples\MACD. Кроме класса CTrade в разделе Торговые классы вы найдете еще и другие полезные классы по работе с ордерами, позициями, сделками и т.д.
Работа с тестером стратегий в терминале MetaTrader 5
Торговый терминал MetaTrader 5 не только позволяет торговать на множестве финансовых рынков с помощью торговых роботов - экспертов, но также предназначен для проверки их прибыльности и устойчивости на истории. Для этого в терминал встроен тестер торговых стратегий.
Необходимо иметь в виду, что при тестировании/оптимизации советника терминал выступает в качестве диспетчера и раздает задания специальным отдельным сервисам, которые называются агентами тестирования. Таким образом, тестирование производится в виде обмена сообщениями между терминалом и агентами тестирования - тестер отсылает задания агентам и получает в ответ результаты выполнения.
При тестировании ведется Журнал, куда помещаются как сообщения самого тестера, так и сообщения агентов тестирования. При тестировании агенты могут присылать очень большое количество сообщений, генерируемых в советнике функциями Print() и Alert(). Поэтому показ сообщений в тестере организован экономичным образом, в Журнал тестирования попадают не все сообщения от агентов, часть сообщений может пропускаться. Это сделано для того, чтобы предотвратить замедление процесса тестирования необходимостью показа всех сообщений.
Поэтому Журнал тестера сохраняется отдельно в папке терминала <каталог_терминал>\tester\logs\, а полные логи со всеми сообщениями записываются в соответствующих папках агентов тестирования. Имейте это в виду, когда будете искать полные логи для анализа тестирования. К счастью, в тестере есть специальный Просмотрщик логов, в котором вы можете искать записи для нужного интервала.
Помимо тестирования существует еще и режим оптимизации входных параметров эксперта, при котором тестер может задействовать десятки, сотни или даже тысячи агентов тестирования (например, из сети распределенных вычислений MQL5 Cloud Network). В этом случае вывод и отсылка сообщений функциями Print() и Alert() полностью подавляется, чтобы не забивать исходящий трафик в сторону тестера и для экономии места на локальном жестком диске компьютера, на котором находятся агенты тестирования. Единственное исключение сделано для функции-обработчика OnInit() - только в нем разрешается вывести и передать в тестер функцией Print() сообщение, которое поможет понять причину неудачной инициализации или отказа от тестирования с помощью функции ExpertRemove() по техническим причинам.
Еще больше интересного вы сможете узнать из статей в разделе Тестер. Уверены, вы по достоинству оцените возможности тестера стратегий в клиентском терминале MetaTrader 5.
Новые горизонты
Кем бы вы ни были, после изучения MQL5 вы откроете для себя новые возможности. Это может быть лучшее понимание языков программирования, новый взгляд на торговлю или приобщение к новым технологиям. Новый терминал MetaTrader 5 включает в себя столько нового, что наверно нет ни одного разработчика, который успел охватить все его возможности.
В этой статье мы не упомянули много интересных вещей, среди которых удобная работа с DLL, скачивание программ из Code Base в редактор и запуск их в терминале одним кликом, многочисленные сервисы для трейдеров и многое-многое другое. Если вас не пугает чтение большого списка возможностей, то добро пожаловать в статью MetaTrader 5 - больше, чем можно представить!
На этом мы с вами прощаемся и надеемся увидеть вас среди постоянных членов MQL5.community!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Отличная статья. Лаконично и по сути. В отличии от предыдущей статьи от автора-анонима MetaQuotes чётко прослеживаются цели, задачи статьи и целевая аудитория. Даже нашёл для себя ряд новых моментов.
Единственное:
Изучение основ языка MQL5 лучше всего начинать с написания скриптов, в которые можно вставлять примеры из Документации MQL5 или брать примеры скриптов из Code Вase. Далее можно приступать к работе с графическими объектами и начинать опыты с торговыми операциями на демосчете.
В качестве следующего этапа в изучении можно порекомендовать написание собственных пользовательских индикаторов и разбор примеров из Code Base и статей с примерами индикаторов. К тому времени, как вы освоите индикаторы, вы уже будете готовы к пониманию функций обработки событий.
...Я бы всё-таки посоветовал начинать изучение MQL5 с написанием индикаторов...
Вот позволю себе не согласиться. Именно со скриптов... структура скрипта как программы проще... легче воспринимается начинающим...
Не буду спорить. Здесь, сколько людей, столько и мнений. Да и начальных аспектов немного: скрипты, советники, индикаторы. Я исхожу из того, что MQL5 - это именно прикладной язык. И изучается/исследуется не язык, а возможности терминала по автоматизации информационно-аналитической составляющей торговой системы.
Индикаторы и советники - решают разные задачи. Для введения именно в прикладной аспект языка MQL5 - я бы начал с индикаторов. Индикаторы позволяют разобраться с организацией и структурой информационных потоков. Также разбираясь именно с индикаторов новичёк в программировании может сделать быстрый старт именно в базовых конструкциях языка программирования и в тиках-циклах MQL5.
А вот изучение программирования советников лучше начать со скриптов. Но здесь не принципиально. Скрипты можно вообще обойти вниманием.
Не буду спорить. Здесь, сколько людей, столько и мнений. Да и начальных аспектов немного: скрипты, советники, индикаторы...
А спорить наверное и не о чем :-))
Сравнивать скрипты и индикаторы - это сравнивать наверное газонокосилку с грейдером... у каждого свои цели...
...Я исхожу из того, что MQL5 - это именно прикладной язык. И изучается/исследуется не язык, а возможности терминала по автоматизации информационно-аналитической составляющей торговой системы.