Новая версия платформы MetaTrader 5 build 2340: Управление настройками счета в тестере и расширение интеграции с Python - страница 15

 

Вот модификация OnTimer

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(InpTimerSeconds%1000==0)
      ExpertRemove();
   ExtTimerCounter++;
  }

Вот результат оптимизации от 0 до 10 000


ExpertRemove работает

Похоже, никто не читал, как работает ExpertRemove

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.

...

При вызове ExpertRemove() в тестере стратегий после успешной инициализации советника тестирование завершится штатным образом с вызовом OnDeinit() и OnTester(). В этом случае будет получена вся торговая статистика и значение критерия оптимизации

 
Slava:

Вот модификация OnTimer

Вот результат оптимизации от 0 до 10 000


ExpertRemove работает

Похоже, никто не читал, как работает ExpertRemove

ExpertRemote был задействован, чтобы хоть как-то показать - при оптимизации (после одиночного теста) OnTimer не работает.

Тема обсуждение в en форуме: 

OnTimer not working since build 2345
OnTimer not working since build 2345
  • 2020.03.04
  • www.mql5.com
Hello everyone, Ever since build 2345, I have not been able to use the optimizer with my EA...
 
Slava:

Вот модификация OnTimer

Вот результат оптимизации от 0 до 10 000


ExpertRemove работает

Похоже, никто не читал, как работает ExpertRemove

Вот код без ExpertRemote - здесь просто деление на ноль в OnTimer.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2018, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
//---
CTrade         m_trade;                      // object of CTrade class
//--- input parameters
input int TimeSet = 15;
//---
bool     m_first  = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!EventSetTimer(TimeSet))
     {
      Print("Timer ERROR: ",GetLastError());
      return(INIT_FAILED);
     }
   m_first=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int d=0;
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int i=0; i<1; i++)
     {
      int d=1/i;
     }
//---
   if(m_first)
      if(m_trade.Buy(1.0,Symbol()))
         m_first=false;
  }
//+------------------------------------------------------------------+

Запускаем одиночный тест, затем оптимизацию. Результат - эксперт не заходит в OnTimer (в журнале нет ошибки)


 
Slava:

Уточните пожалуйста, будет ли разбор проблемы?

 
Vladimir Karputov:

Вот код без ExpertRemote - здесь просто деление на ноль в OnTimer.

Запускаем одиночный тест, затем оптимизацию. Результат - эксперт не заходит в OnTimer (в журнале нет ошибки)


И не должно быть.

При оптимизации в журнал тестера выводятся принты только в OnInit.

Из OnTick, OnTimer, OnTrade, OnDeinit, OnTester - нет. Даже ошибки.

Сделано специально, чтобы не забивать логи на диске. Всегда так было.


PS Вижу на скриншоте, что все результаты пришли без ошибок. Разберёмся

 
Slava:

И не должно быть.

При оптимизации в журнал тестера выводятся принты только в OnInit.

Из OnTick, OnTimer, OnTrade, OnDeinit, OnTester - нет. Даже ошибки.

Сделано специально, чтобы не забивать логи на диске. Всегда так было.

Хорошо - теперь деление на ноль я поставил, кроме OnTimer, в OnTick()

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2018, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
//---
CTrade         m_trade;                      // object of CTrade class
//--- input parameters
input int TimeSet = 15;
//---
bool     m_first  = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!EventSetTimer(TimeSet))
     {
      Print("Timer ERROR: ",GetLastError());
      return(INIT_FAILED);
     }
   m_first=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i=0; i<1; i++)
     {
      int d=1/i;
     }
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int i=0; i<1; i++)
     {
      int d=1/i;
     }
//---
   if(m_first)
      if(m_trade.Buy(1.0,Symbol()))
         m_first=false;
  }
//+------------------------------------------------------------------+

Результат оптимизации:

сразу в журнале видны ошибки:

то есть в OnTick эксперт заходит и конечно видит деление на ноль.


Если же из OnTick убрать деление на ноль и оставить деление на ноль в OnTimer - то никаких ошибок при оптимизации нет - так как эксперт при оптимизации не заходит в Ontimer.

 
Vladimir Karputov:

Вот код без ExpertRemote - здесь просто деление на ноль в OnTimer.

Запускаем одиночный тест, затем оптимизацию. Результат - эксперт не заходит в OnTimer (в журнале нет ошибки)


У меня в билде 2345 вот такой вывод в лог

...
2020.03.04 14:59:10.185 Core 01 pass 301 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 302 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 303 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 304 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 305 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 306 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 307 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 308 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 309 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
2020.03.04 14:59:10.185 Core 01 pass 310 tested with error "critical runtime error 503 in OnTimer function (zero divide, module Experts\Tester\TesterSimpleTimer.ex5, file TesterSimpleTimer.mq5, line 51, col 17)" in 0:00:00.000
...
 
Vladimir Karputov:

Хорошо - теперь деление на ноль я поставил, кроме OnTimer, в OnTick()

Результат оптимизации:

сразу в журнале видны ошибки:

то есть в OnTick эксперт заходит и конечно видит деление на ноль.


Если же из OnTick убрать деление на ноль и оставить деление на ноль в OnTimer - то никаких ошибок при оптимизации нет - так как эксперт при оптимизации не заходит в Ontimer.

Понятно, что есть проблема.

Пытаемся воспроизвести у себя

 

I have actually problems to ad a post:

Is I press Add the Comment nothing happens ?

It seems to be only the German forum - as here it works.

 
Alexey Kozitsyn:

Профилировщик работает не со всеми индикаторами. Исходный код "проблемного" индикатора прислал в ЛС.

После нажатие кнопки стоп ничего не происходит.

И это всё описание проблемы? Где детали? Как можно воспроизвести?

Профилировщик работает и с Вашим индикатором тоже. После нажатия кнопки стоп кое-что происходит


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