Good Beer: Прежде всего, спасибо Вам за ваши
библиотеки! Может быть я сильно туплю, но
TesterCache выдаёт информацию для пользователя. Я хочу получить данные форварда по лучшему проходу из бэка внутри эксперта,
желательно только средствами MQL. Как конечную цель, я хочу автоматизировать процесс форвард оптимизации, как в
этой статье. Но библиотека,
которая там продаётся мне не подойдёт - т.к. нужно перебирать все пары. Вот и собираю кусочки мозаики.
Вот я уже несколько лет хочу добавить в свой робот автоматическую само-оптимизацию, но недостатка времени не позволяет ее быстро
реализовать.
Для само-оптимизации лучшее решение, это сделать собственный виртуальный оптимизатор.
Практика показывает что после оптимизации достаточно иметь такие результаты, как прибыльность, макс. просадка, количество сделок и еще можно
добавить фактор восстановления и найти из них "седловую точку", т.е. нужную комбинацию входных параметров.
А планируется всё это сделать так: каждую субботу, когда рынок закрыт, автоматически подключается виртуальная
само-оптимизация на всех парах (можно для 20-и), где все результаты накапливаются в массивах и в соответствующих структурах, так как
убраны
все торговые и некоторые другие функции MQL5.
На основе полученных данных, некоторым парам будет разрешен или не разрешен открыть новые ордера, а также автоматически выбирается
степень риска.
И все эти параметры записывается в файл, для дальнейшего использования в реальной торговле. А для тестирования достаточно иметь
реальные тиковые данные от 1-365 дней.
Вот я уже несколько лет хочу добавить в свой робот автоматическую само-оптимизацию, но недостатка времени не позволяет ее быстро
реализовать.
Для само-оптимизации лучшее решение, это сделать собственный виртуальный оптимизатор.
Практика показывает что после оптимизации достаточно иметь такие результаты, как прибыльность, макс. просадка, количество сделок и еще
можно добавить фактор восстановления и найти из них "седловую точку", т.е. нужную комбинацию входных параметров.
А планируется всё это сделать так: каждую субботу, когда рынок закрыт, автоматически подключается
виртуальная само-оптимизация на всех парах (можно для 20-и), где все результаты накапливаются в массивах и в соответствующих
структурах, так как убраны
все торговые и некоторые другие функции MQL5.
На основе полученных данных, некоторым парам будет разрешен или не разрешен открыть новые ордера, а также автоматически выбирается
степень риска.
И все эти параметры записывается в файл, для дальнейшего использования в реальной торговле. А для тестирования достаточно
иметь реальные тиковые данные от 1-365 дней.
Ещё недешевый VPS нужно иметь и стратегию, независимую от цикличности рынка.
при историческом и при форвардном тестах, у робота всегда вызываются методы OnInit и OnDeinit. Т.е. он удаляется и инстанцируется
вновь. Этим и можно пользоваться (я так делаю выгрузку
отчетов оптимизации).
А результаты оптимизации можно самому
получить обратившись к журналу торгов.
Я тут немного разобрался: в форварде вызываются все функции. Просто признак форвард-оптимизации MQLInfoInteger(MQL_FORWARD)
никогда не бывает true. Похоже на косяк терминала. Я добавил строчку
Я тут немного разобрался: в форварде вызываются все функции. Просто признак форвард-оптимизации MQLInfoInteger(MQL_FORWARD)
никогда не бывает true. Похоже на косяк терминала. Я добавил строчку
в функции
OnInit(), OnDeinit(), OnTesterInit(), OnTester(), OnTesterDeinit(). Вот что получилось :
Работа
функции Print() тоже - кривая. В OnInit(), OnDeinit() и OnTester() вообще не работает. Попробую воспользоваться вашим методом.
я говорил про методы OnDeinit а не про OnTesterDeinit. У меня все нормально отрабатывает. Я фреймами не пользуюсь, вместо них однажды
собирал в методе OnDeinit - базу данный sqlite
я говорил про методы OnDeinit а не про OnTesterDeinit. У меня все нормально отрабатывает. Я фреймами не пользуюсь, вместо них однажды собирал в методе OnDeinit - базу данный 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() воспринимать только часть периода тестирования, при том, чтобы позиции продолжали открываться.
Откладываю этот вопрос в долгий ящик до нисходения до него техподдержки или совершенствования тестера.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Прежде всего, спасибо Вам за ваши библиотеки! Может быть я сильно туплю, но TesterCache выдаёт информацию для пользователя. Я хочу получить данные форварда по лучшему проходу из бэка внутри эксперта, желательно только средствами MQL. Как конечную цель, я хочу автоматизировать процесс форвард оптимизации, как в этой статье. Но библиотека, которая там продаётся мне не подойдёт - т.к. нужно перебирать все пары. Вот и собираю кусочки мозаики.
Вот я уже несколько лет хочу добавить в свой робот автоматическую само-оптимизацию, но недостатка времени не позволяет ее быстро реализовать.
Для само-оптимизации лучшее решение, это сделать собственный виртуальный оптимизатор.
Практика показывает что после оптимизации достаточно иметь такие результаты, как прибыльность, макс. просадка, количество сделок и еще можно добавить фактор восстановления и найти из них "седловую точку", т.е. нужную комбинацию входных параметров.
А планируется всё это сделать так: каждую субботу, когда рынок закрыт, автоматически подключается виртуальная само-оптимизация на всех парах (можно для 20-и), где все результаты накапливаются в массивах и в соответствующих структурах, так как убраны все торговые и некоторые другие функции MQL5.
На основе полученных данных, некоторым парам будет разрешен или не разрешен открыть новые ордера, а также автоматически выбирается степень риска.
И все эти параметры записывается в файл, для дальнейшего использования в реальной торговле. А для тестирования достаточно иметь реальные тиковые данные от 1-365 дней.
Вот я уже несколько лет хочу добавить в свой робот автоматическую само-оптимизацию, но недостатка времени не позволяет ее быстро реализовать.
Для само-оптимизации лучшее решение, это сделать собственный виртуальный оптимизатор.
Практика показывает что после оптимизации достаточно иметь такие результаты, как прибыльность, макс. просадка, количество сделок и еще можно добавить фактор восстановления и найти из них "седловую точку", т.е. нужную комбинацию входных параметров.
А планируется всё это сделать так: каждую субботу, когда рынок закрыт, автоматически подключается виртуальная само-оптимизация на всех парах (можно для 20-и), где все результаты накапливаются в массивах и в соответствующих структурах, так как убраны все торговые и некоторые другие функции MQL5.
На основе полученных данных, некоторым парам будет разрешен или не разрешен открыть новые ордера, а также автоматически выбирается степень риска.
И все эти параметры записывается в файл, для дальнейшего использования в реальной торговле. А для тестирования достаточно иметь реальные тиковые данные от 1-365 дней.
Ещё недешевый VPS нужно иметь и стратегию, независимую от цикличности рынка.
при историческом и при форвардном тестах, у робота всегда вызываются методы OnInit и OnDeinit. Т.е. он удаляется и инстанцируется вновь. Этим и можно пользоваться (я так делаю выгрузку отчетов оптимизации).
А результаты оптимизации можно самому получить обратившись к журналу торгов.Я тут немного разобрался: в форварде вызываются все функции. Просто признак форвард-оптимизации MQLInfoInteger(MQL_FORWARD) никогда не бывает true. Похоже на косяк терминала. Я добавил строчку
в функции OnInit(), OnDeinit(), OnTesterInit(), OnTester(), OnTesterDeinit(). Вот что получилось :
2019.08.16 19:14:05.377 G_Spring_testsoft (USDCHF,H1) OnTesterInit 0
Работа функции Print() тоже - кривая. В OnInit(), OnDeinit() и OnTester() вообще не работает. Попробую воспользоваться вашим методом.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(): бэк-тэст
Я тут немного разобрался: в форварде вызываются все функции. Просто признак форвард-оптимизации MQLInfoInteger(MQL_FORWARD) никогда не бывает true. Похоже на косяк терминала. Я добавил строчку
в функции OnInit(), OnDeinit(), OnTesterInit(), OnTester(), OnTesterDeinit(). Вот что получилось :
2019.08.16 19:14:05.377 G_Spring_testsoft (USDCHF,H1) OnTesterInit 0
Работа функции Print() тоже - кривая. В OnInit(), OnDeinit() и OnTester() вообще не работает. Попробую воспользоваться вашим методом.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(): бэк-тэст
я говорил про методы OnDeinit а не про OnTesterDeinit. У меня все нормально отрабатывает. Я фреймами не пользуюсь, вместо них однажды собирал в методе OnDeinit - базу данный sqlite
я говорил про методы OnDeinit а не про OnTesterDeinit. У меня все нормально отрабатывает. Я фреймами не пользуюсь, вместо них однажды собирал в методе OnDeinit - базу данный sqlite
sqlite: такого я ка не умею.
Итого: всё бы получилось, если бы можно было распознать форвард-оптимизацию в OnTester() и OnDeinit(). Попробую поработать с файлами отчётов через библиотеку TesterCache.
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() воспринимать только часть периода тестирования, при том, чтобы позиции продолжали открываться.
Откладываю этот вопрос в долгий ящик до нисходения до него техподдержки или совершенствования тестера.