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

 

Цитата из справки:

Оптимизация — эта вкладка позволяет управлять ограничениями во время оптимизации. Если в процессе отдельного прогона будет достигнуто любое из условий, этот прогон советника прервется.

Соответственно написал функцию прерывания отдельного прогона с условием Непрерывное количество убыточных сделок = Amount:

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;
}

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

Пример советника, показывающий это:

#define NUM 10
 
extern int a = 1;
extern int Porog = 10;
extern int MaxAmountLoss = 10;
 
void start()
{
  int i;
  
  if (a > Porog)
    Stop(MaxAmountLoss);
  
  for (i = 0; i < NUM; i++)
    MathSqrt(i);
    
  return;
}

Оптимизируем параметр a от 1 до 100 с шагом 1.

условие Непрерывное количество убыточных сделок = 10

Согласно справки после 10-го прохода вычислений присходить не должно, но все вычисляется вхолостую.

 
getch:

...

Оптимизируем параметр a от 1 до 100 с шагом 1.

условие Непрерывное количество убыточных сделок = 10

Согласно справки после 10-го прохода вычислений присходить не должно, но все вычисляется вхолостую.


Т.е. при А>10 в отчете оптимизатора кол-во сделок на этих проходах исчисляется миллионами (по 10 сделок на каждом тике = 10 х <кол-во тиков>)?
 
Оптимизатор пишет "stopped due test limit 'consecutive loss trades=10' reached with inputs: a=11", при этом не занося в ничего в "результаты оптимизации". Прерывания прогона, однако, не происходит. Продолжаются вычисления, в данном случае квадратного корня.
 
getch:
Оптимизатор пишет "stopped due test limit 'consecutive loss trades=10' reached with inputs: a=11", при этом не занося в ничего в "результаты оптимизации". Прерывания прогона, однако, не происходит. Продолжаются вычисления, в данном случае квадратного корня.

Я думаю что так и должно быть, т.к. оптимизатор, скорее всего, оценивает параметры завершения после выхода из ф-ции Start, а ни как не во время ее выполнения... Могу ошибаться.
 
Выйдя из функции Start оптимизатор, надеюсь, видит, что подряд совершено, как минимум, 10 убыточных сделок. Согласно справки в таком случае прогон должен быть прерван.
 
getch:
Выйдя из функции Start оптимизатор, надеюсь, видит, что подряд совершено, как минимум, 10 убыточных сделок. Согласно справки в таком случае прогон должен быть прерван.

А он его разве не прерывает? Мне кажется что после выхода из "Старт" оптимизатор должен начинать новый проход для а=12, затем прервать после однократного выполнения функции старт, затем а=13 и т.д.
 
Из справки следует, что и разработчикам так кажется. Но этого не происходит. Если в примере сделать NUM = 1000, не дождешься конца оптимизации.
 
getch:
Из справки следует, что и разработчикам так кажется. Но этого не происходит. Если в примере сделать NUM = 1000, не дождешься конца оптимизации.

Так мы ж вродь определись что ф-ция Start отрабатывает до конца перед прерыванием прохода... Все верно получается 1000 корней извлекает потом выходит...
 
В том-то и дело, что Start продолжает запускаться на каждом новом тике со всеми вычислениями.
 
getch:
В том-то и дело, что Start продолжает запускаться на каждом новом тике со всеми вычислениями.

Т.е. если вместо корня поставить, скажем, Print(a), то при а=11 число 11 будет выведено столько раз, сколько тиков в истории?
 
Во время оптимизации Print в журнал не выводится. Но если дописывать в файл - так и получится.