Прежде чем начать писать какую-либо программу на языке MQL4, вы должны для начала понимать, что происходит, когда ваша программа начинает свою работу. Вот почему нам нужно взглянуть на порядок исполнения кода и базовые функции, вызываемые MetaTrader.
Для начала посмотрим на структуру кода индикаторов и экспертов, так как они очень похожи.
Когда вы прикрепляете индикатор или советник к графику, MetaTrader запускает инициализацию кода, вызывая функцию OnInit(). Обычно это инициализация первоначальных параметров и настроек.
После инициализации MetaTrader ожидает поступления тика для запуска ядра программы. Для индикаторов вызывается функция OnCalculate(), в то время как для экспертов — функция OnTick(). Запускается исполнение кода внутри этих функций, и выполняется определенная задача. Когда она будет выполнена, MetaTrader будет ожидать поступления следующего тика для повторного вызова функции. Создается цикл, который будет работать до тех пор, пока программа не остановит свою работу.
Важно отметить, что когда приходит новый тик, функция OnTick() запускается только в том случае, если она еще не была запущена. Поэтому если код в функции OnTick() еще продолжает исполняться, и приходит новый тик, функция OnTick() не запускается снова, а продолжает свою работу.
Когда программа остановлена, MetaTrader вызывает функцию DeInit(), которая обычно включает в себя очистку переменных, создание отчетов или уведомлений.
Базовые функции для индикаторов:
Базовые функции для советников:
Для скриптов структура кода намного проще, так как скрипты запускают только один раз, а затем останавливают свою работу. Когда скрипт запускается, MetaTrader вызывает функцию OnStart(), и выполняет содержащийся в ней код.
Рассмотрим пример простого советника, чтобы увидеть, как он работает. Когда приведенный ниже код будет прикреплен к графику, для каждого полученного тика будет выводиться цена Ask текущей валютной пары.
#property copyright "Александр Паркер" #property link "https://traderblog.net/" #property version "1.00" #property strict //Функция OnInit() добавляется автоматически, когда вы создаете новый эксперт. //Здесь вы можете инициализировать свои переменные или выполнить другие проверки при запуске программы. int OnInit() { return(INIT_SUCCEEDED); } //Функция OnDeinit() добавляется автоматически, когда вы выбираете создание новых экспертов //Вы можете деинициализировать свои переменные, закрывать файлы, отправлять уведомления или создавать отчеты и т. д. //Данный код выполняется только один раз, когда программа завершает свою работу void OnDeinit(const int reason) { } //Функция OnTick() будет исполняться на каждом полученном тике. void OnTick() { //Для каждого поступающего тика мы будем выводить текущую цену Ask. Alert(Ask); }
Что должна включать в себя каждая торговая стратегия на MQL4?
Давайте изучим, что следует включать в каждую торговую стратегию, которую вы разрабатываете.
Чтобы быть успешным трейдером, вы должны приобрести необходимые знания и дисциплину. Никогда не подходите к торговле как к азартной игре, иначе рано или поздно вы потерпите неудачу и потеряете свои деньги.
Хорошие трейдеры постоянно создают, тестируют и проверяют свои торговые стратегии. Большинство из этих стратегий следует строгому набору правил, и поэтому они больше всего подходят для автоматизации.
Вам понадобятся одна или несколько стратегий, которые вы cможете применить для определения торговых настроек, открытия и закрытия сделок. Ваши торговые стратегии всегда должны включать в себя жесткие правила, для каждого из которых вам придется написать свой алгоритм:
- Правила управления рисками.
- Сигнал на вход.
- Масштабирование сделки и частичное закрытие позиции.
- Сигнал на выход.
Несмотря на то, что у нас получилось всего четыре пункта, каждый из них может содержать множество сложных правил и условий.
Правила управления рисками
Правила управления рисками необходимы для вашей торговли и могут включать в себя:
- Размер позиции.
- Максимально допустимый риск.
- Максимальный стоп-лосс.
- Трейлинг-стоп.
Управление рисками сэкономит ваш капитал в случае, если ваша стратегия не будет работать так, как ожидалось, или на рынке произойдут неожиданные события.
Сигнал на вход
Сигнал на вход — это определенные события на рынке, которые соответствуют условиям для открытия сделки. Сигналы на вход могут быть любыми: опубликованные новости, экономические данные, достижение ценой ключевого уровня, сигнал индикатора, паттерн прайс экшен.
В алгоритмической торговли входным сигналом почти всегда является конкретные показатели индикаторов или свечных паттернов. В программе на MQL4 вам придется создать алгоритм математических операций, который позволит компьютеру вычислить и сравнить необходимые значения для открытия позиции.
Масштабирование сделки и частичное закрытие позиции
Некоторые стратегии могут включать в себя дополнительные правила для добавления к открытым позициям (пирамидинга), когда цена движется в направлении сделки. Или же частичного закрытия, которое позволит получить некоторую прибыль и ограничить возможные риски.
Сигнал на выход
Сигнал на выход представляет собой набор из одного или нескольких правил, определяющих, когда закрывать сделку. Очень простым примером сигнала выхода может быть достижение ценой стоп-лосса для убыточной сделки и тейк-профита для прибыльной сделки. Некоторые стратегии могут иметь более сложные правила для выхода из сделки и зависеть от изменения состояния рынка.
Структура кода в MQL4
Как мы уже знаем, советник — это программа, которая выполняет автоматизированные задачи без вашего вмешательства. В чем заключается логика советника? Какова его структура кода? Как он работает?
Советник можно разделить на несколько основных модулей. При этом каждый модуль выполняет свои определенные задачи:
- Инициализация.
- Проверка условий.
- Управление ордерами.
- Технический анализ.
- Завершение работы.
Помните, что торговые роботы работают в цикле, поэтому пока программа не будет остановлена, она будет продолжать свои действия. Также следует учитывать, что хотя отдельные модули кажутся разделенными, они могут быть частично объединены и влиять на работу друг друга.
Инициализация
На этапе инициализации необходимо определить переменные, функции и исходные данные. Этот код обычно содержится в функции OnInit() для данных, которые не изменяются во время выполнения работы советника. Однако могут быть случаи, когда часть кода инициализации выполняется в функции OnTic().
Инициализация может включать в себя множество других задач:
- Инициализация переменных.
- Инициализация файлов.
- Отправка оповещений
- Отправка уведомление о старте работы советника.
Проверка условий
Когда вы запускаете советник, хорошей практикой является наличие проверки условий его работы. Эти проверки можно вынести в функцию OnTick(). Если в какой-то момент предварительные условия будут выполнены, запустятся следующие модули программы.
Примеры проверки предварительных условий:
- Проверка дня недели или времени, если вы хотите ограничить свою торговлю конкретными временными рамками.
- Проверка спреда, если он слишком высокий, советник не должен торговать.
- Проверка размера счета и свободной маржи.
- Проверка количества открытых ордеров.
Некоторые проверки могут включать в себя только торговые функции. Другие — управление ордерами и саму торговлю.
Управление ордерами
Управление ордерами — это модуль, который проверяет открытые ордера. Практически в любом эксперте вам придется проверять открытые ордера и их статус. На этом этапе вы можете захотеть, чтобы ваш торговый робот изменил эти ордера, если соблюдаются некоторые правила. Модуль управления ордерами обязательно должен запускаться в функции OnTick().
Вот некоторые примеры управления ордерами:
- Использование трейлинг-стопа.
- Изменение тейк-профита.
- Закрытие ордеров, для которых условие оставаться открытыми не выполняется.
- Частичное закрытие ордеров.
Управление ордерами может иногда включать в себя элементы технического анализа.
Технический анализ
Технический анализ — это определенные правила вашей торговли. На этом этапе торговый робот изучает состояние рынка, показания индикаторов, прайс экшен, движение цены и учитывает все правила для открытия новых сделок. Также технический анализ также может инициировать закрытие ордеров, если соблюдены все критерии. Технический анализ выполняется в функции OnTick().
Некоторые примеры технического анализа:
- Пересечение двух скользящих средних.
- Цена находится за пределами полос Боллинджера.
- Появление определенного паттерна прайс экшен, к примеру модели поглощения.
Завершение работы
Это последний модуль, в котором вы можете удалять и очищать переменные, а также включать выполнение некоторых итоговых задач, например:
- Создание отчетов.
- Отправка уведомлений.
Завершение работы выполняется в функции DeInit().