Результаты оптимизации отличаются от одиночных тестирований по ним - страница 6

 

Смотрю тут вопрос о спреде при тестировании в который раз затрагивается. Я вот недавно вроде пришёл к системе, выглядящей более или менее серьёзно (с точки зрения реальной торговли) и, соответственно, требующей тщательного тестирования. И тоже озаботился этим вопросом. В результате написал простой скрипт, устанавливающий нужный спред для оффлайнового тестирования.

Принцип известный, в файле symbols.sel переписывается Ask. То есть нужно в оффлайновом терминале скопировать его из папки истории в папку experts/files, запустить скрипт, потом закрыть терминал, скопировать symbols.sel обратно и снова запустить терминал.

P.S. Заменил скрипт, мелкая описка была, если кто вдруг успел взять SetSpread а не SetSpread_1, нужно повторно скачать.

Файлы:
 
Та же самая проблема. При оптимизации одни результаты, при одиночных прогонах-перепроверках - кардинально другие. Спасибо Mathemat подсказал куда копать.

Mathemat:
С объектами надо быть поосторожнее при тестировании. Лучше их вообще не использовать.

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

GlobalVariableSet("GV_name", number);

а в советнике принимал значение

int dc = GlobalVariableGet("GV_name");

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

string GlobVar = "GV_name";  // объявил переменную в индикаторе на глобальном уровне программы

int start(){
  GlobalVariableSet(GlobVar, number);
}
string GlobVar;  // объявил переменную в советнике на глобальном уровне программы
int dc;

int start(){
  dc = GlobalVariableGet(GlobVar);
}

Т.о. обявление глобальных переменных в индикаторе и в советнике заставило все заработать правильно.

 

Добрый вечер, коллеги.

Решил реанимировать эту тему, т.к. столкнулся с идентичной проблемой.

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

Может кто нибудь нашёл решение?

 
Andrey Kaunov:

Добрый вечер, коллеги.

Решил реанимировать эту тему, т.к. столкнулся с идентичной проблемой.

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

Может кто нибудь нашёл решение?

А почему они должны совпадать? Если только полный перебор параметров и выбор лучшего варианта. Но это дорого ресурсно. Поэтому генетические алгоритмы. А они по сути строятся так, случайная выборка наборов параметров из оптимизируемых и потом выбор лучшей поляны, и там более подробный поиск. Например 6 параметров. Представить лучшее решение, это как наибольшая плотность в 6ти мерном пространстве. И точек уплотнений может быть много. Хороший алгоритм дает ровные 6ти мерные объемные поляны с не большим количеством уплотнений и пологих и оптимизация их найдет, а если алгоритм дает резкие уплотнения, то результаты могут быть случайны. т.е. оптимизация будет находить уплотнения, но не каждый раз одинаковый набор параметров (одинаковые модели).

 

Валерий, вместо ответа просто процитирую, можно...

eugene-last:

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

Что такое оптимизация и что такое одиночный тест? Ответ: оптимизация - это несколько одиночных тестов.
Что это означает? Ответ: это означает ТЕОРЕТИЧЕСКИ, что проход оптимизации проходит так же и заканчивается с таким же результатом, что и одиночный тест.

Ну так на практике получается что это не так. И советник (кстати, не максимус, а то я смотрю тут кого-то это так сильно разволновало) не лажает, поскольку одиночный тест показывает абсолютно один и тот же результат. Ну так почему этот одиночный тест в оптимизации дает другой результат ?!?!?!?!!?!?!

 
Andrey Kaunov:

Добрый вечер, коллеги.

Решил реанимировать эту тему, т.к. столкнулся с идентичной проблемой.

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

Может кто нибудь нашёл решение?

1. проверить, что все переменные проинициализированы, хотя раньше в MQL4 - неинициализированные переменные были равны 0, сейчас не знаю , кстати это касается и индикаторов

2. если используете динамические массивы - нужно проверять результат ArrayResize() - я попадал на это, делал ЕА по 4-5 индикаторам, оказалось, что один индикатор сжирал всю память, и в ЕА у меня не всегда ArrayResize() выделял запрошенный размер массива - через раз то работало то нет. Если не ошибаюсь, то в  MQL4  памяти около 3Гб макс для MQL- программ , терминал же 32-х разрядный

 
Andrey Kaunov:

Валерий, вместо ответа просто процитирую, можно...

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

 
Igor Makanu:

1. проверить, что все переменные проинициализированы, хотя раньше в MQL4 - неинициализированные переменные были равны 0, сейчас не знаю , кстати это касается и индикаторов

2. если используете динамические массивы - нужно проверять результат ArrayResize() - я попадал на это, делал ЕА по 4-5 индикаторам, оказалось, что один индикатор сжирал всю память, и в ЕА у меня не всегда ArrayResize() выделял запрошенный размер массива - через раз то работало то нет. Если не ошибаюсь, то в  MQL4  памяти около 3Гб макс для MQL- программ , терминал же 32-х разрядный

Игорь, спасибо за наводку. Попробую покопать в этом направлении.

Valeriy Yastremskiy:

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

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

 
Andrey Kaunov:

Игорь, спасибо за наводку. Попробую покопать в этом направлении.

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

Разрабы слов и жалоб не понимают. Только понятный код воспроизводящий проблему)

 
Igor Makanu:

1. проверить, что все переменные проинициализированы, хотя раньше в MQL4 - неинициализированные переменные были равны 0, сейчас не знаю , кстати это касается и индикаторов

2. если используете динамические массивы - нужно проверять результат ArrayResize() - я попадал на это, делал ЕА по 4-5 индикаторам, оказалось, что один индикатор сжирал всю память, и в ЕА у меня не всегда ArrayResize() выделял запрошенный размер массива - через раз то работало то нет. Если не ошибаюсь, то в  MQL4  памяти около 3Гб макс для MQL- программ , терминал же 32-х разрядный

В 4-ке нули, в 5-ке мусор. В прошлый раз подобные проблемы вроде завершились именно из-за нахождения переменных, которые инициализировались вне ОнИнит, но при этом менялись в процессе работы, т.е. при проходах оптимизации

на следующий проход они попадали не с первоначальным значением.

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