Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы 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-папке можно видеть, какой Агент и что считает в настоящее время.
Ссылка на блог автора.