CopyTicks

La fonction reçoit les ticks au format MqlTick dans ticks_array. Dans ce cas, les ticks sont indexés depuis le passé vers le présent, c'est à dire que le tick l'index 0 est le plus vieux tick dans le tableau. Pour l'analyse des ticks, vérifiez le champ flags, qui montre exactement ce qui a changé dans le tick.

int  CopyTicks(
   string           symbol_name,           // Nom du symbole
   MqlTick&         ticks_array[],         // Tableau recevant les ticks
   uint             flags=COPY_TICKS_ALL,  // Flag déterminant le type des ticks reçus
   ulong            from=0,                // La date à partir de laquelle vous souhaitez demander les ticks
   uint             count=0                // Le nombre de ticks que vous souhaitez reçevoir
   );

Paramètres

symbol_name

[in]  Symbole.

ticks_array

[out]  Un tableau de types MqlTick pour reçevoir les ticks.

flags

[in]  Un flag pour définir le type des ticks demandés. COPY_TICKS_INFO — ticks avec les changements Bid et/ou Ask, COPY_TICKS_TRADE — ticks avec les changement de Last et de Volume, COPY_TICKS_ALL — tous les ticks. Pour tout type de demande, les valeurs des ticks précédents sont ajoutées aux champs restants de la structure MqlTick.

from

[in]  La date à partir de laquelle vous souhaitez demander les ticks. En millisecondes depuis le 01/01/1970. Si from=0, le dernier count des ticks sera retourné.

count

[in]  Le nombre de ticks demandés. si les paramètres 'from' et 'count' ne sont pas spécifiés, tous les ticks récents disponibles (mais pas plus de 2000) seront écrits dans le tableau ticks_array[].

Valeur de retour

Le nombre de ticks copiés ou -1 en cas d'erreur.

Note Supplémentaire

La fonction CopyTicks() permet de demander et d'analyser tous les ticks reçus. Le premier appel à CopyTicks() initie la synchronisation de la base de données des ticks du symbole stockée sur le disque dur. Si la base de données locale ne fournit pas tous les ticks demandés, alors les ticks manquants seront automatiquement téléchargés depuis le serveur de trading. Les ticks commençant à partir de la date from spécifiée dans CopyTicks() jusqu'au moment actuel seront synchronisés. Après cela, tous les ticks arrivant pour ce symbole seront ajoutés à la base de donnée des ticks, la gardant ainsi synchronisée.

Si les paramètres from et count ne sont pas spécifiés, tous les ticks récents disponibles (mais pas plus de 2000) seront écrits dans le tableau ticks_array[]. Le paramètre flags permet de spécifier le type des ticks demandés.

COPY_TICKS_INFO — seuls les ticks avec des changements de prix Bid et/ou Ask sont retournés. Les données des autres champs seront également ajoutées. Par exemple, si seulement le Bid a changé, les champs ask et volume seront remplis avec les dernières valeurs connues. Pour savoir exactement ce qui a changé, analysez le champ flags, qui contiendra les valeurs TICK_FLAG_BID et/ou TICK_FLAG_ASK. Si un tick a des valeurs des prix Bid et Ask à zéro, et que les flags montrent que ces données ont changé (flags=TICK_FLAG_BID|TICK_FLAG_ASK), cela signifie que le livre des ordres (Market Depth) est vide. En d'autres termes, il n'y a aucun ordre buy ou sell.

COPY_TICKS_TRADE — seuls les ticks avec les changements de prix Last et de volume sont retournés. Les données des autres champs seront également ajoutées, c'est à dire que les dernières valeurs connues de Bid et Ask seront spécifiées dans les champs correspondants. Pour savoir exactement ce qui a changé, analysez le champ flags, qui contiendra les valeurs TICK_FLAG_LAST et/ou TICK_FLAG_VOLUME.

COPY_TICKS_ALL — tous les ticks ayant un changement sont retournés. Les champs inchangés seront remplis avec les dernières valeurs connues.

L'appel à CopyTicks() avec le flag COPY_TICKS_ALL retourne immédiatement tous les ticks de l'intervalle demandé, tandis qu'un appel dans les autres mode nécessite du temps pour traiter et sélectionner les ticks, ils ne procurent donc pas un avantage significatif en terme de vitesse.

Lors de la demande de ticks (COPY_TICKS_INFO ou COPY_TICKS_TRADE), chaque tick contient toutes les informations de prix, ainsi que l'heure du tick (bid, ask, last et volume). Cette fonctionnalité est fournie pour une analyse plus facile de l'état du trade au moment de chaque tick, il n'y a donc pas besoin de demander un historique profond des ticks et de rechercher les valeurs des autres champs.

Pour les indicateurs, la fonction CopyTicks() retourne le résultat : lorsqu'elle est appelée depuis un indicateur, CopyTick() retourne immédiatement tous les ticks disponibles pour un symbole, et lancera la synchronisation de la base de données des ticks, si les données disponibles ne sont pas suffisantes. Tous les indicateurs pour un même symbole opèrent dans un thread commun, afin que l'indicateur ne soit pas bloqué par la synchronisation. Après la synchronisation, l'appel suivant à CopyTicks() retournera tous les ticks demandés. Pour les indicateurs, la fonction OnCalculate() est appelée après l'arrivée de chaque tick.

CopyTicks() peut attendre le résultat pendant 45 secondes dans les Expert Advisors et les scripts : puisque distinct des indicateurs, chaque Expert Advisor et chaque script opère dans un thread séparé, et peut donc attendre 45 secondes jusqu'à la fin de la synchronisation. Si le nombre demandé de ticks échoue à être synchronisés pendant ce temps imparti, CopyTicks() retournera les ticks disponibles au moment du timeout et continuera la synchronisation. OnTick() dans les Expert Advisors n'est pas le handler de chaque tick, il ne fait que notifier aux Expert Advisors des changements dans le marché. Ce peut être un ensemble de changements : le terminal peut effectuer simultanément plusieurs ticks, mais OnTick() ne sera appelée qu'une seule fois pour notifier l'EA du dernier état du marché.

Le taux de retour de données : le terminal stocke dans le cache d'accès rapide les 4096 derniers ticks pour chaque instrument (65536 ticks pour les symboles avec un Market Depth en cours d'exécution). Si les ticks demandés pour la session actuelle de trading sont dans le cache, CopyTicks() appelle les ticks stockés dans la mémoire du terminal. Ces demandes demande plus de temps d'exécution. Les demandes les plus lentes sont celles demandant les ticks d'autres jours, puisque les données sont lues depuis le disque dur dans ce cas.

Exemple :

#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);
//--- Show the time of the last tick in the array
   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)
*/

Voir aussi

SymbolInfoTick, Structure pour les Prix Courants, OnTick()