Tiki em tempo real - página 4

 
Vladimir Mikhailov:

Um pequeno resumo dos experimentos com análise de carrapatos.

1. o manipulador OnTick pula um número significativo de carrapatos.
Portanto, se você quiser analisar a faixa de acordos através do tique de entrada, não faz sentido.
Com esta abordagem, os resultados do algoritmo no testador e os resultados comerciais reais serão diferentes.

Como alternativa, você pode analisar a faixa de ofertas por um período selecionado ou uma certa quantidade de últimas ofertas obtendo os ticks do histórico usando as funções CopyTicks() ou CopyTicksRange().
Neste caso, os resultados dos testes do algoritmo no testador e os resultados reais do comércio são os mesmos.
As desvantagens são um desempenho inferior do algoritmo.

Sim, o Conselheiro Especialista pode perder carrapatos. Portanto, ou é o indicador ou o CopyTicks.

E a degradação do desempenho devido a quê? Copiar apenas o segmento necessário (que surgiu desde a última recuperação de dados bem sucedida).

 
Andrey Khatimlianskii:

Por que coletá-los "em tempo real" se o CopyTicks é usado de qualquer maneira?

Você pode copiar os carrapatos com a profundidade correta a qualquer momento que quiser.

Andrew, leia o título do tópico

Adicionado

Com CopyTicks(), não dá para chegar à profundidade certa, são apenas 2000 ticks!

 
prostotrader:

Andrei, leia o título do tópico

E quanto ao fato de a tarefa ter sido originalmente definida de forma incorreta?

A análise de ticks em tempo real é possível, mas é necessário usar o indicador ou CopyTicks para evitar lacunas.


prostotrader:

Você não pode obter a profundidade necessária com CopyTicks(), mas apenas 2000 ticks!

Não existe tal limitação, ver exemplo da documentação:

Пример вывода
Si-12.16: received 11048387  ticks in 4937 ms
Last tick time = 2016.09.26 18:32:59.775 
First tick time = 2015.06.18 09:45:01.000 
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 
Andrey Khatimlianskii:

E quanto ao fato de a tarefa ter sido originalmente definida de forma incorreta?

A análise de ticks em tempo real é possível, mas é preciso usar um indicador ou CopyTicks para garantir que não haja omissões.


Não existe tal limitação, ver exemplo da documentação:

1. Não necessariamente um indicador!

Se você se refere à ajuda, que diz

Em Expert Advisors e scripts, a função CopyTicks() pode esperar até 45 segundos....

Se você ler até o fim, diz

Velocidade de saída: o terminal armazena para cada caractere 4096 últimos ticks no cache para acesso rápido (65536 ticks para caracteres com a pilha rodando ), as consultas a estes dados são as mais rápidas.

O evento OnBookEvent() é acionado quando um novo pacote de carrapatos chega ao terminal, portanto

é possível coletar carrapatos do Expert Advisor. Pegue um exemplo e confira-o.

//+------------------------------------------------------------------+
//|                                                   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_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_first = false;
    is_book = MarketBookAdd(Symbol());
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      last_time = ticks[0].time_msc;
      is_first = true;
    }
    else
    {
      Alert("No start time!");
      return(INIT_FAILED);
    }   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
void PrintResult(const int cnt)
{
  if(cnt > 0)
  {
    for(int i= 0; i<cnt; i++)
    {
      if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
      if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
      if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
      if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
      if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
      if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
      Print("Unknown flag is ", ticks[i].flags);
    }
  }
}  
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      int result;
      if(is_first == true)
      {
        Print("First packet of ticks:");
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
       {
         PrintResult(result);
         is_first = false;
         mem_time = last_time;
         last_time = ticks[0].time_msc + 1;
       } 
      }
      else
      {
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, mem_time, 0);
        if(result > 0)
        {
          for(int i= 0; i<result; i++)
          {
            if(ticks[i].time_msc == mem_time)
            {
              Print("Tick with old time:");
              if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) Print("Tick is ", "TICK_FLAG_ASK"); else
              if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) Print("Tick is ", "TICK_FLAG_BID"); else
              if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) Print("Tick is ", "TICK_FLAG_BUY"); else
              if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) Print("Tick is ", "TICK_FLAG_LAST"); else
              if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) Print("Tick is ", "TICK_FLAG_SELL"); else
              if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) Print("Tick is ", "TICK_FLAG_VOLUME"); else
              Print("Unknown flag is ", ticks[i].flags);
            }
          }
        }
        result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, last_time, 0);
        if(result > 0)
        {
          Print("Ticks with new time:");
          PrintResult(result);
          mem_time = last_time;
          last_time = ticks[0].time_msc + 1;
        }
      }
    }
 }
//+------------------------------------------------------------------+


2. Existe tal limitação, verifique você mesmo(CopyTicksRange() não tem limitação)


 
prostotrader:

1. Não necessariamente um indicador!

O evento OnBookEvent() é acionado quando um novo pacote de carrapatos chega ao terminal, portanto

é possível coletar carrapatos do Expert Advisor. Pegue um exemplo e confira-o.

OnBookEvent não garante que os carrapatos não serão perdidos. Se houver cálculos pesados lá, haverá o mesmo salto que no OnTick.

E não importa de onde copiar a profundidade necessária de carrapatos através do CopyTicks.


prostotrader:

2. Existe tal limitação, verifique você mesmo

Ela existe apenas para os parâmetros 0, 0, o que é explicitamente mencionado na ajuda:

Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000.
 
Andrey Khatimlianskii:

OnBookEvent não dá garantias de que os carrapatos não serão perdidos.

Repito

OnBookEvent() dá precisamente essa garantia de que um novo lote de carrapatos chegou!

A partir da referência:

Taxa de emissão: O terminal armazena para cada caractere 4096 últimos ticks no cache de 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 o OnBookEvent não fosse acionado, todas as negociações (troca) no MT5 poderiam ser jogadas no lixo!

Chegou um novo pacote de carrapatos - o OnBookEvent 100% acionado, e o CopyTicks() mostra quantos carrapatos chegaram,

dados já armazenados em cache e é o acesso mais rápido!

É por isso que o coletor de carrapatos pode ser implementado em tempo real em indicador e EA(quando o mercado está em funcionamento).

Adicionado por

Pegue o código acima e verifique, do que discutir...

 

O código do coletor de carrapatos está correto, mas há alguns erros de implementação.

e afixá-lo mais tarde.

Adicionado

Coletor de todos os carrapatos em tempo real do Expert Advisor

Favor usar

//+------------------------------------------------------------------+
//|                                                   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++;
      }
    }
  }
}
//+------------------------------------------------------------------+
 

Para comparar como funciona o coletor de carrapatos, você pode fazer uma fita de todos os ofícios a partir dele em um ponto

(substituindo COPY_TICKS_ALL por COPY_TICKS_TRADE em dois lugares) e compará-lo com a fita de ofertas,

embutido no vidro do instrumento.

Se o instrumento for altamente líquido, as impressões podem ir com um longo atraso

 
prostotrader:
 if((ticks[i].flags&TICK_FLAG_ASK)==TICK_FLAG_ASK) {Print("Tick is ", "TICK_FLAG_ASK", " Tick time: ", ticks[i].time, ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_BID)==TICK_FLAG_BID) {Print("Tick is ", "TICK_FLAG_BID", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) {Print("Tick is ", "TICK_FLAG_BUY", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_LAST)==TICK_FLAG_LAST) {Print("Tick is ", "TICK_FLAG_LAST", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) {Print("Tick is ", "TICK_FLAG_SELL", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else
          if((ticks[i].flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) {Print("Tick is ", "TICK_FLAG_VOLUME", " Tick time: ", ticks[i].time,  ".", string(t_msc));} else

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

 
prostotrader:

Repita

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


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