CopyTicks не выдает ошибку

 

При запросе тиков, которые в действительности не существуют, CopyTicks вместо ошибки выдает тики, которые относятся ко времени, более раннему, чем начальное:

MqlTick g_arrfTicks[];

void OnStart()
{
   datetime dtTime = TimeCurrent() + 10 * 60;
   ulong uTime = dtTime * 1000;

   int nIndex = 1;
   while (ReceiveTicks(uTime, nIndex) && !IsStopped())
      nIndex++;
}

bool ReceiveTicks(ulong &uTime, int nIndex)
{
   Print(nIndex, ", start from: ", datetime(uTime / 1000), ".", uTime % 1000);
   int nSize = CopyTicks(_Symbol, g_arrfTicks, COPY_TICKS_ALL, uTime);
   if (nSize < 0)
   {
      Alert(nIndex, ". Error: ", GetLastError());
      return false;
   }
   
   if (nSize == 0)
   {
      Alert(nIndex, ". No ticks found");
      return false;
   }
   
   if (ulong(g_arrfTicks[0].time_msc) < uTime)
   {
      Print("Ticks Error!!! size:", nSize);
      return false;
   }

   if (nSize < 10)
   {
      for (--nSize ; nSize > 0; --nSize)
         Print(nIndex, ". tick[", nSize, "]: ", (datetime)(g_arrfTicks[nSize].time_msc / 1000));
   }
   else
      Print(nSize, " ticks received ", nIndex);
      
   Print(nIndex, ", size: ", nSize, ", last tick: ", datetime(g_arrfTicks[nSize - 1].time_msc / 1000), ".", g_arrfTicks[nSize - 1].time_msc % 1000);
   uTime = g_arrfTicks[nSize - 1].time_msc + 1;   
   return true;
}

Если поставить более далекую дату (более 10 минут от текущего времени), то получаем ожидаемое:

2021.05.13 22:55:55.487 Test (EURUSD,M1)        Alert: 1. No ticks found

Если дата начала находится в пределах 10 минут от текущего времени, то получаем следующее:

2021.05.13 22:57:13.945 Test (EURUSD,M1)        Ticks Error!!! size:2000

Баг CopyTicks()?

 
 
fxsaber:
Было.

Я так понял, что реакции разработчиков на это так и не последовало? Решать придется костылями: если функция вернула тики, которые имеют время ранее, чем начальное запрошенное время, то считать, что тиков больше нет. Пока вроде такой подход получается.

 
Ihor Herasko:

Я так понял, что реакции разработчиков на это так и не последовало?

Не среагировали.

 
fxsaber:

Не среагировали.

Понятно. Спасибо.

 
Ihor Herasko:

Понятно. Спасибо.

А как им реагировать если вы запрашиваете тики не существующего времени?

 
Alexey Viktorov:

А как им реагировать если вы запрашиваете тики не существующего времени?

Ошибку вернуть, очевидно же.

 
Alexey Viktorov:

А как им реагировать если вы запрашиваете тики не существующего времени?

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

 
PapaYozh:

Ошибку вернуть, очевидно же.

Совсем не очевидно. В документации написано, что если время 0, то возвращаются последние не более 2000 тиков. Так вот время в будущем может быть тоже расценивается как 0.

В чём проблема проверить какое время суёте в функцию?

Не понимаю почему нормальную проверку люди называют костылями.

 
Ihor Herasko:

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

Так ведь есть функция возвращающая последний тик в структуру. Проблема проверить?

 
Alexey Viktorov:

Так ведь есть функция возвращающая последний тик в структуру. Проблема проверить?

Да, проблема. Для чего писать дополнительный код, проверяя то, что должна проверить функция (это ее работа, у нее есть все данные для этого)? Если тиков с запрашиваемым временем не существует, то пусть вернет 0, а не набор тиков, начинающихся с  начала суток и заканчивающихся, где придется. То есть даже если функция такое время определяет как 0, то все равно результат ее выполнения неправильный.

Если Вас реально интересует эта проблема, а не "просто поговорить", то запустите приведенный пример и посмотрите, какие тики возвращает такой запрос.

Причина обращения: