Обсуждение статьи "Универсальный торговый эксперт: Пользовательские стратегии и вспомогательные торговые классы (Часть 3)"

 

Опубликована статья Универсальный торговый эксперт: Пользовательские стратегии и вспомогательные торговые классы (Часть 3):

В этой статье мы продолжим описание алгоритмов торгового движка CStrategy. В третьей части серии статей подробно разобраны примеры написания конкретных торговых стратегий с использованием данного подхода. Также большое внимание уделено вспомогательным алгоритмам — системе логирования эксперта и доступу к биржевым данным с помощью обычного индексатора (Close[1], Open[0] и т.п.).

В данной части серии статей продолжается знакомство с торговым движком CStrategy. Напомним краткое содержимое ее предыдущих частей. В первой части "Универсальный торговый эксперт: Торговые режимы стратегий" подробно разбирались торговые режимы, благодаря которым можно гибко конфигурировать логику работы своего эксперта в зависимости от времени и дня недели. Во второй статье "Универсальный торговый эксперт: Cобытийная модель и прототип торговой стратегии" мы подробно рассмотрели событийную модель на основе централизованной обработки событий, а также основные алгоритмы базового класса CStrategy, лежащего в основе пользовательского эксперта.

В третьей части серии мы подробно опишем примеры советников на основе торгового движка CStrategy, а также некоторые вспомогательные алгоритмы, которые могут понадобиться для разработки советника. Особое внимание уделяется процедуре логирования. В самом деле, логирование, несмотря на свою сугубо вспомогательную функцию, очень важный элемент любой более-менее сложной системы. С хорошим логировщиком можно быстро понять причины неисправности и найти место, в котором эта неисправность произошла. Данный логировщик написан с помощью специального приема программирования, называемого паттерн "Одиночка" (Singleton). Его рассмотрение будет интересным для тех, кто интересуется не только организацией торгового процесса, но и созданием алгоритмов для решения нестандартных задач.

Также в этой статье описываются алгоритмы, которые позволяют обращаться к рыночным данным через удобные и интуитивно понятные индексы. Действительно, работать с данными через индексы вроде Close[1] или High[0] — это многими любимая особенность работы в MetaTrader 4. Так зачем отказываться от нее, если ее точно так же можно использовать в MetaTrader 5? Эта статья объясняет, как это сделать, и подробно описывает алгоритмы, которые это реализуют.


Методы, которые необходимо переопределить пользовательскому эксперту

В первой статье "Универсальный торговый эксперт: Торговые режимы стратегий" мы подробно рассмотрели торговые режимы стратегии и ее основные методы, которые необходимо переопределить. Теперь настало время заняться практикой.

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

Виртуальный метод Событие/действие Назначение
OnSymbolChanged Вызывается при изменении названия торгового символа В случае смены торгового инструмента индикаторы эксперта необходимо переинициализировать. Данное событие позволяет выполнить переинициализацию индикаторов эксперта.
OnTimeframeChanged Смена рабочего таймфрейма В случае смены рабочего таймфрейма индикаторы эксперта необходимо переинициализировать. Данное событие позволяет выполнить переинициализацию индикаторов эксперта.
ParseXmlParams Парсинг пользовательских параметров стратегии, загруженных через XML-файл Стратегии необходимо самостоятельно распознать XML-параметры, переданные в данный метод, и сконфигурировать свои настройки соответствующим образом.
ExpertNameFull Возвращает полное имя эксперта Полное имя эксперта состоит из названия стратегии и, как правило, уникального набора параметров самой стратегии. Экземпляр стратегии должен самостоятельно определить для себя полное имя. Это имя также используется в визуальной панели, в раскрывающем списке Agent.
OnTradeTransaction Возникает в случае возникновения торгового события Некоторым стратегиям для своей работы необходимо анализировать торговые события. Это событие позволяет передать конечному эксперту торговое событие и проанализировать его.
InitBuy Инициирует покупку Один из основных методов, который необходимо переопределить. В данном методе необходимо совершить покупку, если сформировались подходящие торговые условия для нее.
InitSell Инициирует продажу Один из основных методов, который необходимо переопределить. В данном методе необходимо совершить продажу, если сформировались подходящие торговые условия для нее.
SupportBuy Сопровождает ранее открытую длинную позицию Ранее открытую длинную позицию необходимо сопроводить. Например, поставить для нее защитную остановку Stop Loss или закрыть позицию в случае возникновения сигнала на выход из позиции. Все эти действия необходимо выполнить в данном методе.
SupportSell Сопровождает ранее открытую короткую позицию Ранее открытую короткую позицию необходимо сопроводить. Например, поставить для нее защитную остановку Stop Loss или закрыть позицию в случае возникновения сигнала на выход из позиции. Все эти действия необходимо выполнить в данном методе.

 Таблица 1. Виртуальные методы и их назначение

Наиболее важные методы, которые необходимо переопределить, это InitBuy, InitSell, SupportBuy и SupportSell. В таблице они выделены жирным шрифтом. Если, например, забыть переопределить метод InitBuy, то пользовательская стратегия не будет совершать покупок. Если не переопределить один из Support методов, то открытая позиция может быть никогда не закрыта. Поэтому при создании эксперта крайне внимательно относитесь к переопределению этих методов.

Автор: Vasiliy Sokolov

 
Довольно интересно. И в самом деле возможно ускорить и упростить процесс разработки. Для открытия позиции вы используете методы из стандартной библиотеки, но что насчет других стандартных классов - управление капиталом, трейлинг-стоп. Можно их прикрутить к вашему движку?
 
hftech:
Довольно интересно. И в самом деле возможно ускорить и упростить процесс разработки. Для открытия позиции вы используете методы из стандартной библиотеки, но что насчет других стандартных классов - управление капиталом, трейлинг-стоп. Можно их прикрутить к вашему движку?

Можно использовать и другие стандартные классы через специальные адаптеры. Однако трудность здесь в том, что эти классы проектировались для MetaTrader 5, и являются платформозависимыми, а движок CStrategy - нет. Внимательный читатель уже наверное заметил, что в движке целенаправленно все заворачивается в ООП-прослойки, и делается это специально.

Сейчас стоит сверх задача - портировать CStrategy в MetaTrader 4. Тогда стратегия, написанная с помощью движка, одинаково будет компилироваться и запускаться в обоих платформах одновременно.

P.S. На самом деле движок не использует стандартный торговый класс CTrade, а открывает позиции с помощью некоего CTradeControl, который очень сильно напоминает CTrade и даже наследуется от него, но им не является. В будущем это поможет портировать его в MT4, что сделает CStrategy действительно платформонезависимым.

 
Vasiliy Sokolov:

Можно использовать и другие стандартные классы через специальные адаптеры. Однако трудность здесь в том, что эти классы проектировались для MetaTrader 5, и являются платформозависимыми, а движок CStrategy - нет. Внимательный читатель уже наверное заметил, что в движке целенаправленно все заворачивается в ООП-прослойки, и делается это специально.

Сейчас стоит сверх задача - портировать CStrategy в MetaTrader 4. Тогда стратегия, написанная с помощью движка, одинаково будет компилироваться и запускаться в обоих платформах одновременно.

P.S. На самом деле движок не использует стандартный торговый класс CTrade, а открывает позиции с помощью некоего CTradeControl, который очень сильно напоминает CTrade и даже наследуется от него, но им не является. В будущем это поможет портировать его в MT4, что сделает CStrategy действительно платформонезависимым.

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


Можно использовать и другие стандартные классы через специальные адаптеры.

Было бы интересно почитать про пример такого адаптера.

P.S. На самом деле движок не использует стандартный торговый класс CTrade, а открывает позиции с помощью некоего CTradeControl, который очень сильно напоминает CTrade и даже наследуется от него, но им не является. В будущем это поможет портировать его в MT4, что сделает CStrategy действительно платформонезависимым.

Да, вижу похожие методы CTrade в CTradeCustom, но стандартные библиотеки все же используются:

#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\DealInfo.mqh>
 

По поводу платформонезависимости, концепция конечно интересная, но кому на практике такое действительно нужно. По-моему, все уже давно сделали свой выбор. МТ5 прежде всего интересен тем, кто работает на биржевых площадках. На форексе и CFD прекрасно справляется МТ4. Обычно те, кто работает на форексе не лезут на биржевые рынки и наоборот. Кому нужно писать одну стратегию и реализовывать ее на обеих платформах? Продавцам роботов разве. Но это мое частное мнение, возможно я не прав. 

Мне как работающему исключительно на МТ5 было бы интересно расширение функционала того же CTradeControl. Например чтоб открытие позиции реализовывалось только через лимитные ордера и причем с использованием интересных подходов, учитывающих скажем текущую волатильность и спрос/предложение в стакане.

 
hftech:

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

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

Однако сильно волноваться по поводу этих потенциальных изменений не стоит, потому что во-первых, скорее всего, если они и будут сделаны, то во внутренней структуре движка, и пользователи этих изменений не почувствуют. Во-вторых, алгоритмы которые даны - апробированы многолетней практикой и в других платформах. Они реально работают. И пока ничего лучше мною изобретено не было, а было перепробовано ни мало: и модели на основе конечных автоматов и другие шаблоны, вроде того что предлагает Wealth-Lab. 

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

 
hftech:

По поводу платформонезависимости, концепция конечно интересная, но кому на практике такое действительно нужно. По-моему, все уже давно сделали свой выбор. МТ5 прежде всего интересен тем, кто работает на биржевых площадках. На форексе и CFD прекрасно справляется МТ4. Обычно те, кто работает на форексе не лезут на биржевые рынки и наоборот. Кому нужно писать одну стратегию и реализовывать ее на обеих платформах? Продавцам роботов разве. Но это мое частное мнение, возможно я не прав. 

Мне как работающему исключительно на МТ5 было бы интересно расширение функционала того же CTradeControl. Например чтоб открытие позиции реализовывалось только через лимитные ордера и причем с использованием интересных подходов, учитывающих скажем текущую волатильность и спрос/предложение в стакане.

Многие на практики вынуждены работать сразу с двумя платформами. Например в МТ4 тестируют на своих данных, а в МТ5 торгуют (Пока в MT5 не появятся свои дата фиды ситуация не изменится). И здесь очень важно иметь одну и туже реализацию алгоритма для обоих платформ одновременно. Т.к. в противном случае возможны неприятные неожиданности. 

Продавцам и фрилансерам тоже очень удобно писать для двух платформ одновременно, не запариваясь о пресловутой несовместимости. Кстати Вы зря отодвигаете их на второй план. Фрилансеры пишут очень большой объем кода и сильно загружены. У них нет времени на разработку разных концепций и движков. Поэтому важно им дать инструмент и понятное описание к нему. Многим людям, даже не знакомым с программированием, это существенно облегчит жизнь и поможет четче сформулировать ТЗ советника (в правилах движка).

 
Vasiliy Sokolov:

Многие на практики вынуждены работать сразу с двумя платформами. Например в МТ4 тестируют на своих данных, а в МТ5 торгуют (Пока в MT5 не появятся свои дата фиды ситуация не изменится). И здесь очень важно иметь одну и туже реализацию алгоритма для обоих платформ одновременно. Т.к. в противном случае возможны неприятные неожиданности. 

Продавцам и фрилансерам тоже очень удобно писать для двух платформ одновременно, не запариваясь о пресловутой несовместимости. Кстати Вы зря отодвигаете их на второй план. Фрилансеры пишут очень большой объем кода и сильно загружены. У них нет времени на разработку разных концепций и движков. Поэтому важно им дать инструмент и понятное описание к нему. Многим людям, даже не знакомым с программированием, это существенно облегчит жизнь и поможет четче сформулировать ТЗ советника (в правилах движка).

Спасибо за статьи, отличная идея! Ждем продолжения.

Я думаю вы скоро напишите доп классы оболочки для портирования Cstrategy в мт4 и простая строчка вида Trade.Buy(MM.GetLotFixed(), ExpertSymbol(), ""); 

будет одинаково компилироваться в обеих платфомах.

Но пока что получается универсальный эксперт платформанезависим только на стадии компиляции?

1) Можно ли будет добиться одинакового открытия позиции в мт4 тестере и реальном/демо счете мт5? Пусть с использованием своих данных в мт4 и конечно же вашего движка. OHLC между тестером и реальном счетом могут быть разными соответственно и показания индикаторов будут отличаться , а значит и наличие сделок.

2) Еще нужно продумать момент с расхождением понятий ордеров и сделок между платформами. Т.е тут нужно исключить возможность открытия разнонаправленных позиций в мт4 придерживаясь логике мт5.

Эти два вопроса как то вы будете решать? Или конечный пользователь сам справится?) 

Спасибо 

 
Arnold Bobrinskiy:

2) Еще нужно продумать момент с расхождением понятий ордеров и сделок между платформами. Т.е тут нужно исключить возможность открытия разнонаправленных позиций в мт4 придерживаясь логике мт5.

На счет второго вопроса могу ответить сразу: никаких ограничений по открытию разнонаправленных позиций у движка нет. Наоборот, он изначально был написан для управления разнонаправленными позициями. Т.е. в МТ4 все будет не менее штатно чем в МТ5.
 
Vasiliy Sokolov:
На счет второго вопроса могу ответить сразу: никаких ограничений по открытию разнонаправленных позиций у движка нет. Наоборот, он изначально был написан для управления разнонаправленными позициями. Т.е. в МТ4 все будет не менее штатно чем в МТ5.
А как же тогда эксперт повторит логику одинаково? Например  в мт5  открыта позиция buy лотом 0.2   , после команды sell 0.2 позиция должна закрыться. В мт4 в этом случае останется 2 разнонаправленные позиции, в то время как в мт5 открытых позиций уже не будет.
 
Arnold Bobrinskiy:
А как же тогда эксперт повторит логику одинаково? Например  в мт5  открыта позиция buy лотом 0.2   , после команды sell 0.2 позиция должна закрыться. В мт4 в этом случае останется 2 разнонаправленные позиции, в то время как в мт5 открытых позиций уже не будет.

Просто в МТ5 эксперту в управление будет приходить одна и только одна позиция. В МТ4 эксперту последовательно будет передоваться несколько позиций. Если в МТ5 выполнить конверсионную операцию не сверяясь с текущей позицией (купить, когда есть позиция на продажу и продать когда есть позиция на покупку - позиция закроется и в следующий вызов у эксперта просто не будет вызываться модуль сопровождения позиции.

Также очевидна совместимость сверху вниз: эксперты написанные для МТ5 и торгующие только одну позицию в одном направлении, будут нормально работать в МТ4. Эксперты, торгующие сразу несколько позиций в МТ4 не смогут отработать аналогичную логику в МТ5. Но если позиция будет торговать только одна - то никаких проблем в МТ5 быть не должно.