Tiki in tempo reale - pagina 4

 
Vladimir Mikhailov:

Un piccolo riassunto degli esperimenti con analisi delle zecche.

1. il gestore OnTick salta un numero significativo di tick.
Pertanto, se si vuole analizzare la striscia di accordi attraverso il tick in entrata, non ha senso.
Con questo approccio, i risultati dell'algoritmo nel tester e i risultati del trading reale saranno diversi.

In alternativa, puoi analizzare la striscia di transazioni per un periodo selezionato o una certa quantità di ultime transazioni ottenendo i tick della storia usando le funzioni CopyTicks() o CopyTicksRange().
In questo caso, i risultati del test dell'algoritmo nel tester e i risultati del commercio reale sono gli stessi.
Gli svantaggi sono prestazioni inferiori dell'algoritmo.

Sì, l'Expert Advisor può perdere dei tick. Pertanto, è l'indicatore o CopyTicks.

E la degradazione delle prestazioni a causa di cosa? Copia solo il segmento richiesto (che è apparso dall'ultimo recupero di dati riuscito).

 
Andrey Khatimlianskii:

Perché raccoglierli "in tempo reale" se CopyTicks viene usato comunque?

Puoi copiare le zecche alla giusta profondità in qualsiasi momento tu voglia.

Andrew, leggi il titolo del topic

Aggiunto

Non puoi portarlo alla giusta profondità con CopyTicks(), sono solo 2000 tick!

 
prostotrader:

Andrei, leggi il titolo del topic

Che dire del fatto che il compito è originariamente impostato in modo errato?

L'analisi dei tick in tempo reale è possibile, ma è necessario utilizzare l'indicatore o CopyTicks per evitare lacune.


prostotrader:

Non si può ottenere la profondità richiesta con CopyTicks(), ma solo 2000 tick!

Non c'è questa limitazione, vedi l'esempio della documentazione:

Пример вывода
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:

Che dire del fatto che il compito è originariamente impostato in modo errato?

L'analisi dei tick in tempo reale è possibile, ma bisogna usare un indicatore o CopyTicks per assicurarsi che non ci siano omissioni.


Non c'è questa limitazione, vedi l'esempio della documentazione:

1. Non necessariamente un indicatore!

Se intendi l'aiuto, che dice

Negli Expert Advisor e negli script, la funzione CopyTicks() può aspettare fino a 45 secondi....

Se leggete fino alla fine, c'è scritto

Velocità di uscita: il terminale memorizza per ogni carattere 4096 ultimi tick nella cache per un accesso rapido (65536 tick per i caratteri con lo stack in esecuzione ), le query a questi dati sono le più veloci.

L'evento OnBookEvent() si attiva quando un nuovo pacchetto di zecche arriva al terminale, quindi

è possibile raccogliere i tick dall'Expert Advisor. Prendete un esempio e verificatelo.

//+------------------------------------------------------------------+
//|                                                   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. C'è questa limitazione, controllate voi stessi(CopyTicksRange() non ha limitazioni)


 
prostotrader:

1. Non necessariamente un indicatore!

L'evento OnBookEvent() si attiva quando un nuovo pacchetto di zecche arriva nel terminale, quindi

è possibile raccogliere i tick dall'Expert Advisor. Prendete un esempio e controllate.

OnBookEvent non garantisce che i tick non vengano persi. Se ci sono calcoli pesanti, ci sarà lo stesso salto di OnTick.

E non importa da dove copiare la profondità di tick necessaria tramite CopyTicks.


prostotrader:

2. C'è questa limitazione, controlla tu stesso

Esiste solo per i parametri 0, 0, il che è esplicitamente menzionato nell'aiuto:

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

OnBookEvent non garantisce che i tick non vengano persi.

Ripeto

OnBookEvent() dà precisamente questa garanzia che una nuova serie di zecche è arrivata!

Dal riferimento:

Tasso di emissione: Il terminale memorizza per ogni carattere 4096 ultimi tick nella cache per un accesso rapido (per i carattericon lo stack in esecuzione, 65536 tick), le query a questi dati sonole più veloci.

Fine della citazione----

Se OnBookEvent non fosse attivato, tutto il trading (scambio) in MT5 potrebbe essere buttato nella spazzatura!

È arrivato un nuovo pacchetto di zecche - 100% ha attivato OnBookEvent, e il CopyTicks() mostra quante zecche sono arrivate,

dati già memorizzati nella cache ed è l' accesso più veloce!

Ecco perché il raccoglitore di tick può essere implementato in tempo reale nell'indicatore e nell'EA(quando il mercato è in esecuzione).

Aggiunto da

Prendete il codice qui sopra e controllatelo, poi discutete...

 

Il codice del raccoglitore di tick è corretto, ma ci sono alcuni errori di implementazione.

e pubblicarlo più tardi.

Aggiunto

Raccolta di tutti i tick in tempo reale da Expert Advisor

Si prega di utilizzare

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

Per confrontare il funzionamento del raccoglitore di zecche, si può fare un Ribbon di tutti i mestieri da esso a un punto

(sostituendo COPY_TICKS_ALL con COPY_TICKS_TRADE in due punti) e confrontarlo con il Ribbon of trades,

incorporato nel vetro dello strumento.

Se lo strumento è molto liquido, le stampe possono andare con un lungo ritardo

 
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

Le zecche non possono avere più di una bandiera alla volta?

 
prostotrader:

Ripetere

OnBookEvent() è esattamente il tipo di garanzia che un nuovo lotto di zeccheè arrivato!


Ma questo significa che c'è la garanzia di gestire TUTTI gli eventi OnBookEvent?