Простой способ прерывания отдельного прогона во время оптимизации НЕ РАБОТАЕТ - страница 2

 
extern int a = 0;
extern int MaxAmountLoss = 10;
 
void start()
{
  string Str;
  int handle;
  static int Count = 0;
  
  if (a > MaxAmountLoss)
  {
    Stop(MaxAmountLoss);
 
    if (IsOptimization())
    {
      handle = FileOpen("Test.txt", FILE_READ|FILE_WRITE, "\t");
      FileSeek(handle, 0, SEEK_END);
      
      Str = "a = " + a + ", Count Tick = " + Count;
      FileWrite(handle, Str); 
 
      FileClose(handle);
      Count++;
    }
  }
 
  return;
}
 
getch:
Во время оптимизации Print в журнал не выводится. Но если дописывать в файл - так и получится.

Запустил у себя, проверил, оптимизатор действительно пишет что проход прерван, а в файл и правда значения а записываются одинаковое кол-во раз, вне зависимости от того был ли "прерван" проход - глюк какой-то.
 
getch:
void Stop( int Amount )
{
  int Ticket;
  double MinLot;
  string Symb;
  
  Symb = Symbol();
  MinLot = MarketInfo(Symb, MODE_MINLOT);
 
  while (Amount > 0)
  {
    Ticket = OrderSend(Symb, OP_BUY, MinLot, Ask, 0, 0, 0);
    OrderClose(Ticket, MinLot, Bid, 0);
    
    Amount--;
  }
  
  return;
}

Но при вызове этой функции прерывания прогона не происходит.


Первая строчка должна быть:

void Stop( int& Amount )

читайте:

https://docs.mql4.com/ru/basis/variables/formal

Дело в том, что в вашем варианте после возврата из функции переменная Amount не изменить свое значение.

 

Itso, вы поторопились. Код верный.

 
getch:

Itso, вы поторопились. Код верный.


Это легко проверяется, достаточно в файл еще писать значение MaxAmountLoss
 

Прочтите внимательно первый пост. Цели менять переменную MaxAmountLoss нет.

Речь идет о не работе описанного в справке механизма прерывания отдельного прогона в оптимизаторе.

 
Уважаемые разработчики, прокомментируйте данную ситуацию. Прерывание прогона актуально, т.к. это значительно бы экономило время при длительных оптимизациях со своими критериями пропуска ненужных вариантов.
 
Проверим с утра.
 
Проверили. Дело в том, что функция start() является атомарной. Это означает только то, что функцию start() нельзя прервать в любой момент времени, она будет полностью исполнена на данном тике, если была вызвана. Будь это в реал-тайме или в тестере. Поэтому, если необходимо не проводить полное тестирование по всей истории для данного набора параметра, вы действительно можете на первом тике бектеста провести заданное количество убыточных сделок, и это количество должно превышать то ограничение на количество последовательных убыточных сделок, которое прерывает данный проход. Но один тик функция start() отработает в любом случае!

//+------------------------------------------------------------------+
//|                                    CheckOptimizationBreakout.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru/"
#define NUM 10
 
extern int a = 1;
extern int Porog = 10;
extern int MaxAmountLoss = 30;
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Stop( int Amount )
{
  int Ticket;
  double MinLot;
  string Symb;
  
  Symb = Symbol();
  MinLot = MarketInfo(Symb, MODE_MINLOT);
 
  while (Amount > 0)
  {
    Ticket = OrderSend(Symb, OP_BUY, MinLot, Ask, 0, 0, 0);
    OrderClose(Ticket, MinLot, Bid, 0);
    
    Amount--;
  }
  
  return;
}
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  int i;
  
  if (a > Porog)
    Stop(MaxAmountLoss);
  
  for (i = 0; i < NUM; i++)
    MathSqrt(i);
    
  return;   
//----
   return(0);
  }
  
//+------------------------------------------------------------------+


Таким образом, данный способ пропуска тестирования с заданным набором параметров действительно работает, просто не забывайте в "Свойствах эксперта"(Expert properties) на закладке "Оптимизация"(Optimization) ставить правильно указывать "Непрерывное количество убыточных сделок" (Consecutive loss trades).

 

При всем уважении, не работает.

Прогон не прерывается: продолжаются вычисления.

Код выше, с записью в файл.