CheckInputs - нахождение аварийных проходов при Оптимизации советника

28 января 2025, 20:48
fxsaber
0
69
Во время Оптимизации советника некоторые проходы могут завершаться аварийно.

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

Новая версия платформы MetaTrader 5 build 4755: общие улучшения

fxsaber, 2025.01.24 06:06

В Журнале Тестера такая ерунда.
2025.01.24 07:35:17.424 Core 12 genetic pass (0, 353) tested with error "critical runtime error 502 in OnTester function (array out of range, module Experts\Tester.ex5, file Deal.mqh, line 26, col 16)" in 0:00:24.587
2025.01.24 07:35:44.462 Core 11 genetic pass (0, 324) tested with error "critical runtime error 502 in OnTester function (array out of range, module Experts\Tester.ex5, file Deal.mqh, line 26, col 16)" in 0:00:24.636

Никаких данных (значения входных параметров) об аварийных проходах нет.


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

И такая возможность имеется через CheckInputs-механизм.


Покажем его работу на примере.


Пример.


Будем оптимизировать такой советник.

input int inRange1 = 0;
input group "GroupName"
input int inRange2 = 0;

void OnInit()
{
  int Array[] = {1, 2, 3};
  
  Array[inRange1] = Array[inRange2];
}


По лаконичному исходнику видно, что код будет корректно выполняться только для 0<=inRangeX<=2. Поэтому inRangeX=3 будет создавать аварийный выход.


Запускаем Оптимизацию.

pass 3 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 9)" in 0:00:00.000
pass 7 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 9)" in 0:00:00.000
pass 11 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 9)" in 0:00:00.000
pass 12 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 27)" in 0:00:00.001
pass 13 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 27)" in 0:00:00.001
pass 14 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 27)" in 0:00:00.002
pass 15 tested with error "critical runtime error 502 in OnInit function (array out of range, module Experts\HelloWorld.ex5, file HelloWorld.mq5, line 11, col 27)" in 0:00:00.001
optimization finished, total passes 16 (successful 9 passes)
optimization done in 0 minutes 00 seconds

Видим, что семь проходов завершились аварийно, но ничего неизвестно про их входные параметры.


CheckInputs.

Запускаем в Терминале (не в Тестере) такой скрипт.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart() { MTTESTER::CheckInputs(); }


В Журнале будут записи.

bool MTTESTER::CheckInputs(): Experts\CheckInputs.mqh is generated.
Add the following line to Experts\HelloWorld.mq5.
#include "CheckInputs.mqh"


И вот эту строку прописываем в исходник нашего Тестерного советника (DLL не используются).

#include "CheckInputs.mqh"

input int inRange1 = 0;
input group "GroupName"
input int inRange2 = 0;

void OnInit()
{
  int Array[] = {1, 2, 3};
  
  Array[inRange1] = Array[inRange2];
}


Теперь компилируем, снова запускаем Оптимизацию и идем в Common-папку.


В этой папке семь файлов, каждый из которых содержит входные параметры соответствующих аварийных проходов.

inRange1=3
; GroupName
inRange2=3


Теперь можно скопировать в буфер обмена (CTRL+C) эти данные и перенести их во вкладку Настройки (CTRL+V) Тестера. После чего запустить одиночный проход аварийной комбинации.


Ограничения.

Предложенный механизм будет работать только на локальных Агентах исходной машины. Т.е. в Облаке или локальной Ферме работать не будет.


Самопроверка.

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


Чем заняты Агенты?

По изменениям в CheckInputs-папке можно видеть, какой Агент и что считает в настоящее время.



Ссылка на блог автора.