ошибка в тиковых данных в тестере стратегий в режиме "каждый тик на основе реальных тиков"

 

Столкнулся с такой проблемой, что при подсчете дельты за свечу, в тестере стратегий сбиваются тиковые данные. Функцию прикладываю

//+------------------------------------------------------------------+
//| Calculate Delta                                                  |
//+------------------------------------------------------------------+
int CalcDelta(datetime CD_time,bool CD_print)
  {
   MqlTick  CD_ticks[];
//MqlRates CD_rates[1]; 
   int      copied_rates=0,copied_ticks=0,CD_delta=0;
//ArrayFree(CD_ticks);
//copied_rates = CopyRates(Symbol(), 0, CD_time, 1, CD_rates);
//if(copied_rates > 0)
//{
   copied_ticks=CopyTicksRange(Symbol(),CD_ticks,COPY_TICKS_TRADE,1000*(ulong)CD_time,1000*(ulong)(CD_time+PeriodSeconds(_Period)));

   for(int icp=0; icp<copied_ticks; icp++)
     {
      if((CD_ticks[icp].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
         CD_delta+=(int)CD_ticks[icp].volume;

      if((CD_ticks[icp].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
         CD_delta-=(int)CD_ticks[icp].volume;
     }
//}
   if(CD_print)
      Print(_Period,"  ",CD_ticks[0].time,"  ",CD_ticks[copied_ticks-1].time,"  ",CD_time);
   return(CD_delta);
  }

сбой тиков в тестере

При дальнейшей распечатке получалось так, что первый копируемый тик становился не в начале выбранного таймфрейма, а по сути с первого дня тестирования.

Понять не могу, то ли у меня какая-то ошибка, или это сбой в тестере стратегий в тиковых данных. 

 
Тоже что то не понял. На демо счете от метаквотов на Si-6.18, например, не правильно показывает.. На eurusd - вроде правильно.. Причем, это не в тестере
void OnStart()
{
   ResetLastError();
   MqlTick ticks[];
   
   datetime dt1 = (TimeCurrent() - 900) * 1000, dt2 = TimeCurrent() * 1000;
   int received = CopyTicksRange(Symbol(), ticks, COPY_TICKS_ALL, dt1, dt2);
   
   if (received > 0) {
      double min = INT_MAX;
      double max = 0;
      
      for(int i = 0; i < received; i++) {
         if (ticks[i].bid > 0.0) {
            if (ticks[i].bid > max) {
               max = ticks[i].bid;
            }
            if (ticks[i].bid < min) {
               min = ticks[i].bid;
            }
         }
      }
      
      double sym_point = SymbolInfoDouble(Symbol(), SYMBOL_POINT);
      if (sym_point > 0.0) {
         Comment("\nmax = " + DoubleToString(max) + "\nmin = " + DoubleToString(min) + "\nsym_point = " + DoubleToString(sym_point) +"\ndev = " + DoubleToString(double(max - min) / double(sym_point)) + "\nGetLastError = " + IntegerToString(GetLastError()) + "\nreceived = " + IntegerToString(received));
      }
   }
}
Подскажите, как правильно пользоваться CopyTicksRange
 


Ilnur Khasanov
:

Тоже что то не понял. На демо счете от метаквотов на Si-6.18, например, не правильно показывает.. На eurusd - вроде правильно.. Причем, это не в тестере
Подскажите, как правильно пользоваться CopyTicksRange

datetime dt1 = (TimeCurrent() - 900) * 1000, dt2 = TimeCurrent() * 1000;
mr.edson:

Столкнулся с такой проблемой, что при подсчете дельты за свечу, в тестере стратегий сбиваются тиковые данные. Функцию прикладываю

copied_ticks=CopyTicksRange(Symbol(),CD_ticks,COPY_TICKS_TRADE,1000*(ulong)CD_time,1000*(ulong)(CD_time+PeriodSeconds(_Period)));


Это что такое Вы со временем хитрое вытворяете? 
Зачем Вы ищите тики в далеком будущем , а именно примерно в 50450 году?

 
Nikolai Semko:


Это что такое Вы со временем хитрое вытворяете? 
Зачем Вы ищите тики в далеком будущем , а именно примерно в 50450 году?

Сори, за нехороший код... Я пробовал разные варианты. В CopyTicksRange в миллисекундах надо указывать, указывал в его параметрах умноженное на 1000 - результат такой же..
Покажите, плз, строчку кода как брать за последние n секунд.
 
Ilnur Khasanov:
Сори, за нехороший код... Я пробовал разные варианты. В CopyTicksRange в миллисекундах надо указывать, указывал в его параметрах умноженное на 1000 - результат такой же..

Ой, это я сори. Был не прав. Забыл что там миллисекунды.

Покажите, плз, строчку кода как брать за последние n секунд.

может так без последней даты будет лучше, т.к.  TimeCurrent() это время в секундах и мы можем потерять тики пришедшие за остаток округленной секунды:

   int N=900;
   ulong dt1 = 1000*(TimeCurrent()-N);
   int received = CopyTicksRange(Symbol(), ticks, COPY_TICKS_ALL, dt1);
 
Ilnur Khasanov:
Тоже что то не понял. На демо счете от метаквотов на Si-6.18, например, не правильно показывает.. На eurusd - вроде правильно.. Причем, это не в тестере
Подскажите, как правильно пользоваться CopyTicksRange

Да, действительно, проблема существует. На Si-6.18 CopyTicksRange жестко врет. 
Может быть проблема, что это скрипт. Сейчас не могу проверить, т.к. нет котировок по этому символу. Нужно попробовать CopyTicksRange на индикаторе когда пойдут котировки.

 
mr.edson:

Какой сервер? MQ-Demo?

 
Ilnur Khasanov:
Тоже что то не понял. На демо счете от метаквотов...

На демо-счете от MQ тиковые данные поступают с некорректными флагами! Не используйте его для работы с торговыми тиками.

 
Я надеюсь сервисдеск обратит наконец внимание на мою последнюю заявку по тикам (#1939072) и я смогу наконец дописать статью по работе с торговыми тиками.
 
Alexey Kozitsyn:

Какой сервер? MQ-Demo?

Да, этот
 
Alexey Kozitsyn:

На демо-счете от MQ тиковые данные поступают с некорректными флагами! Не используйте его для работы с торговыми тиками.

Не важно демо или не демо, ошибки стоит устранить.
Причина обращения: