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

 
Aleksey Mavrin:

Одновременно разве у тиков не может стоять больше одного  флага?

Вы правы, подправил

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_cnt;
bool is_first;
int t_cnt, result;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    last_time = ulong(ticks[0].time_msc);
    is_first = true;
  }
  else
  {
    is_first = false;
    Alert("No start time!");
    return(INIT_FAILED);
  }   
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick) 
  { 
   string res = string(tick.time) + "." +  string(tick.time_msc%1000); 
// 
   bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY); 
   bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL); 
   bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK); 
   bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID); 
   bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST); 
   bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME); 
// 
   if((buy_tick== true) || (sell_tick == true)) 
   { 
     res = res + (buy_tick?StringFormat(" Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (sell_tick?StringFormat(" Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):""); 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
   } 
   else 
   { 
     res = res + (ask_tick?StringFormat(" Ask=%G ",tick.ask):""); 
     res = res + (bid_tick?StringFormat(" Bid=%G ",tick.ask):""); 
     res = res + (last_tick?StringFormat(" Last=%G ",tick.last):""); 
     res = res + (volume_tick?StringFormat(" Volume=%d ",tick.volume):""); 
   } 
   return res; 
  } 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
//void OnTick()
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    if(is_first == true)
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        Print("First packet of ticks:");
        t_cnt = 0;
        for(int i= 0; i<result; i++)
        {
          if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
          Print(GetTickDescription(ticks[i]));
        }
        is_first = false;
        last_time = ulong(ticks[0].time_msc);
      } 
    }
    else
    {
      result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
      if(result > 0)
      {
        if(result > t_cnt)
        {
          mem_cnt = t_cnt;
          t_cnt = 0;
          for(int i= 0; i<(result - int(mem_cnt)); i++)
          {
            if(ticks[i].time_msc == ticks[0].time_msc) t_cnt++;
            Print(GetTickDescription(ticks[i]));
          } 
          if(last_time == ulong(ticks[0].time_msc))
          {
            t_cnt += int(mem_cnt);
          }
          else last_time = ulong(ticks[0].time_msc + 1);
        }
        else
        {
          t_cnt = 0;
          last_time++;
        }
      }
      else
      {
        t_cnt = 0;
        last_time++;
      }
    }
  }
}
//+------------------------------------------------------------------+
Я показал принцип сборщика всех тиков, а вы можете использовать этот код как Вам нравится (извлекая все флаги)
 
Aleksey Mavrin:

Но это разве означает что есть гарантия, что вы обработаете ВСЕ события OnBookEvent?

Означает

 
prostotrader:

Повторяю

OnBookEvent() именно дает такую гарантию, что пришел новый пакет тиков!

У вас биржевой заклин.

OnTick точно так же означает, что пришел тик, и вы можете получить весь пакет с помощью CopyTicks.

Более того, их можно получить откуда угодно (хоть от события графика). У OnBookEvent свое назначение, и совсем не обязательно его тыкать везде где нужно, и где не нужно.


prostotrader:

Из справки:

Скорость выдачи: терминал хранит по каждому символу 4096 последних тиков в кеше для быстрого доступа (для символов с запущенным стаканом – 65536 тиков), запросы к этим данным выполняются быстрее всего.

Конец цитаты----

Если вам не хватает 4К последних тиков, тогда, конечно, подписывайтесь на стакан. Но не представляю, где это может потребоваться (кроме первого запуска).

 
prostotrader:

Означает

Да, и совсем не обязательно собирать очередь этих событий и обрабатывать их все, если нужна только история тиков.

 
Andrey Khatimlianskii:

У вас биржевой заклин.

OnTick точно так же означает, что пришел тик, и вы можете получить весь пакет с помощью CopyTicks.

Более того, их можно получить откуда угодно (хоть от события графика). У OnBookEvent свое назначение, и совсем не обязательно его тыкать везде где нужно, и где не нужно.


Если вам не хватает 4К последних тиков, тогда, конечно, подписывайтесь на стакан. Но не представляю, где это может потребоваться (кроме первого запуска).

Андрей!

Тема называлась "Тики в реальном времени"

Не нужно 100 раз отмечать, что тики можно получать по событию OnTick() по таймеру или еще как-то.

 
prostotrader:

Андрей!

Тема называлась "Тики в реальном времени"

Не нужно 100 раз отмечать, что тики можно получать по событию OnTick() по таймеру или еще как-то.

Именно! И OnBookEvent к теме имеет такое же отношение, как и OnTimer

 
Andrey Khatimlianskii:

Именно! И OnBookEvent к теме имеет такое же отношение, как и OnTimer

Запустите этот год на биржевом инструменте

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    Print(__FUNCTION__ + " Tick is done!");
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      Print(__FUNCTION__ + " Tick is done!");
    }
   
  }
//+------------------------------------------------------------------+
 
prostotrader:

Запустите этот год на биржевом инструменте

Спасибо, я знаю, как он работает.

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

 
Andrey Khatimlianskii:

Спасибо, я знаю, как он работает.

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

Андрей (при всем уважении)

Зачем Вы "ваньку валяете"?

Или Вы не знаете отличие  получать в Реальном времени или получать из Истории?

И при чем тут другой подход к трейдингу?

Каждый торгует и пишет роботов, как считает нужным!

Добавлено

Не нравится мой вариант получения тиков в реальном времени?

Так выложите свою версию!

Вот и посмотрим на другой подход...

 
prostotrader:

Андрей (при всем уважении)

Зачем Вы "ваньку валяете"?

Или Вы не знаете отличие  получать в Реальном времени или получать из Истории?

И при чем тут другой подход к трейдингу?

Каждый торгует и пишет роботов, как считает нужным!

Добавлено

Не нравится мой вариант получения тиков в реальном времени?

Так выложите свою версию!

Вот и посмотрим на другой подход...

Замените в своем коде OnBookEvent на OnTick, и сравните результат.