Тики в реальном времени - страница 20

 
Roman:

Что то вы всё намудрили.

Я же писал ранее, что трейды и левел2, это разные подписки на данные, соответственно это разные событийные обработчики.
По этому трейды нужно вызывать из ОнТик, а банды с объемом из ОнБук
А вы трейды пытаетесь вызывать из событий  ОнБук, а банды из ОнТик. При этом думая, что для трейдов ОнБук будет быстрее.
Не будет о быстрее, мне кажется это заблуждение, сравнивать два обработчика событий, предназначенные под каждый свой поток данных.
Я понимаю что это всё эксперименты, но не понимая логики сокетов вы бесконечно будете путаться в этих обработчиках ОнТик и ОнБук.

Я уже писал, если Вы не видели, "для меня нет альтернативы OnBookEvent()".

А все коды, результаты, объяснения - чтобы было понятно почему. 

Судя по Вашему посту - Вам не понятно... :)

Может быть Вы через сообщение читаете?

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

вот через OnTick() я могу получать не все данные. Так зачем мне использовать OnTick()?

 
prostotrader:

Я уже писал, если Вы не видели, "для меня нет альтернативы OnBookEvent()".

А все коды, результаты, объяснения - чтобы было понятно почему. 

Судя по Вашему посту - Вам не понятно... :)

Может быть Вы через топик читаете?

Да, я то понимаю что в вашем случае нет альтернативы, и это правильно.
И я понимаю о чём речь. Просто хотел акцентировать внимание на этом моменте, что трейды и левел2 это разные потоки данных.
И об этом нужно не забывать, а тем кто не знал, знать.
По этому если нужны трейды, то необходимые для этого функции нужно вызывать из ОнТик,
если нужны бид аск с объемом, или глубина стакана, то соответствующие функции вызывать из ОнБук.
Не корректно брать события из ОнБук и получать трейды, а из событий ОнТик пытаться получить объемы или глубину.  
А так то я понял, что вы просто объясняете другим, и попутно экспериментируете.

 
Roman:



А так то я понял, что вы просто объясняете другим, и попутно экспериментируете.

Правильно поняли.

Просто подобные эксперементы проводил 7 лет назад, выбрал OnbookEvent().

А сейчас решил проверить, вдруг что-то изменилось... Не изменилось.

 
prostotrader:

Дело в том, что Срочный ранок (ФОРТС) даже на "высоколиквидных" инструментах очень слабый,

т.е по нужной цене можно купить очень ограниченное кол-во контрактов, поэтому нужна не только цена,

но очень важен объем контрактов по этой цене.


А SymbolInfo не дает объема этой цены.

В связи с этом нужно использовать MarketBookGet(), который дает и цены и объем всего стакана.

Какое это имеет отношение к теме? Я только из-за этого и встрял, для получения тиков ОнБук не нужен, т.к. ОнТик точно не медленнее.

И зачем по 20 раз говорить про незаменимость ОнБук? В ней кто-то сомневается?


prostotrader:

И я не согласен, что при срабатывании OnTck() мы можем получать тики из истории.

Запоминая последнее время тика, при срабатывании OnTck() мы можем получать тики

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

Любой тик, пришедший в терминал — это уже история.

Но я говорил не об этом, а о построении ленты без пропусков (SymbolInfoTick в этом не поможет).

 
Aleksey Mavrin:

Хотел поставить проверить код для начала

Но что-то не могу открыть демо-счёт открывашки. Время нерабочее наверное, или ещё есть заморочки?

Тики в реальном времени

prostotrader, 2020.01.31 13:18

Account : 1007932

Investor  : FfiR87ty (read only password)
 
Andrey Khatimlianskii:

Какое это имеет отношение к теме? Я только из-за этого и встрял, для получения тиков ОнБук не нужен, т.к. ОнТик точно не медленнее.

И зачем по 20 раз говорить про незаменимость ОнБук? В ней кто-то сомневается?

Любой тик, пришедший в терминал — это уже история.

Но я говорил не об этом, а о построении ленты без пропусков (SymbolInfoTick в этом не поможет).

Кажется вы не допоняли друг друга :))
Он вам про лучшие бид аск с объемом, а вы ему про трейды и ленту сделок :)) 
Ну да ладно, теперь разобрались думаю.

Ну смотря как посмотреть, что пришедший тик - это уже история.
Если для сервера биржи, то да это уже история, для терминала не совсем.
Ведь терминал для ОнТик хранит последние 4096 записи в кэше, для горячего доступа к ним, а затем уже скидывает в историю на диск.
Тогда получается это не совсем ещё история )), то есть при аварийном выключении кеш не сохраниться наверно на диск.
А при повторном запуске терминала, потерянные данные в кеше, уже подгрузятся с сервера. Но это касается только ОнТик данных.
ОнБук скорее всего не подгружает данные.

 

Я думал на каждый ОнТик приходится минимум один ОнБук. но тогда вот это не понял


 

Поставил вот этот код На Демо Открытия, посчитать среднюю и макс. задержку между ОнТик и следующим за ним ОнБук.

Код на коленке, может кривой, по результатам буду смотреть.

//+------------------------------------------------------------------+
//|                                                   TestOnBook.mq5 |
//|                                           Copyright 2019, Allex@ |
//|                                                 alex-all@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Allex@"
#property link      "alex-all@mail.ru"
#property version   "1.00"
//---
bool is_book;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK        // Use OnTick
};

input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
input int   SecForPrint =  300;
//---
ulong TimeArrayBook[65536];
ulong TimeArrayTick[65536];
ushort curBook,curTick;
ulong  DelaySum=0,DelayCount=0;
int delay,delayMax=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   curBook=0;
   curTick=0; 
   ArrayInitialize(TimeArrayBook,INT_MAX);
   ArrayInitialize(TimeArrayTick,INT_MAX);
  if(Mode == USE_BOOK) is_book = MarketBookAdd(Symbol());
  if (EventSetTimer(SecForPrint)) 
  return(INIT_SUCCEEDED);
  else return (INIT_FAILED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(Mode == USE_BOOK)
  {
    if(is_book == true) MarketBookRelease(Symbol());
  }  
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{ 
  TimeArrayBook[curBook++]=GetMicrosecondCount();
 }
void OnTick()
{
  TimeArrayTick[curTick++]=GetMicrosecondCount();
}
//+------------------------------------------------------------------+
void OnTimer()
  {
   string out=NULL;
   int total=MathMax(curBook,curTick);
   int i=0,k=0;
   while(i<total)
     {
      while(i<total && TimeArrayBook[i]<TimeArrayTick[k] )
        {
          Print("Book ",TimeArrayBook[i++]);
        }    
      if(k<curTick-1)
        {
        if(i<total)
          {
           delay=TimeArrayBook[i]-TimeArrayTick[k];
           if (delay>delayMax) 
            delayMax=delay;
           if (delay>0)
              {
                 DelaySum+=delay;
                 DelayCount++;
              }
          }
         Print("Tick ",TimeArrayTick[k++]);
        }       
        i++;
     }
     if (curTick>0)
     {
     Print("Tick ",TimeArrayTick[curTick-1], " last");
     string out="Count Event Book after Tick "+DelayCount+". Delay Average "+DoubleToString(DelaySum/DelayCount,2)+". Max "+delayMax;
     Print (out);
     Comment(out);
     }
     curBook=0;
     curTick=0;
  }
//---  
 
Andrey Khatimlianskii:

Любой тик, пришедший в терминал — это уже история.

Но я говорил не об этом, а о построении ленты без пропусков (SymbolInfoTick в этом не поможет).

Ок. Ваша точка зрения об истории вполне понятна.

Но я все же останусь при своем мнении, что от метода получения тиков будет зависить

их чтение (из истории или в реальном времени).

А я и не возражал Вам по поводу SymbolInfoTick и ленты без пропусков.

 

Вот такая картина за день. Конечно не проверялось соответствует ли ОнБук Тику, а просто брался следующий пришедший в надежде что если ОнТик опережает ОнБук, то соответствующий будет или следующий же , либо чуть позже.

Максимальный конечно без доп.проверок не показатель, или выброс или действительно ОнБук где-то подтормаживает.


А вот это кто сможет пояснить? Почему столько ОнТиков распринтовывается, и между ними не влазит ни одного ОнБука?