Советник или эксперт это MQL5-программа, способная автоматически выставлять и закрывать ордера на покупку и продажу финансового инструмента, таким образом, осуществляя автоматическую торговлю в клиентском терминале.
Подобно индикаторам, код экспертов основан на функциях обратного вызова, вызываемых клиентским терминалом при наступлении определенных событий.
Для эксперта это такие функции как OnInit (), OnDeinit, OnTick (), OnTimer (), OnTrade (), OnTradeTransaction, OnTester (), OnTesterInit (), OnTesterPass (), OnTesterDeinit (), OnBookEvent (), OnChartEvent ().
Впрочем, для организации автоматической торговли достаточно двух функций OnInit () и OnTick ().
В отличие от индикаторов, для экспертов особо никакие свойства не объявляются, за исключением link, copyright, version и description, и если эксперт попутно с торговлей не рисует индикатор. Поэтому перед функциями обратного вызова, в эксперте, объявляются входные параметры, хэндлы используемых технических индикаторов, глобальные переменные и константы.
Здесь правда есть один параметр, которого нет в индикаторе, но который присутствует для эксперта.
Это магическое число или идентификатор эксперта.
С помощью магического числа идентифицируются торговые ордера, выставляемые экспертом. Это дает возможность создания взаимосвязанной системы из нескольких работающих экспертов.
В функции OnInit () эксперта производится инициализация хэндлов используемых технических индикаторов и переменных эксперта.
В функции OnDeinit эксперта, как правило, производится удаление глобальных переменных клиентского терминала, созданных экспертом во время тестирования, оптимизации или отладки, а также освобождение расчетной части используемого индикатора и удаление индикатора из графика по окончании тестирования эксперта с помощью функции IndicatorRelease ().
Глобальные переменные клиентского терминала отличаются от глобальных переменных MQL5-приложения. Глобальные переменные клиентского терминала могут быть созданы MQL5-приложением с помощью функции GlobalVariableSet, но при этом они становятся доступными для других MQL5-приложений клиентского терминала, в отличие от глобальных переменных MQL5-приложения. Таким образом, глобальные переменные клиентского терминала это средство коммуникации между разными MQL5-приложениями. Как правило, глобальные переменные клиентского терминала создаются экспертами для проверки на истечение временного лимита для предыдущей сделки.
Сами по себе глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
При тестировании эксперта глобальные переменные клиентского терминала эмулируются, и они никак не связаны с настоящими глобальными переменными терминала. Все операции с глобальными переменными терминала при тестировании эксперта производятся вне клиентского терминала в агенте тестирования.
Принудительно глобальные переменные клиентского терминала можно уничтожить с помощью вызова функции GlobalVariableDel или GlobalVariablesDeleteAll.
В функции OnTick () эксперта сначала производится проверка возможности торговли на данном счете, достаточности средств на счете, достаточности загруженной ценовой истории для расчетов торговой стратегии. Затем устанавливаются временные фильтры для совершения торговых операций, проверяется наличие открытых позиций, производятся вычисления торговой стратегии и на основании ее сигналов открываются или закрываются позиции или выставляются отложенные ордера.
Функция OnTimer () позволяет создать альтернативную модель эксперта, который будет производить вычисления торговой стратегии не при наступлении нового тика в функции OnTick (), а через определенные функцией EventSetTimer промежутки времени. При этом в функции OnDeinit эксперта нужно удалить таймер с помощью вызова функции EventKillTimer.
Функция OnTrade () позволяет обработать завершение торговой операции. Торговая операция это не только открытие или закрытие позиции, это также установка, модификация или удаление отложенного ордера, отмена отложенного ордера при нехватке средств либо по истечении срока действия, срабатывание отложенного ордера, модификация открытой позиции. Например, функцию OnTrade () можно использовать для временного ограничения торговли при срабатывании Stop Loss.
Изменение состояния торгового счета происходит в результате серии транзакций, например, создание ордера, исполнение ордера, удаление ордера из списка открытых, добавление в историю ордеров, добавление сделки в историю, создание новой позиции. Каждая такая транзакция сопровождается вызовом функции OnTradeTransaction, в которой можно обрабатывать выполнение транзакции. В частности, в функции OnTradeTransaction можно обрабатывать результат исполнения торгового запроса на сервере, отправленного функцией OrderSendAsync ().
При тестировании эксперта в режиме тестирования с использованием генетического алгоритма производится подбор наилучшей комбинации входных параметров эксперта по критерию оптимизации. Изначально тестер предлагает набор предопределенных критериев оптимизации, таких как максимальный баланс счета, баланс + максимальная прибыльность, баланс + минимальная просадка и другие.
Функция OnTester () позволяет определить свой критерий оптимизации, так как при оптимизации тестер всегда ищет локальный максимум возвращаемого значения функции OnTester (), которая автоматически вызывается после окончания очередного прохода тестирования эксперта на заданном интервале дат. Для использования функции OnTester () в тестере выбирается критерий оптимизации Custom max.
Функции OnTesterInit (), OnTesterPass (), OnTesterDeinit () позволяют организовать динамическую обработку результатов оптимизации параметров эксперта в тестере при каждом проходе оптимизации.
Функция OnBookEvent () позволяет разработать советник или индикатор, использующий торговую стратегию, которая основана на стакане цен, если конечно брокер предоставляет такую возможность.
Функция OnChartEvent (), так же как и функция OnTimer (), позволяет создать альтернативную модель эксперта, который будет производить вычисления торговой стратегии не при наступлении нового тика в функции OnTick (), а при получении событий от индикаторов, прикрепленных к графику символа.