Несоответствие тиков в тестере

 

При проверке своего тикового индикатора в тестере наткнулся на странное поведение индикатора - количество собираемых им тиков не совпадает с тем количеством, которое отображается в параметре Volume. Создал специальный индикатор для проверки:

#property strict
#property indicator_buffers 1
#property indicator_chart_window
#property indicator_color1 clrDodgerBlue

string g_strComment;
datetime g_dtBarTime;
int g_nTicks;

int OnInit()
{
   g_strComment = "";
   g_dtBarTime = 0;
   g_nTicks = 0;
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
   
}
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   if (g_dtBarTime != time[0])
   {
      if (g_dtBarTime > 0)
         g_strComment += "\nСвеча: " + TimeToString(g_dtBarTime) + ", тиков: " + IntegerToString(g_nTicks) + ", реальный: " + IntegerToString(tick_volume[1]);

      g_dtBarTime = time[0];
      g_nTicks = 0;
   }
   
   g_nTicks++;
   Comment(g_strComment);
   
   return(rates_total);
}

Предварительно синхронизировал историю при помощи period_converter. В итоге получил такую картину:

Вывод получается неутешительный: не все тики тестера обрабатываются индикатором, хотя иногда получается наоборот - пришло тиков больше, чем есть на самом деле (свеча 2017.06.01 00:55). Возможно, я где-то ошибся. Но в онлайн все работает правильно.

 
Ihor Herasko:  Вывод получается неутешительный: не все тики тестера обрабатываются индикатором, хотя иногда получается наоборот - пришло тиков больше, чем есть на самом деле (свеча 2017.06.01 00:55). Возможно, я где-то ошибся. Но в онлайн все работает правильно.

Попробуйте вместо функции Comment накапливать в массиве, заранее объявив его нужного размера. Графические операции занимают много процессорного времени.

 
STARIJ:

Попробуйте вместо функции Comment накапливать в массиве, заранее объявив его нужного размера. Графические операции занимают много процессорного времени.


У меня в данном случае нет задачи оптимизации чего-либо. Речь сугубо о том, что тестер дает не то количество тиков индикатору, которое ожидается. Если Вы намекаете на то, что индикатор не успевает отлавливать тики, то к тестеру это не относится. В тестере новый тик не приходит, пока программа не обработала предыдущий. Это не онлайн. Хотя, что интересно, онлайн все замечательно работает.

 

Понял, что в тестере все тики обрабатываются без пропусков

 
Ihor Herasko:

При проверке своего тикового индикатора в тестере наткнулся на странное поведение индикатора - количество собираемых им тиков не совпадает с тем количеством, которое отображается в параметре Volume. 

Так было всегда!

 
Ihor Herasko:

При проверке своего тикового индикатора в тестере наткнулся на странное поведение индикатора - количество собираемых им тиков не совпадает с тем количеством, которое отображается в параметре Volume. Создал специальный индикатор для проверки:

Предварительно синхронизировал историю при помощи period_converter. В итоге получил такую картину:

Вывод получается неутешительный: не все тики тестера обрабатываются индикатором, хотя иногда получается наоборот - пришло тиков больше, чем есть на самом деле (свеча 2017.06.01 00:55). Возможно, я где-то ошибся. Но в онлайн все работает правильно.

попробуйте добавить следующее условие вместо вашего.
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
if(MathAbs(ask-askprev)>=_Point)g_nTicks++;
if(MathAbs(bid-bidprev)>=_Point)g_nTicks++;
askprev=ask;
bidprev=bid;
соответственно создайте 2 глобальные переменные askprev bidprev и перенесите Comment туда где у вас идет обнуление параметра q_nTicks.

мы имеем дело с изменением цены, цены две, аск и бид. могут измениться сразу обе, может измениться только аск, может измениться только бид. и в любом из этих случаев будет вызвана данная функция.

с уважением.
 
fxsaber:

Так было всегда!


Под "всегда" что подразумеваете? Возможность тестирования индикаторов в тестере появилась сравнительно недавно - год или два назад. Мне в принципе непонятно, почему в тестере не обрабатывается каждый тик. Это ведь однопоточный процесс.

 
Andrey Kisselyov:
попробуйте добавить следующее условие вместо вашего.соответственно создайте 2 глобальные переменные askprev bidprev и перенесите Comment туда где у вас идет обнуление параметра q_nTicks.

мы имеем дело с изменением цены, цены две, аск и бид. могут измениться сразу обе, может измениться только аск, может измениться только бид. и в любом из этих случаев будет вызвана данная функция.

с уважением.

В МТ4 тестере не может измениться Ask без изменения Bid, т. к. он (Ask) зависит от Bid. Онлайн - другое дело.

 
Ihor Herasko:

Под "всегда" что подразумеваете? Возможность тестирования индикаторов в тестере появилась сравнительно недавно - год или два назад. Мне в принципе непонятно, почему в тестере не обрабатывается каждый тик. Это ведь однопоточный процесс.

Количество генерируемых тиков тестера (индикатор или советник - не важно) не совпадает с суммарным историческим тиковым объемом за интервал тестирования. И так было всегда.

Можете в оффлайне увеличить исторический тиковый объем в 100 раз, от этого тестер не начнет работать в 100 раз медленнее в режиме "Все тики".