![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А попробуйте отключить текущую логику и заменить её на обычную машку. Сразу будет видно, где кот порылся, в логике или исполнении.
хороший совет.... до того момента, как мы не задумаемся о том, что оптимизация есть ни что иное, как отдельные инстансы одиночных запусков, по крайней мере так хотелось бы пользователям и так задумано было разработчиками.
отсюда следует, что каким бы сложным не был алгоритм советника, результат одиночного прогона должен быть идентичным таковому полученному в составе группы запусков во время оптимизации.
эксперимент ТС опровергает вышеозвученные довыды. я бы распечатал (как советует Ренат) по завершению каждого прогона при оптимизации историю сделок в файл с именем состоящим из параметров (для упрощения поиска среди кучи созданных файлов) и то же самое сделать при одиночном прогоне, таким образом можно будет выявить, в каком месте происходит расхождение результатов после оптимизации и одиночного прогона. видится, что это единственный способ докопаться до истины.
однако, всё же, очень любопытно, что именно, какой нюанс, может выдавать разные результаты при оптимизации и одиночного прохода, поскольку логика подсказывает, что это невозможно в принципе, при условии, что одиночный прогон идентичен таковому в составе пакетного запуска оптимизации.
" инициализация практически всех данных происходит в цикле "
Парни, нельзя инициализировать в цикле. В цикле нужно считать.
я показал же, в каких случаях не только можно, но и нужно и по другому никак.
@Andrey Dik, я вот думаю, как именно прикрутить распечатывание в файл(ы). Думается, писать файл нужно по мере выполнения. А что именно туда писать? Цены - не информативно. Нужно писать некую информацию, которая поможет понять причину рассогласования. Что это за информация? Где её взять? У меня пока нет идей.
@Andrey Dik, я вот думаю, как именно прикрутить распечатывание в файл(ы). Думается, писать файл нужно по мере выполнения. А что именно туда писать? Цены - не информативно. Нужно писать некую информацию, которая поможет понять причину рассогласования. Что это за информация? Где её взять? У меня пока нет идей.
В функции OnTester() создать файл с именем InputName1 + "_" + InputName2 + "_" + InputName3 + "_" + InputName4 + "_" +.... и в него записать историю всех сделок (именно сделок, а не позиций), там будет вся необходимая инфа для анализа, время, цена и прочее. Можно в этот же файл писать ещё что то очень интересное для конкретного советника, что может быть полезным для поиска несоответсвия оптимизатора и одиночного прогона.
Не забудьте делать проверку MQLInfoInteger (MQL_OPTIMIZATION)); что бы дописать постфикс в имени файла при одиночном прогоне, дабы не затереть такой же файл после оптимизации.
ЗЫ. если получите два различных по содержанию соответсвующих файла, то этого будет недостаточно разработчикам, а лишь даст направление где Вам копать далее, нужно будет привести воспроизводимый проблему код. надеюсь, проблема в коде советника.
В функции OnTester() создать файл с именем InputName1 + "_" + InputName2 + "_" + InputName3 + "_" + InputName4 + "_" +.... и в него записать историю всех сделок (именно сделок, а не позиций), там будет вся необходимая инфа для анализа, время, цена и прочее. Можно в этот же файл писать ещё что то очень интересное для конкретного советника, что может быть полезным для поиска несоответсвия оптимизатора и одиночного прогона.
Не забудьте делать проверку MQLInfoInteger (MQL_OPTIMIZATION)); что бы дописать постфикс в имени файла при одиночном прогоне, дабы не затереть такой же файл после оптимизации.
ЗЫ. если получите два различных по содержанию соответсвующих файла, то этого будет недостаточно разработчикам, а лишь даст направление где Вам копать далее, нужно будет привести воспроизводимый проблему код. надеюсь, проблема в коде советника.
Спасибо. Буду делать.
Спасибо. Буду делать.
Спасибо. Буду делать.
проверьте инициализацию переменных, объявленных глобально.
если инициализации не в OnInit(), а при объявлении и если в коде идёт изменение их значений.
проверьте инициализацию переменных, объявленных глобально.
если инициализации не в OnInit(), а при объявлении и если в коде идёт изменение их значений.
инициализированы или нет переменные, но результаты должны совпадать в обоих режимах тестера (оптимизация и одиночных прогон)
хороший совет.... до того момента, как мы не задумаемся о том, что оптимизация есть ни что иное, как отдельные инстансы одиночных запусков, по крайней мере так хотелось бы пользователям и так задумано было разработчиками.
отсюда следует, что каким бы сложным не был алгоритм советника, результат одиночного прогона должен быть идентичным таковому полученному в составе группы запусков во время оптимизации.
эксперимент ТС опровергает вышеозвученные довыды. я бы распечатал (как советует Ренат) по завершению каждого прогона при оптимизации историю сделок в файл с именем состоящим из параметров (для упрощения поиска среди кучи созданных файлов) и то же самое сделать при одиночном прогоне, таким образом можно будет выявить, в каком месте происходит расхождение результатов после оптимизации и одиночного прогона. видится, что это единственный способ докопаться до истины.
однако, всё же, очень любопытно, что именно, какой нюанс, может выдавать разные результаты при оптимизации и одиночного прохода, поскольку логика подсказывает, что это невозможно в принципе, при условии, что одиночный прогон идентичен таковому в составе пакетного запуска оптимизации.
В общем, согласен с вами. Если сов действительно не делает веток в зависимости от окружения (от того, запущен он в оптимизаторе или в тестере), то единственное, что можно предположить - в режиме оптимизации какие-то вызовы апи в тестере слишком оптимизированы ради скорости, пардон за тавтологию. Возможно, это зависит от флагов в используемых функциях. Подробный лог сделок и результатов выполнения ordersend поможет, да.
Лично не сталкивался с таким.
инициализированы или нет переменные, но результаты должны совпадать в обоих режимах тестера (оптимизация и одиночных прогон)
объявите переменную глобально и инициализируйте её при объявлении, например, int kk=0;
затем в OnTick() распринтуйте и поменяйте значение, например, Print("kk=",kk); ++kk;
затем поменяйте ТФ или параметры -- и посмотрите на результат.