Библиотеки: OnTickMulti - страница 3

 
Stanislav Korotky #:

Заглядывания в будущее нет, потому что если для времени X есть тики по нескольким символам, то вместе с первым событием на одном из инструментов, на остальных символах (для которых события еще находятся в очереди) будет предыдущий тик, а не следующий тик (как в примере, 00:04 было до 00:05, а не после).

Для синхронизации нужно её алгоритмически обеспечить в своем коде, например, в обработчике OnTick опрашивать время тиков по всем задействованным символам, прежде чем инициировать сделку. Но, в принципе, если арбитраж именно на тиках (а не барах или минутах), то трудно представить себе надежную синхронизацию, потому что тики на каких-то символах могут реально отсутствовать по несколько секунд.

Все относительно, для 1 инструмента будет отставание, а для другого заглядывание.

Там все плавает, в дебагере все синхронно, с почти пустым OnTick тоже.

Приходится писать бары в тики для теста, что бы сэмулировать нормально комиссию и спред.

Вот это пришлось выполнять в OnTick, чтобы расчеты кастомного тестера сошлись с МТ

   int size=ArraySize(T);
   if(size==0) return;
   datetime dt1=(datetime)SymbolInfoInteger(name1,SYMBOL_TIME);
   datetime dt2=(datetime)SymbolInfoInteger(name2,SYMBOL_TIME);
   while(sh1<size && T[sh1]<dt1) sh1++;
   while(sh2<size && T[sh2]<dt2) sh2++;
   while(sh1<size && T[sh1]==dt1)
     {if(D1[sh1]>0)  Buy(name1);
      if(D1[sh1]<0) Sell(name1);
      if(D1[sh1]==0) Close(name1);
      sh1++;
     }
   while(sh2<size && T[sh2]==dt2)
     {if(D2[sh2]>0)  Buy(name2,D2[sh2]);
      if(D2[sh2]<0) Sell(name2,fabs(D2[sh2]));
      if(D2[sh2]==0) Close(name2);
      sh2++;
     }
 
Stanislav Korotky #:

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

Боюсь, это не позволит в OnTick понять, что очередь тиков с текущим временем закончилась. Скорее всего, поможет только миллисекундный OnTimer.

 
Rorschach #:

Все относительно, для 1 инструмента будет отставание, а для другого заглядывание.

Есть текущее время (тестера) - только относительно него можно использовать терминологию о заглядывании в будущее. Если текущее время X, а для двух инструментов имеются тики соответственно для моментов X-1 и X-2 - то это последние известные актуальные тики, и обсчитывать алгоритмом нужно их. Вот если бы в момент X-2 кто-то попытался обсчитать тики для X-1 и X, то это было бы заглядывание в будущее. Но технически тестер не дает это сделать.
 
fxsaber #:

Боюсь, это не позволит в OnTick понять, что очередь тиков с текущим временем закончилась. Скорее всего, поможет только миллисекундный OnTimer.

Зависит от того, как писать условие в if по времени - нужно строгое >, а не >=, и не обсчитывать тик, который привел к срабатыванию условия. С таймером аналогично получится.
 
Stanislav Korotky #:
Зависит от того, как писать условие в if по времени - нужно строгое >, а не >=, и не обсчитывать тик, который привел к срабатыванию условия.
Не понял.
 
Stanislav Korotky #:
С таймером аналогично получится.
Там проще.
 
fxsaber #:
Не понял.

Навскидку, с идентификацией времени с точностью до миллисекунды (с секундами - аналогично):

// TODO: ArrayResize(lookback, <number-of-symbols>)
MqlTick lookback[];

void OnTickMulti(const string &symbol, const uint &index)
{
   static MqlTick t[1];
   static long timeCurrentMsc;
   
   SymbolInfoTick(symbol, t[0]);
   
   if(t[0].time_msc > timeCurrentMsc)
   {
      if(!timeCurrentMsc) // not very beginning, so this is a new millisecond
      {
         // TODO: use lookback[] ticks for analysis and trades
         // they don't yet include the current tick, because it's from next millisecond
         // ...
      }
      timeCurrentMsc = t[0].time_msc;
   }

   // only after analysis, update the registry with the new timestamp
   lookback[index] = t[0];
}

Но еще раз повторю (для Rorschach), что синхронизация по таким мелким интервалам иллюзорна. Тики по какому-то инструменту могут отсутствовать на протяжении секунд, тогда актуальная для них цена на самом деле может "устаревать". Если для кого-то важно, чтобы все цены были за одну и ту же [милли]секунду, то в приведенном фрагменте (в закоментированном блоке анализа) нужно дополнительно проверять равенство времен тиков и только при соблюдении этого условия торговать.

 
Stanislav Korotky #:

Навскидку, с идентификацией времени с точностью до миллисекунды (с секундами - аналогично):

Таким методом никак нельзя гарантировать актуальность тиков всех символов. Только через миллисекундный OnTimer.
 
fxsaber #:
Таким методом никак нельзя гарантировать актуальность тиков всех символов. Только через миллисекундный OnTimer.
Что подразумевается под актуальностью (этот метод отдает последние известные тики по всем инструментам, можно использовать CopyTicks, если речь об этом)? И каким образом OnTimer даст другой результат?
 

Stanislav Korotky #:
Что подразумевается под актуальностью (этот метод отдает последние известные тики по всем инструментам)?

Не будет больше тиков с последним известным временем.

И каким образом OnTimer даст другой результат?

Миллисекундный OnTimer гарантирует, что прошли все тики ДО этого таймерного события. Т.е. по всем символам тики актуальны.