Tiki em tempo real - página 5

 
Aleksey Mavrin:

Os carrapatos não podem ter mais de uma bandeira de cada vez?

Você está certo, eu fiz.

//+------------------------------------------------------------------+
//|                                                   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++;
      }
    }
  }
}
//+------------------------------------------------------------------+
Eu mostrei o princípio do coletor de carrapatos e você pode usar este código como quiser (extraindo todas as bandeiras)
 
Aleksey Mavrin:

Mas isso significa que há uma garantia de que você irá lidar com TODOS os eventos OnBookEvent?

Significa

 
prostotrader:

Repita

OnBookEvent() é exatamente o tipo de garantia de que um novo lote de carrapatos chegou!

Você tem um tique de estoque.

OnTick significa exatamente que um carrapato chegou, e você pode obter o pacote completo com o CopyTicks.

Além disso, você pode obtê-los de qualquer lugar (até mesmo de um evento gráfico). OnBookEvent tem seu próprio propósito e você não tem que furá-lo onde você quiser ou não quiser.


prostotrader:

De referência:

Taxa de emissão: O terminal armazena para cada caractere 4096 últimos ticks no cache para acesso rápido (para caracterescom a pilha rodando, 65536 ticks), as consultas a estes dados sãoas mais rápidas.

Fim da citação----

Se você não conseguir obter 4K últimos tiquetaques suficientes, então, por todos os meios, subscreva a pilha. Mas não consigo imaginar onde isso seria necessário (além da primeira corrida).

 
prostotrader:

Significa

Sim, e você não precisa coletar uma fila desses eventos e processá-los todos se você quiser apenas um histórico de carrapatos.

 
Andrey Khatimlianskii:

Você tem um tique de estoque.

OnTick significa exatamente que um carrapato chegou e você pode obter o pacote completo com o CopyTicks.

Além disso, você pode obtê-los de qualquer lugar (até mesmo de um evento gráfico). OnBookEvent tem seu próprio propósito e você não tem que furá-lo onde você quiser ou não quiser.


Se você não tiver 4K últimos tiquetaques suficientes, é claro que assine o tumblr. Mas não consigo imaginar onde poderá ser necessário (além da primeira corrida).

Andrew!

O tema foi chamado de "carrapatos em tempo real".

Não é necessário apontar 100 vezes que os carrapatos podem ser recebidos pelo evento OnTick() em um timer ou qualquer outra coisa.

 
prostotrader:

Andrei!

O tema foi chamado de "Tiquetaques em tempo real".

Não é necessário apontar 100 vezes que você pode receber carrapatos por evento OnTick() em um timer ou o que quer que seja.

Exatamente! E OnBookEvent tem a mesma relevância para o tema que OnTimer

 
Andrey Khatimlianskii:

Exatamente! E OnBookEvent tem tanto a ver com o assunto quanto OnTimer

Executado este ano em um instrumento de estoque

//+------------------------------------------------------------------+
//|                                                   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:

Lançamento este ano em um instrumento de estoque

Obrigado, eu sei como funciona.

Imagine por um segundo que poderia haver uma abordagem diferente do comércio do que a sua.

 
Andrey Khatimlianskii:

Obrigado, eu sei como funciona.

Imagine por um segundo que poderia haver uma abordagem diferente do comércio do que a sua.

Andrei(com o devido respeito).

Por que você está "brincando"?

Ou você não sabe a diferença entre obtê-lo em tempo real ou obtê-lo da história?

E o que isso tem a ver com a outra abordagem do comércio?

Todo mundo negoceia e escreve robôs como bem entende!

Adicionado por

Não gosta da minha versão de receber carrapatos em tempo real?

Então poste sua versão!

Então vamos ver uma abordagem diferente...

 
prostotrader:

Andrei(com todo respeito)

Por que você está "brincando"?

Ou você não sabe a diferença entre obtê-lo em tempo real ou obtê-lo da história?

E o que isso tem a ver com a outra abordagem do comércio?

Todo mundo negoceia e escreve robôs como bem entende!

Adicionado por

Não gosta da minha versão de receber carrapatos em tempo real?

Então poste sua versão!

Então vamos ver uma abordagem diferente...

Substitua OnBookEvent por OnTick em seu código, e compare o resultado.

Razão: