Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Издание 2-е, исправленное и дополненное - Тимур Машнин
Шрифт:
Интервал:
Закладка:
Как видно, на любом интервале индикатор работает, количество сделок с положительным профитом превышает количество сделок с отрицательным профитом, и мы при любом раскладе должны зарабатывать деньги.
Однако в реале сделка открывается и закрывается позже, и результаты станут следующими для открытия и закрытия, например, на следующем баре.
Здесь для сделок на покупку и продажу на 15 минутных, 30 минутных, часовых и четырех часовых графиках мы получаем убыточных сделок больше, чем прибыльных.
Как мы видим, картина резко меняется и на любом интервале индикатор не работает, количество сделок с отрицательным профитом превышает количество сделок с положительным профитом, и мы при любом раскладе теряем деньги.
Конечно такая ситуация зависит от конкретной валютной пары и конкретного периода времени.
На каком-то периоде времени и такой индикатор может показать прибыль.
Но в долгосрочной перспективе, при открытии и закрытии позиции на следующем баре индикатор не покажет итоговый профит.
Поэтому в реальной торговле пользоваться одним индикатором нельзя и нужно разрабатывать сложные торговые стратегии.
Общая структура советника
Советник или эксперт это 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 в тестере выбирается критерий оптимизации Максимум пользовательского критерия.
Функции OnTesterInit (), OnTesterPass (), OnTesterDeinit () позволяют организовать динамическую обработку результатов оптимизации параметров эксперта в тестере при каждом проходе оптимизации.
Функция OnBookEvent позволяет разработать советник или индикатор, использующий торговую стратегию, которая основана на стакане цен, если конечно дилинговый центр предоставляет такую возможность.
Функция OnChartEvent, так же