Принудительная остановка тестирования: TesterStop

При необходимости, в зависимости от возникших условий, разработчик может остановить тестирование эксперта досрочно. Например, это можно сделать при достижении заданного количества убыточных сделок или уровня просадки. Для этой цели в API имеется функция TesterStop.

void TesterStop()

Функция отдает команду на завершение работы тестера, то есть остановка произойдет только после того, как программа вернет управление среде исполнения.

Вызов TesterStop считается нормальным завершением тестирования, и поэтому будет вызвана функция OnTester с отдачей тестеру стратегий всей накопленной торговой статистики и значения критерия оптимизации.

Существует и альтернативный штатный способ прерывания тестирования — с помощью уже известной нам функции ExpertRemove. После вызова ExpertRemove также будет получена собранная к моменту вызова торговая статистика, однако существуют и некоторые отличия.

В результате вызова ExpertRemove советник выгружается из памяти агента, поэтому для выполнения прохода на следующем наборе параметров понадобится время на повторную загрузку MQL-программы. При использовании TesterStop этого не происходит, и данный способ является более предпочтительным в плане быстродействия.

С другой стороны, вызов ExpertRemove взводит в MQL-программе флаг остановки _IsStopped, что можно стандартным образом использовать в разных частях программы для финализации ("подчистки" ресурсов). Вызов же TesterStop не взводит данный флаг, и потому разработчику может потребоваться ввести свою собственную глобальную переменную, обозначающую досрочную остановку, и обрабатывать её специфическим образом.

Важно отметить, что TesterStop предназначена для остановки только одного прохода тестера.
 
В MQL5 нет функции для досрочной остановки оптимизации. Поэтому, например, если ваш эксперт обнаружит, что оптимизация запущена на неправильной модели генерации тиков — а это можно обнаружить уже только после запуска оптимизации (обработчик OnTesterInit здесь не поможет) — то вызовы TesterStop или ExpertRemove будут прерывать новые проходы, но сами проходы будут порождаться и порождаться, генерируя массовые нулевые результаты. Мы это увидим в большом примере эксперта, в котором будет использована защита от запуска по ценам открытия.
 
Можно было бы предположить, что вызов ExpertRemove в той копии эксперта, которая выполняется в терминале и фактически является менеджером оптимизации, приведет к остановке оптимизации. Но это не так. И даже закрытие графика с этим экспертом, работающим в режиме фреймов, не останавливает оптимизацию.

Предлагается самостоятельно попробовать данные функции в действии.