Работа с результатами оптимизации - страница 2

 
Good Beer:
Прежде всего, спасибо Вам за ваши библиотеки! Может быть я сильно туплю, но TesterCache выдаёт информацию для пользователя. Я хочу получить данные форварда по лучшему проходу из бэка внутри эксперта, желательно только средствами MQL. Как конечную цель, я хочу автоматизировать процесс форвард оптимизации, как в этой статье. Но библиотека, которая там продаётся мне не подойдёт - т.к. нужно перебирать все пары. Вот и собираю кусочки мозаики.

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

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

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

А планируется всё это сделать так: каждую субботу, когда рынок закрыт, автоматически подключается виртуальная само-оптимизация на всех парах (можно для 20-и), где все результаты накапливаются в массивах и в соответствующих структурах, так как убраны все торговые и некоторые другие функции MQL5.

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

И все эти параметры записывается в файл, для дальнейшего использования в реальной торговле.  А для тестирования достаточно иметь реальные тиковые данные от 1-365 дней.

 
Petros Shatakhtsyan:

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

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

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

А планируется всё это сделать так: каждую субботу, когда рынок закрыт, автоматически подключается виртуальная само-оптимизация на всех парах (можно для 20-и), где все результаты накапливаются в массивах и в соответствующих структурах, так как убраны все торговые и некоторые другие функции MQL5.

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

И все эти параметры записывается в файл, для дальнейшего использования в реальной торговле.  А для тестирования достаточно иметь реальные тиковые данные от 1-365 дней.

Ещё недешевый VPS нужно иметь и стратегию, независимую от цикличности рынка.

 
Andrey Azatskiy:

при историческом и при форвардном тестах, у робота всегда вызываются методы OnInit и OnDeinit. Т.е. он удаляется и инстанцируется вновь. Этим и можно пользоваться (я так делаю выгрузку отчетов оптимизации).

А результаты оптимизации можно самому получить обратившись к журналу торгов.

Я тут немного разобрался: в форварде вызываются все функции. Просто признак форвард-оптимизации MQLInfoInteger(MQL_FORWARD) никогда не бывает true. Похоже на косяк терминала. Я добавил строчку

Print(__FUNCTION__" ",(string)MQLInfoInteger(MQL_FORWARD));

в функции OnInit(), OnDeinit(), OnTesterInit(), OnTester(), OnTesterDeinit(). Вот что получилось :

2019.08.16 19:14:05.377    G_Spring_testsoft (USDCHF,H1)    OnTesterInit 0
2019.08.16 19:14:11.897    G_Spring_testsoft (USDCHF,H1)    OnTesterDeinit 0
2019.08.16 19:14:11.897    G_Spring_testsoft (USDCHF,H1)    OnTesterDeinit(): бэк-тэст

Работа функции Print() тоже - кривая. В OnInit(), OnDeinit() и OnTester() вообще не работает. Попробую воспользоваться вашим методом.
 
Good Beer:

Я тут немного разобрался: в форварде вызываются все функции. Просто признак форвард-оптимизации MQLInfoInteger(MQL_FORWARD) никогда не бывает true. Похоже на косяк терминала. Я добавил строчку

в функции OnInit(), OnDeinit(), OnTesterInit(), OnTester(), OnTesterDeinit(). Вот что получилось :

2019.08.16 19:14:05.377    G_Spring_testsoft (USDCHF,H1)    OnTesterInit 0
2019.08.16 19:14:11.897    G_Spring_testsoft (USDCHF,H1)    OnTesterDeinit 0
2019.08.16 19:14:11.897    G_Spring_testsoft (USDCHF,H1)    OnTesterDeinit(): бэк-тэст

Работа функции Print() тоже - кривая. В OnInit(), OnDeinit() и OnTester() вообще не работает. Попробую воспользоваться вашим методом.

я говорил про методы OnDeinit а не про OnTesterDeinit. У меня все нормально отрабатывает. Я фреймами не пользуюсь, вместо них однажды собирал в методе OnDeinit - базу данный sqlite

 
Andrey Azatskiy:

я говорил про методы OnDeinit а не про OnTesterDeinit. У меня все нормально отрабатывает. Я фреймами не пользуюсь, вместо них однажды собирал в методе OnDeinit - базу данный sqlite

sqlite: такого я ка не умею.

 

Итого: всё бы получилось, если бы можно было распознать форвард-оптимизацию в OnTester() и OnDeinit().  Попробую поработать с файлами отчётов через библиотеку TesterCache.

 
Техподдержка  по вопросу молчит как рыба.
 
Продолжаю исследования. Оказывается,  MQLInfoInteger(MQL_FORWARD) работает. Этот признак можно получить внутри OnInit  и OnDeinit.  Но OnInit  и OnDeinit вызываются при каждом проходе тестера и писать в них FileOpen нехорошо, так как файлы раскидываются по папкам агентов тестирования и не собираются вместе даже при флаге FILE_COMMON. Нужна итоговая функция типа OnTesterDeinit() чтобы собрать, отсортировать и записать в файл данные из фреймов. Но OnTesterDeinit() и OnTesterInit() не вызываются при форвард-тестировании, потому я и не получал признак форварда. Остаётся научится доставать результат форварда из кэша по номеру прохода.
 
Тема этой ветки уже была поднята в статье. Но второй части не последовало: видимо Igor Volodin  упёрся в невозможность управлять периодом тестирования и значениями форварда из советника. С тех пор одна проблема решилась: появилась библиотека MultiTester, которая перезапускает оптимизацию на заданных интервалах, и инструментах. В отличие от Игоря Володина я хочу использовать результат тестерного форварда и использовать MQL-код всего для одного запуска тестирования. С результатами бэк-тэста нет никаких проблем. Алгоритм таков:  
OnTester(): На каждом проходе пишем нужный TesterStatistics() оптимизации в фрейм - FrameAdd() --> Далее идёт невыполнимая задача собрать значения  и номера всех форвард-проходов в таблицу (файл).  При форвард-оптимизации не генерируются фреймы и как я уже упоминал нет функций OnTester(), OnTesterPass(), OnTesterDeinit() и OnTesterInit(). Теоретически это можно сделать в OnDeinit(). в нём работают TesterStatistics() и признак форварда MQLInfoInteger(MQL_FORWARD). Но  OnDeinit()  вызывается в каждом агенте отдельно. Записывая данные в файл мы получаем кучу разных файлов по числу агентов тестирования, неподдающуюся объединению. При смене периода они ещё и удаляются. В OnDeinit() пишется строка в лог с номером прохода и результатом форварда. Может быть можно прочитать последнюю строку лога --> После прогона форварда вызывается OnTesterDeinit(). Здесь можно найти лучший результат бэк-теста по фреймам, найти синхронный форвард по номеру прохода из таблицы и записать в итоговый файл результат.
Вот такая пока получается стратегия Walk-Forward оптимизации. Может воззрит, на отмеченные желтым проблемы, разработчик  MetaQuotes, и расскажет как их решить.  Ведь он же смог! Есть ещё лог (.log) тестера, в котором всё есть даже с номерами проходов, но чтобы вынуть из той каши, данные нужен искуственный интеллект. Продолжаю искать.
 

Ничего пока не получается. Вот сухой остаток для текущего билда 2085:

Получить данные из бэк-тэста проблемы не составляет, но до тех пор пока не включен форвард - сразу перестаёт работать ф. FrameNext() в OnTesterDeinit().

Признак MQLInfoInteger(MQL_FORWARD) можно получить только в OnInit(). Польза от этого ==0, т.к. в форвард проходах не пишуться фреймы и не работает TesterStatistics().

Операции с файлами не получаются из за ограничения "песочниц".

Реализация сценария без использования штатного форварда, с выделением части периода для форварда, тоже не получается. Я не знаю как заставить TesterStatistics() воспринимать только часть периода тестирования, при том, чтобы позиции продолжали открываться.

Откладываю этот вопрос в долгий ящик до нисходения до него техподдержки или совершенствования тестера.