Пошаговый отладчик на исторических данных: поиск путей решения

 

Всех приветствую !

Мне крайне не хватает в MT5 пошагового тестирования на исторических данных. Во многих случаях необходимо протестировать классы советника в определенные моменты времени. Сейчас приходится это делать через отладочный лог, что крайне неудобно. Хотелось бы иметь полноценный дебаггер. Такой дебаггер есть для обычного реалтайм режима, но в этом режиме имеются только те котировки, которые в данный момент имеются на торговом сервере. А требуется отладка на определенных данных.

Общение с разработчиками дало неутешительный результат - про такой запрос они, конечно, знают, но когда это будет сделано, не могут сказать даже приблизительно.

Ну что же... Если гора не идет к Магомету - придется самому Магомету идти к горе. Тема создана для обсуждения путей решения этой проблемы, и возможно, удастся совместными усилиями найти какое-то маломальски приемлемое решение на том MT5, что имеется сейчас.

 

Прошу высказываться. Свои мысли и предложения изложу чуть позже. 

 
Пока приходиться выводить значения в журнал или комментарии на графике. С отладчиком конечно было бы удобнее и быстрее.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Свойства графиков - Документация по MQL5
 

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

 

Орешек знаний тверд, но все же

Мы не привыкли отступать !

Нам расколоть его поможет...  

 

Итак, мои размышления по теме.

Для решения проблемы необходимо, чтобы сам МТ5 находился в реальном режиме, но чтобы советник получал бы все данные на некий момент времени в прошлом.

При этом функция OnTick() может вызываться как по таймеру, так и без задержки в конце функции OnInit().

Также важно, чтобы все торговые функции также работали так, как они должны были работать в требуемый момент прошлого.

Здесь я вижу одно решение - написание некоего эмулятора, который бы:

1.Предоставлял по запросам советника не реальные данные сервера, а те, которые необходимы (скажем, данные с сервера, но в прошлом, либо вобще данные из файла)
2.Реагировал бы на торговые функции советника так, как бы реагировал на них реальный сервер в нужный момент прошлого, с учетом предоставленных данных.

При этом для советника этот эмулятор должен быть совершенно "прозрачным" - советник должен одинаково работать хоть с реальным сервером в данный момент времени, хоть через месяц с эмулятором, настроенным на этот же момент времени.

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

К счастью, в МТ5 есть такой интерфейс - это Стандартная Библиотека. ВСЕ функции советника могут быть реализованы через обращения к классам Стандартной Библиотеки.

Таким образом, вышеуказанное ограничение решается для советников, работающих через классы Стандартной Библиотеки.
Поэтому для упрощения задачи предлагаю рассматривать только таких советников. (Советники, автоматически сгенерированные МТ5 именно такие).

Встает задача написать эмулятор, отвечающий вышеуказанным двум условиям.

Первое условие - легко реализуется с помощью классов-наследников таймсерий Стандартной Библиотеки. Эти классы в обычных условиях запрашивают данные с помощью функций терминала, а в условиях отладки на исторических данных - должны возвращать советнику исторические данные. Поскольку делается это через прежний интерфейс - советнику разницы не будет. У меня уже есть кой-какие наработки в этом направлении.

Со вторым условием - сложнее. Необходимо написание полного эмулятора торгового сервера, который бы возвращал интерфейс торговых классов Стандартной Библиотеки. К сожалению, пока что на этом пути у меня нет никаких наработок.

В целом, я считаю, что задача запуска отладки на исторических данных с имеющимися возможностями - сложна, но не невозможна. Все упирается в недостаток ресурсов (в основном времени).  

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Странно, что такая, вроде бы как важная тема не нашла интереса у форумчан... Я рассчитывал хотя бы на десяток отзывов.

Ну... Кому-то может это неинтересно, а для меня важно. Поэтому... 

Продолжаю размышления.

Сегодня я думал над реализацией второго условия эмулятора.

Конечно, лучше всего написать полноценный эмулятор торгового сервера, который бы наследовал интерфейс торговых классов Стандартной Библиотеки и полностью эмулировал бы работу торгового сервера. Однако, на мой взгляд, это достаточно серьезная и кропотливая работа, которая требует немалых ресурсов.

Для упрощения задачи можно сперва ввести дополнительное ограничение на отлаживаемые стратегии, а именно: в режиме эмуляции отладки на исторических данных стратегия не должна использовать данные торгового сервера, зависимые от самой стратегии. Она должна должна использовать исключительно только статичные данные типа количества десятичных знаков в котировке или цену пункта, а также данные таймсерий или индикаторов. В этом случае классы-наследники должны только воспринимать торговые приказы ТС, и, возможно, как-то их фиксировать то ли в логе, то ли на графике. Кроме того, необходимо внести некоторые изменения в класс-наследник CЕxpert, поскольку он сейчас использует некоторые данные с торгового сервера, в частности, запрашивая в функции CExpert::Processing(void) количество отложенных ордеров у сервера. Возможно, также потребуются некоторые доработки и в других классах-наследниках. Цель - полностью исключить в режиме отладки на исторических данных обращения к торговому серверу за нестатическими данными.

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

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

Таким образом, можно отметить, что  наличие Стандартной Библиотеки делает возможным для пользователей то, что уже долгое время не могут сделать разработчики программы.  Считаю ее исключительно удобной и важной частью MT5

 

Отладка в Тестере крайне нужна, это факт.

 

Поддерживаю идею. 

Я, однако, припоминаю, видел когда-то такой советник для MT4.  

Причина обращения: