OnBookEvent - буферизуется или нет ?

 

Может ли быть ситуация, когда вызван OnBookEvent но есть ещё буферизованные (более свежие) сообщения стакана.

То есть имеет-ли смысл там несколько раз вызывать MarketBookGet (с перепроверкой результатов конечно) чтобы получить максимально актуальные данные ?

 
Имеет смысл даже SymbolInfoTick в OnTick вызывать не единожды.
 
fxsaber #:
Имеет смысл даже SymbolInfoTick в OnTick вызывать не единожды.

я потому и спрашиваю :-)

что приходится SymbolInfoTick перезапрашивать в мелком цикле

но с ним и мороки меньше и событие более редкое.. OnBookEvent более частое и лишний цикл там очень не хочется

 
Maxim Kuznetsov #:

что приходится SymbolInfoTick перезапрашивать в мелком цикле

Это как?

но с ним и мороки меньше и событие более редкое.. OnBookEvent более частое и лишний цикл там очень не хочется

Если после MarketBookGet идет код с возможным лагом - имеет смысл после этого кода проверить на актуальность.

 
fxsaber #:

Это как?

Если после MarketBookGet идет код с возможным лагом - имеет смысл после этого кода проверить на актуальность.

примерно так :

// в классе - есть поле tick куда заполняется наиболее актуальный
void XXXX::CheckTick(void) {
   MqlTick tmp;
   if (!SymbolInfoTick(_Symbol,tmp)) {
      return;
   }
   if (tmp.time>tick.time ||
      (tmp.volume>=tick.volume && tmp.bid!=tick.bid && tmp.ask!=tick.ask)) {
      tick=tmp;
      for(int pass=0;pass<8;pass++) {
         if (!SymbolInfoTick(_Symbol,tmp)) break;
         if (tmp.time==tick.time && tmp.volume==tick.volume && tmp.ask==tick.ask && tmp.bid==tick.bid) break;
         tick=tmp;
      }
      OnRealTick();
   }
}

CheckTick() вызывается первым внутри всех обработчиков OnXXX, включая OnTick, кроме OnBookEvent (там отдельная свистопляска)

тогда выгребается последний тик максимально быстро.

PS/ вот ради такого :


быстро-быстро взять маковку
 
Maxim Kuznetsov #:

CheckTick() вызывается первым внутри всех обработчиков OnXXX, включая OnTick

тогда выгребается последний тик максимально быстро.

С SymbolInfoTick ничего подобного не делаю. А вот при чтении текущих ордеров/позиций - запросто. Потому как пока по всем пройдешься, некоторые уже успевают измениться.
 
SymbolInfoTick всегда отдает последний известный на момент вызова тик. Вызывать функцию в цикле без всякой задержки (предположительно, расчетов, выполняемых после предыдущего вызова) не имеет смысла.
 
Stanislav Korotky #:
SymbolInfoTick всегда отдает последний известный на момент вызова тик. Вызывать функцию в цикле без всякой задержки (предположительно, расчетов, выполняемых после предыдущего вызова) не имеет смысла.

однако нет...

 
Maxim Kuznetsov #:

однако нет...

Может быть имеете в виду что-то другое, но вводите людей в заблуждение. SymbolInfoTick всегда отдает последний известный на момент вызова тик. Если получаете из функции разные значения, значит между вызовами функции прошло достаточно много времени, чтобы проскочил как минимум 1 тик.