Сигнальная переменная TestRes устанавливается в 1.0 при инициализации советника и сбрасывается в 0.0 при деинициализации по плановому прерыванию работы.
3. Плановые прерывания тестирования выполняются со специальным кодом деинициализации 782.
Который обрабатывается в OnDeinit():
Это самообман - OnDeinit будет вызван дважды. Вызвать OnDeinit можно сколько угодно раз самому. А вот создать Deinit-событие, по которому сработает OnDeinit - это только ExpertRemove в Тестере. И он свой Reason сгенерирует, а не кастомный.
Это самообман - OnDeinit будет вызван дважды. Вызвать OnDeinit можно сколько угодно раз самому. А вот создать Deinit-событие, по которому сработает OnDeinit - это только ExpertRemove в Тестере. И он свой Reason сгенерирует, а не кастомный.
Да, второй раз будет вызван по ExpertRemove(), но в реальной программе OnDeinit() использован как завершающая функция, выполняющая различные наборы действий в зависимости от причины деинициализации.
Принудительный вызов используется в пользовательских целях в частности для обработки пользовательского завершения программы, а автоматический (например по ExpertRemove()) - в системных.
Как искать причину проблемы - непонятно. :-(
Без воспроизведения - никак.
В настоящий момент проблема более не проявлялась.
Для облегчения анализа подобной проблемы в будущем сделано следующее.
1. Оптимизация проводится "по максимуму пользовательского критерия" (уже использовалось на момент обнаружения проблемы).
2. В качастве пользовательского критерия выбрано "прибыльность" - "profit factor" (уже использовалось на момент обнаружения проблемы).
3. Плановые прерывания тестирования выполняются со специальным кодом деинициализации 782.
{if(условие прерывания) { OnDeinit(782); ExpertRemove(); }}//if(условие прерывания)Который обрабатывается в OnDeinit():
Сигнальная переменная TestRes устанавливается в 1.0 при инициализации советника и сбрасывается в 0.0 при деинициализации по плановому прерыванию работы.
Переменная TestRes используется при расчете результата тестирования:
Теперь имеем следующие возможные значения оптимизируемого параметра:
0 .. 999999 - нормальное завершение прогона с расчетом результата.
0 - нормальное прерывание работы, результат не рассчитан.
-1 - что-то пошло не так, внеплановое прерывание работы (ожидается при повторении проблемы).
3. Плановые прерывания тестирования выполняются со специальным кодом деинициализации 782.
Который обрабатывается в OnDeinit():
Это самообман - OnDeinit будет вызван дважды. Вызвать OnDeinit можно сколько угодно раз самому. А вот создать Deinit-событие, по которому сработает OnDeinit - это только ExpertRemove в Тестере. И он свой Reason сгенерирует, а не кастомный.
Это самообман - OnDeinit будет вызван дважды. Вызвать OnDeinit можно сколько угодно раз самому. А вот создать Deinit-событие, по которому сработает OnDeinit - это только ExpertRemove в Тестере. И он свой Reason сгенерирует, а не кастомный.
Да, второй раз будет вызван по ExpertRemove(), но в реальной программе OnDeinit() использован как завершающая функция, выполняющая различные наборы действий в зависимости от причины деинициализации.
Принудительный вызов используется в пользовательских целях в частности для обработки пользовательского завершения программы, а автоматический (например по ExpertRemove()) - в системных.