CopyTicks

La funzione riceve ticks nel formato MqlTick in ticks_array. In questo caso, i ticks sono indicizzati dal passato al presente, cioè il tick indicizzato 0 (zero) è il più vecchio nell'array. Per l'analisi del tick, controllare il campo flags, che mostra esattamente cosa è cambiato nel tick.

int  CopyTicks(
   string           symbol_name,           // Nome simbolo
   MqlTick&         ticks_array[],         // Array che riceve i Tick
   uint             flags=COPY_TICKS_ALL,  // La flag che determina il tipo di tick ricevuti
   ulong            from=0,                // La data dal quale vuoi richiedere ticks
   uint             count=0                // Il numero di ticks che vuoi ricevere
   );

Parametri

symbol_name

[in]  Simbolo.

ticks_array

[out]  Un array di tipo MqlTick per ricevere ticks.

flags

[in]  Un flag per definire il tipo di ticks richiesti. COPY_TICKS_INFO – ticks con cambiamenti Bid e/o Ask , COPY_TICKS_TRADE – ticks con cambiamenti in Last e Volume, COPY_TICKS_ALL – all ticks. Per qualsiasi tipo di richiesta, i valori dei tick precedenti vengono aggiunti ai campi rimanenti della struttura MqlTick.

from

[in]   La data dal quale vuoi ricchiedere ticks. In millisecondi da 1970.01.01. If from=0, l'ultimo count ticks verrà restituito.

count

[in]  Il numero di ticks richiesti. Se i parametri 'from' e 'count' non sono specificati, tutti i ticks disponibili più recenti (ma non più di 2000) verranno scritti in per ticks_array [].

Valore restituito

Il numero di tick copiati o -1 in caso di errore.

Ulteriore nota

La funzione CopyTicks() permette di richiedere ed analizzare tutti i ticks ricevuti. La prima chiamata di CopyTicks() avvia la sincronizzazione del database del simbolo del tick memorizzato sul disco rigido. Se il database locale non fornisce tutti i ticks richiesti, allora i ticks mancanti verranno scaricati automaticamente dal trade server. Ticks che cominciano dalla data from specificata in CopyTicks() fino al momento corrente, verranno sincronizzati. Dopo di che, saranno aggiunti tutti i ticks in arrivo per questo simbolo al database dei ticks in modo da mantenerli nello stato sincronizzato.

Se i parametri from e count non sono stati specificati, tutti i ticks disponibili (ma non più di 2000) verranno scritti nel ticks_array[]. Il parametro flags permette di specificre il tipo di ticks richiesti.

COPY_TICKS_INFO – vengono restituiti ticks con cambiamento di prezzo Bid e/o Ask . Saranno inoltre aggiunti i dati di altri campi. Ad esempio, se solo Bid è cambiato, i campi ask e volume saranno riempiti con ultimi valori noti. Per sapere esattamente che cosa è cambiato, analizzare il campo flag, che avrà il valore di TICK_FLAG_BID e/o TICK_FLAG_ASK. Se un tick ha valore zero dei prezzi Bid ed Ask, e le flags mostrano che questi dati sono cambiati (flags= TICK_FLAG_BID | TICK_FLAG_ASK), ciò significa che il libro degli ordini (Market Depth - Profondità Mercato) è vuoto. In altre parole, non ci sono ordini d' acquisto(buy) e vendite(sell).

COPY_TICKS_TRADE – vengono restituiti ticks con i cambiamenti di prezzo Last e Volume. Saranno inoltre aggiunti i dati di altri campi, vale a dire gli ultimi noti valori di Bid ed Ask che saranno specificati nei campi appropriati. Per sapere esattamente che cosa è cambiato, analizzare il campo field, che avrà il valore TICK_FLAG_LAST e TICK_FLAG_VOLUME.

COPY_TICKS_ALL – vengono restituiti tutti i ticks con qualsiasi cambiamento. I cambi non cambiati verranno riempiti con gli ultimi valori noti.

La chiamata di CopyTicks() con il flag COPY_TICKS_ALL ritorna immediatamente tutti i ticks dall' intervallo della richiesta, mentre le chiamate in altre modalità richiedono un certo tempo per elaborare e selezionare i ticks, quindi non forniscono un significativo vantaggio di velocità.

Quando si richiedono i ticks (sia con COPY_TICKS_INFO che COPY_TICKS_TRADE), ogni ticke conterrà le piene informazioni di prezzo così come l'orario del tick (bid, ask, last e volume). Questa funzione viene fornita per facilitare l'analisi dello stato di trade al momento di ogni tick, quindi non è necessario richiedere una storia tick profonda e cercare i valori di altri campi.

Negli indicatori, la funzione CopyTicks() restituisce il risultato: quando viene chiamata da un indicatore, CopyTick() restituisce immediatamente tutti i tick disponibili di un simbolo, e lancerà la sincronizzazione del database ticks, se i dati disponibili non sono sufficienti. Tutti gli indicatori in un simbolo operano in un thread comune, in modo che l'indicatore non attenda il completamento della sincronizzazione. Dopo la sincronizzazione, CopyTicks() restituirà tutti i ticks richiesti durante la chiamata successiva. Negli indicatori, la funzione OnCalculate() è chiamata dopo l'arrivo di ogni tick.

CopyTicks() può attendere il risultato per 45 secondi in Expert Advisors e scripts: a differenza degli indicatori, ogni Expert Advisor e script operano in un thread separato, e quindi possono aspettare 45 secondi fino al completamento della sincronizzazione. Se la quantità necessaria di ticks non riesce ad essere sincronizzata durante questo tempo, CopyTicks() restituirà i ticks disponibili per timeout e continuerà la sincronizzazione. OnTick() in Expert Advisor non è un handler per ogni tick, essa solo notifica ad un Expert Advisor i cambiamenti nel mercato. Può essere una serie di cambiamenti: il terminale può contemporaneamente creare alcuni ticks, ma onTick() sarà chiamato solo una volta a notificare all' EA dello stato attuale del mercato.

Il tasso di restituzione dei dati: il terminale conserva nella cache l'accesso veloce a 4096 ultimi ticks per ogni strumento (65536 ticks per simboli con corrente Market Depth). Se i ticks richiesti per la sessione di trading corrente sono oltre la cache, CopyTicks() chiama i ticks memorizzati nella memoria del terminale. Queste richieste richiedono più tempo per l'esecuzione. Le richieste più lente sono quelle che richiedono i ticks per altri giorni, dal momento che i dati vengono letti dal disco in questo caso.

Esempio:

#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- Requesting 100 million ticks to be sure we receive the entire tick history
input int      getticks=100000000; // The number of required ticks
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---  
   int     attempts=0;     // Count of attempts
   bool    success=false;  // The flag of a successful copying of ticks
   MqlTick tick_array[];   // Tick receiving array
   MqlTick lasttick;       // To receive last tick data
   SymbolInfoTick(_Symbol,lasttick);
//--- Make 3 attempts to receive ticks
   while(attempts<3)
     {
      //--- Measuring start time before receiving the ticks
      uint start=GetTickCount();
//--- Requesting the tick history since 1970.01.01 00:00.001 (parameter from=1 ms)
      int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks);
      if(received!=-1)
        {
         //--- Showing information about the number of ticks and spent time
         PrintFormat("%s: received %d ticks in %d ms",_Symbol,received,GetTickCount()-start);
         //--- If the tick history is synchronized, the error code is equal to zero
         if(GetLastError()==0)
           {
            success=true;
            break;
           }
         else
            PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
            _Symbol,received,GetTickCount()-start,_LastError);
        }
      //--- Counting attempts
      attempts++;
      //--- A one-second pause to wait for the end of synchronization of the tick database
      Sleep(1000);
     }
//--- Receiving the requested ticks from the beginning of the tick history failed in three attempts
   if(!success)
     {
      PrintFormat("Error! Failed to receive %d ticks of %s in three attempts",getticks,_Symbol);
      return;
     }
   int ticks=ArraySize(tick_array);
//--- Showing the time of the first tick in the array
   datetime firstticktime=tick_array[ticks-1].time;
   PrintFormat("Last tick time = %s.%03I64u",
               TimeToString(firstticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[ticks-1].time_msc%1000);
//--- выведем время последнего тика в массиве
   datetime lastticktime=tick_array[0].time;
   PrintFormat("First tick time = %s.%03I64u",
               TimeToString(lastticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[0].time_msc%1000);
 
//---                                                           
   MqlDateTime today;
   datetime current_time=TimeCurrent();                         
   TimeToStruct(current_time,today);                            
   PrintFormat("current_time=%s",TimeToString(current_time));   
   today.hour=0;
   today.min=0;
   today.sec=0;
   datetime startday=StructToTime(today);
   datetime endday=startday+24*60*60;
   if((ticks=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_ALL,startday*1000,endday*1000))==-1) 
     {
      PrintFormat("CopyTicksRange(%s,tick_array,COPY_TICKS_ALL,%s,%s) failed, error %d",       
                  _Symbol,TimeToString(startday),TimeToString(endday),GetLastError());          
      return;                                                                                  
     }
   ticks=MathMax(100,ticks);
//--- Showing the first 100 ticks of the last day
   int counter=0;
   for(int i=0;i<ticks;i++)
     {
      datetime time=tick_array[i].time;
      if((time>=startday) && (time<endday) && counter<100)
        {
         counter++;
         PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
        }
     }
//--- Showing the first 100 deals of the last day
   counter=0;
   for(int i=0;i<ticks;i++)
     {
      datetime time=tick_array[i].time;
      if((time>=startday) && (time<endday) && counter<100)
        {
         if(((tick_array[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) || ((tick_array[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL))
           {
            counter++;
            PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Returns the string description of a tick                         |
//+------------------------------------------------------------------+
string GetTickDescription(MqlTick &tick)
  {
   string desc=StringFormat("%s.%03d ",
                            TimeToString(tick.time),tick.time_msc%1000);
//--- Checking flags
   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);
//--- Checking trading flags in a tick first
   if(buy_tick || sell_tick)
     {
      //--- Forming an output for the trading tick
      desc=desc+(buy_tick?StringFormat("Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
      desc=desc+(sell_tick?StringFormat("Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
      desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
      desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
      desc=desc+"(Trade tick)";
     }
   else
     {
      //--- Form a different output for an info tick
      desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
      desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
      desc=desc+(last_tick?StringFormat("Last=%G ",tick.last):"");
      desc=desc+(volume_tick?StringFormat("Volume=%d ",tick.volume):"");
      desc=desc+"(Info tick)";
     }
//--- Returning tick description
   return desc;
  }
//+------------------------------------------------------------------+
/* Example of the output
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 
1.  2016.09.26 09:45.249 Ask=65370 Bid=65370 (Info tick)
2.  2016.09.26 09:47.420 Ask=65370 Bid=65370 (Info tick)
3.  2016.09.26 09:50.893 Ask=65370 Bid=65370 (Info tick)
4.  2016.09.26 09:51.827 Ask=65370 Bid=65370 (Info tick)
5.  2016.09.26 09:53.810 Ask=65370 Bid=65370 (Info tick)
6.  2016.09.26 09:54.491 Ask=65370 Bid=65370 (Info tick)
7.  2016.09.26 09:55.913 Ask=65370 Bid=65370 (Info tick)
8.  2016.09.26 09:59.350 Ask=65370 Bid=65370 (Info tick)
9.  2016.09.26 09:59.678 Bid=65370 (Info tick)
10. 2016.09.26 10:00.000 Sell Tick: Last=65367 Volume=3 (Trade tick)
11. 2016.09.26 10:00.000 Sell Tick: Last=65335 Volume=45 (Trade tick)
12. 2016.09.26 10:00.000 Sell Tick: Last=65334 Volume=95 (Trade tick)
13. 2016.09.26 10:00.191 Sell Tick: Last=65319 Volume=1 (Trade tick)
14. 2016.09.26 10:00.191 Sell Tick: Last=65317 Volume=1 (Trade tick)
15. 2016.09.26 10:00.191 Sell Tick: Last=65316 Volume=1 (Trade tick)
16. 2016.09.26 10:00.191 Sell Tick: Last=65316 Volume=10 (Trade tick)
17. 2016.09.26 10:00.191 Sell Tick: Last=65315 Volume=5 (Trade tick)
18. 2016.09.26 10:00.191 Sell Tick: Last=65313 Volume=3 (Trade tick)
19. 2016.09.26 10:00.191 Sell Tick: Last=65307 Volume=25 (Trade tick)
20. 2016.09.26 10:00.191 Sell Tick: Last=65304 Volume=1 (Trade tick)
21. 2016.09.26 10:00.191 Sell Tick: Last=65301 Volume=1 (Trade tick)
22. 2016.09.26 10:00.191 Sell Tick: Last=65301 Volume=10 (Trade tick)
23. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=5 (Trade tick)
24. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=1 (Trade tick)
25. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=6 (Trade tick)
26. 2016.09.26 10:00.191 Sell Tick: Last=65299 Volume=1 (Trade tick)
27. 2016.09.26 10:00.191 Bid=65370 (Info tick)
28. 2016.09.26 10:00.232 Ask=65297 (Info tick)
29. 2016.09.26 10:00.276 Sell Tick: Last=65291 Volume=31 (Trade tick)
30. 2016.09.26 10:00.276 Sell Tick: Last=65290 Volume=1 (Trade tick)
*/

Guarda anche

SymbolInfoTick, Struttura per i Prezzi Correnti, OnTick()