Как замедлить работу советника в несколько раз?

 
Да легко, как оказалось :)

#include <stdlib.mqh>
 
extern bool Kick;
extern int Counter;
 
bool Trigger;
 
int start()
{
    double cci;
    
    if (!Kick)
    {
        Trigger = !Trigger;
        if (Trigger)
            return (0);
    }
 
    cci = iCCI(NULL, 0, 20, PRICE_CLOSE, 1);
    
    return(0);
}
Если при тестировании по ценам открытия на длинной истории индикатор вызывается не каждый тик, а, скажем, каждый второй, как, например, в приведенном коде, если Kick сброшен, то скорость прохода теста падает экспоненциально до неприлично медленной.

А если флаг выставить и вызывать индикатор каждый тик, скорость прохода теста оценить трудно, так как он просто пролетает незаметно.

Особенно впечатляет время оптимизации по 10000 параметрам (для этого, собственно, там Counter):
23 минуты для каждого тика.
680 часов ! для каждого второго.

Почти в 2000 раз.

Это для годовой истории на 5-тиминутках.

Сборка 4.198.19.10.06
 
Да, если индикатор не расчитывался на протяжении двух и более баров (условия на самом деле сложнее), то индикатор считает, что произошли коренные изменения в истории и пересчитывает весь массив, отключая экономичный перерасчет. Поэтому и увеличение времени расчетов в сотни и тысячи раз. Экономичные перерасчеты работают только на расчете того же бара или при переходе на следующий бар.

Будем думать, как в тестере использовать другой механизм проверки экономичного прохода.
 

Я думаю, что при использовании метода моделирования по ценам открытия, нельзя говорить о тиках. Вы пересчитываете индикатор каждый второй бар, а не каждый второй тик. Большая семантическая разница.

 
stringo:

Я думаю, что при использовании метода моделирования по ценам открытия, нельзя говорить о тиках. Вы пересчитываете индикатор каждый второй бар, а не каждый второй тик. Большая семантическая разница.

Именно семантическая. Вот это тормозит на контрольных точках:

#include <stdlib.mqh>
 
extern bool Kick;
 
int Counter = 32;
 
int start()
{
    double cci;
    
    if (!Kick)
    {
        Counter--;
        if (Counter > 0)        
            return (0);
        Counter = 32;
    }
 
    cci = iCCI(NULL, 0, 20, PRICE_CLOSE, 1);
    
    return(0);
}
Я прекрасно понимаю, что проблема не в том, что индикатор считается не на всех тиках, а в том, что не на всех барах. Все-таки start() - это обработчик тиков, а не баров. Отсюда и не вполне корректная терминология.
 
Будем думать. Спасибо, что подняли вопрос.
Причина обращения: