Разница проходов во время оптимизации, и потом в одиночном - что может быть?

 

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

Такая проблема - чел (хороший знакомый, для которого я экспертов пишу) оптимизирует эксперта в режиме OHLC 1M.  Конечно, в тестере получается дичайшая прибыль, он очень рад. 

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

Почему так происходит? Вроде режим OHLC 1M - должен быть стабильным. Да и эксперт - не скальпер, сделки держатся по нескольку дней (а таймфрейм М15).  

Разве может проход в момент оптимизации отличаться от прохода потом, после неё? У меня вроде такого не было - всегда, когда запускал после оптимизации - всегда результат одиночного прохода был тем же. 

Это баг или фича? Где лыжи смазать?

 
Georgiy Merts:

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

Такая проблема - чел оптимизирует эксперта в режиме OHLC 1M.  Конечно, в тестере получается дичайшая прибыль, он очень рад. 

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

Почему так происходит? Вроде режим OHLC 1M - должен быть стабильным. Да и эксперт - не скальпер, сделки держатся по нескольку дней (а таймфрейм М15).  

Разве может проход в момент оптимизации отличаться от прохода потом, после неё? У меня вроде такого не было - всегда, когда запускал после оптимизации - всегда результат одиночного прохода был тем же. 

Это баг или фича? Где лыжи смазать?

Частая проблема. И она в коде эксперта. Не все понимают, что при одиночном проходе все переменные инициализируются, а при проходе в оптимизаторе - нет. Так что для начала нужно инициализировать все переменные, которые не присваиваешь явно в OnInit.

Получается, при разнице одиночный проход верен, а проход в оптимизаторе - нет.
 
Edgar Akhmadeev #:

Частая проблема. И она в коде эксперта. Не все понимают, что при одиночном проходе все переменные инициализируются, а при проходе в оптимизаторе - нет. Так что для начала нужно инициализировать все переменные, которые не присваиваешь явно в OnInit.

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

Но, посмотрю внимательно, конечно, инициализацию. 

 
Georgiy Merts:

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

Такая проблема - чел оптимизирует эксперта в режиме OHLC 1M.  Конечно, в тестере получается дичайшая прибыль, он очень рад. 

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

Почему так происходит? Вроде режим OHLC 1M - должен быть стабильным. Да и эксперт - не скальпер, сделки держатся по нескольку дней (а таймфрейм М15).  

Разве может проход в момент оптимизации отличаться от прохода потом, после неё? У меня вроде такого не было - всегда, когда запускал после оптимизации - всегда результат одиночного прохода был тем же. 

Это баг или фича? Где лыжи смазать?

Очень элементарно сделать тестерный грааль на OHLC M1. Ведь в таком случае у вас есть лучшая цена в течении одной минуты для продажи или покупки ( High или Low). В реальной жизни, понятное дело, вы не знаете какая цена будет минимальной или максимальной в данный момент времени за текущую минуту. Поэтому внимание стоит обращать на тест на реальных типах. Или хотя-бы на ценах открытия для убыстрения теста.
 
Nikolai Semko #:
Очень элементарно сделать тестерный грааль на OHLC M1. Ведь в таком случае у вас есть лучшая цена в течении одной минуты для продажи или покупки ( High или Low). В реальной жизни, понятное дело, вы не знаете какая цена будет минимальной или максимальной в данный момент времени за текущую минуту. Поэтому внимание стоит обращать на тест на реальных типах. Или хотя-бы на ценах открытия для убыстрения теста.

Да понятно, что грааль легко сделать, но в данном случае вход привязан к таймфрейму M15, и сделки длятся по нескольку дней (бывает и недель), так что режим OHLC 1M в данном случае - разумный компромисс между скоростью и точностью. 

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

 
Georgiy Merts #:

Да понятно, что грааль легко сделать, но в данном случае вход привязан к таймфрейму M15, и сделки длятся по нескольку дней (бывает и недель), так что режим OHLC 1M в данном случае - разумный компромисс между скоростью и точностью. 

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

В одном и том же режиме при равенстве параметров результаты проходов должны совпадать, и при тестировании, и при оптимизации.

99.99% - ошибка в коде эксперта. Было много обсуждений и откровений на англоязычном форуме и на русском, русском. 0.01% - МТ5 может резать некоторые входные параметры, в частности слишком длинные строковые, и с перечислениями бывали в прежних билдах проблемы.

 
Stanislav Korotky #:

В одном и том же режиме при равенстве параметров результаты проходов должны совпадать, и при тестировании, и при оптимизации.

99.99% - ошибка в коде эксперта. Было много обсуждений и откровений на англоязычном форуме и на русском. 0.01% - МТ5 может резать некоторые входные параметры, в частности слишком длинные строковые, и с перечислениями бывали в прежних билдах проблемы.

Ну, поглядим по остальным проходам. Клиент только лучший проход запускал. Попросил его позапускать и остальные проходы. Посмотрим, проявится ли разница. 

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

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

 
Georgiy Merts #:

Ну, поглядим по остальным проходам. Клиент только лучший проход запускал. Попросил его позапускать и остальные проходы. Посмотрим, проявится ли разница. 

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

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

Можете почитать на анлийском форуме (автоперевод фрагмента):

Форум по трейдингу, автоматизированным торговым системам и тестированию торговых стратегий

Результат оптимизации стратегии не соответствует результату одиночного теста

Станислав Короткий , 2024.08.10 17:08

Неинициализированная переменная так же плоха, как и неинициализированная структура. Моя формулировка, вероятно, была немного вольна, но предполагается, что все неинициализированное (что должно быть) может непредсказуемо исказить результаты. Классы также могут быть несовершенными — и я бы не стал принимать как должное, что коды MQL Easy надежны как скала. Вы проверили все материалы и абсолютно уверены, что они везде «правильные»?

Случайно инициализированная переменная НЕ является неинициализированной переменной! ;-)

Любая переменная выделяется где-то в памяти. Это место обычно одно и то же для текущей сессии/программы, пока среда одна и та же (как при запуске одного и того же пула агентов тестировщика с одной и той же тестируемой программой MQL). Независимо от того, сколько раз вы перезапускаете процесс - если среда существенно не меняется (например, вы отключили часть пула или, вероятно, запустили другой экземпляр MT5 - сложно сказать, какие факторы могут существенно изменить среду) - весь сектор данных программы MQL будет выделен в одном и том же месте. Так что если переменная не инициализирована, она всегда будет получать один и тот же "мусор". Следовательно, вы всегда будете получать один и тот же неверный результат.

Конкретно в том случае, не сбрасывается там где надо _LastError, во всей библиотеке MQL Easy.
 
Georgiy Merts #:

Ну, поглядим по остальным проходам. Клиент только лучший проход запускал. Попросил его позапускать и остальные проходы. Посмотрим, проявится ли разница. 

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

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

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

 
Edgar Akhmadeev #:

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

Это какая-то неправда, ИМХО. Требуется демонстрация.

 
Stanislav Korotky #:
Можете почитать на анлийском форуме (автоперевод фрагмента):

Да-да, всё верно, я нарывался на ошибки неинициализированных переменных. И знаю, какие "подводные камни" эта ошибка вызывает. 

Именно поэтому я стараюсь всегда инициализировать переменные сразу при создании невалидным значением. 

Но, за сложные структуры - я поручиться не могу (а там они тоже кое-где используются). Обидно будет, если выяснится такая неприятная ошибка (тем более, что я, когда пишу код, всегда её имею ввиду, а тут... как-то умудрился пропустить? )