CustomTicksAdd

Aggiunge i dati da un array di tipo MqlTick allo storico dei prezzi di un simbolo personalizzato. Il simbolo personalizzato deve essere selezionato nella finestra del Watch Market.

int  CustomTicksAdd(
   const string     symbol,             // Nome del simbolo
   const MqlTick&   ticks[],            // L'array con i dati tick che devono essere applicati al simbolo personalizzato
   uint             count=WHOLE_ARRAY   // numero degli elementi dell'array ticks[] da utilizzare
   );

Parametri

symbol

[in] Il nome del simbolo personalizzato.

ticks[]

[in] Un array di dati tick di tipo MqlTick arrangiati in ordine di tempo dai dati più vecchi a quelli più recenti, cioè ticks[k].time_msc <= ticks[n].time_msc, if k<n.

count=WHOLE_ARRAY

[in] Numero di elementi dell'array ticks[] da utilizzare per l'aggiunta. WHOLE_ARRAY significa che devono essere usati tutti gli elementi dell'array ticks[] .

Valore Restituito

Il numero di ticks aggiunti o -1 in caso di errore.

Ulteriori Note

La funzione CustomTicksAdd funziona solo per i simboli personalizzati aperti nella finestra del Market Watch. Se il simbolo non è selezionato nel Market Watch, è necessario aggiungere ticks utilizzando CustomTicksReplace.

La funzione CustomTicksAdd consente di trasmettere i ticks come se fossero stati consegnati dal server del broker. I dati vengono inviati alla finestra del Market Watch anziché essere scritti direttamente nel database dei tick. Il terminale quindi salva i ticks dal Market Watch in un database. Se la quantità di dati trasmessa durante la chiamata di funzione è ampia, il comportamento della funzione cambia in modo da ridurre l'utilizzo delle risorse. Se si passano più di 256 ticks, i dati vengono divisi in due parti. La prima, cioè la parte più grande, viene scritta direttamente sul database dei tick (come avviene in CustomTicksReplace). La seconda parte contenente 128 ticks viene passata alla finestra Market Watch, da cui il terminale salva i ticks nel database.

La struttura MqlTick ha due campi con il valore temporale: time (il tempo del tick in secondi) e il time_msc (il tempo del tick in millisecondi) che vengono contati dal 1° gennaio 1970. Questi campi nei codici aggiunti vengono elaborati nel seguente ordine:

  1. Se ticks[k].time_msc!=0, lo usiamo per riempire il campo ticks[k].time, cioè ticks[k].time=ticks[k].time_msc/1000 (divisione integer) viene impostato per il tick
  2. Se ticks[k].time_msc==0 e ticks[k].time!=0, il tempo in millisecondi viene ottenuto moltiplicando per 1000, cioè ticks[k].time_msc=ticks[k].time*1000
  3. If ticks[k].time_msc==0 e ticks[k].time==0, viene scritto in questi campi il corrente orario del trade server fino ai millisecondi come da momento della chiamata CustomTicksAdd.

Se il valore di ticks[k].bid, ticks[k].ask, ticks[k].last or ticks[k].volume, è più grande di zero, una combinazione di flags viene scritta nel campo ticks[k].flags:

  • TICK_FLAG_BID – il tick ha cambiato il prezzo bid
  • TICK_FLAG_ASK  – il tick ha cambiato il prezzo ask
  • TICK_FLAG_LAST – il tick ha cambiato il prezzo last deal
  • TICK_FLAG_VOLUME – il tick ha cambiato volume

Se il valore di un campo è inferiore o uguale a zero, la corrispondente flag non viene scritta nel campo ticks[k].flags.

 

Flags TICK_FLAG_BUY e TICK_FLAG_SELL non vengono aggiunte allo storico di un simbolo personalizzato.

 

Esempio:

//+------------------------------------------------------------------+
//|                                               CustomTicksAdd.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   CUSTOM_SYMBOL_NAME     Symbol()+".C"     // nome del simbolo personalizzato
#define   CUSTOM_SYMBOL_PATH     "Forex"           // nome del gruppo in cui un simbolo è stato creato
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()          // nome di un simbolo su cui è basata la personalizzazione 
 
#define   DATATICKS_TO_COPY      UINT_MAX          // numero dei tick copiati
#define   DATATICKS_TO_PRINT     20                // numero dei tick inviati al journal
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ottenere il codice di errore quando si crea un simbolo personalizzato
   int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN);
   
//---- se il codice di errore non è 0 (creazione del simbolo riuscita) e non è 5304 (il simbolo è già stato creato) - lasciare
   if(create!=0 && create!=5304)
      return;
 
//--- ottenere i dati dei tick del simbolo standard per l'array MqlTick
   MqlTick array[]={};
   if(!GetTicksToArray(CUSTOM_SYMBOL_ORIGINDATATICKS_TO_COPYarray))
      return;
   
//--- stampare l'ora del primo e dell'ultimo tick ricevuto del simbolo standard
   int total=(int)array.Size();
   PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
               TimeToString(array[0].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- stampare DATATICKS_TO_PRINT gli ultimi tick del simbolo standard nel journal
   PrintFormat("\nThe last %d ticks for the standard symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_ORIGIN);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Tick: %s"iGetTickDescription(array[i]));
     }
   
//--- aggiungere un simbolo personalizzato alla finestra Market Watch
   ResetLastError();
   if(!SymbolSelect(CUSTOM_SYMBOL_NAMEtrue))
     {
      Print("SymbolSelect() failed. Error "GetLastError());
      return;
     }
     
//--- aggiungere i dati dell'array dei tick alla cronologia dei prezzi del simbolo personalizzato
   Print("...");
   uint start=GetTickCount();
   PrintFormat("Start of adding %u ticks to the history of the custom symbol '%s'"array.Size(), CUSTOM_SYMBOL_NAME);
   int added=CustomTicksAdd(CUSTOM_SYMBOL_NAMEarray);
   PrintFormat("Added %u ticks to the history of the custom symbol '%s' in %u ms"addedCUSTOM_SYMBOL_NAMEGetTickCount()-start);
   
//--- ottenere i dati dei tick del simbolo personalizzato per l'array MqlTick
   Print("...");
   if(!GetTicksToArray(CUSTOM_SYMBOL_NAMEarray.Size(), array))
      return;
   
//--- stampare l'ora del primo e dell'ultimo tick ricevuto del simbolo personalizzato
   total=(int)array.Size();
   PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
               TimeToString(array[0].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- stampare DATATICKS_TO_PRINT gli ultimi tick del simbolo personalizzato nel journal
   PrintFormat("\nThe last %d ticks for the custom symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_NAME);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Tick: %s"iGetTickDescription(array[i]));
     }
 
//--- visualizzare un suggerimento sui tasti di terminazione dello script nel commento del grafico
   Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit"CUSTOM_SYMBOL_NAME));
//--- attendere che i tasti Esc o Del vengano premuti per uscire da un ciclo infinito
   while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
     {
      Sleep(16);
      //--- quando si preme Del, eliminare il simbolo personalizzato creato e i relativi dati
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         //--- eliminare i dati della barra
         int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history bars of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- cancellare i dati dei tick
         deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- eliminare il simbolo
         if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
            PrintFormat("Custom symbol '%s' deleted successfully"CUSTOM_SYMBOL_NAME);
         break;
        }
     }
//--- pulire il grafico prima di uscire
   Comment("");
   /*
   risultato:
   Requested 4294967295 ticks to download tick history for the symbol 'EURUSD'
   The tick history for the 'EURUSDsymbol is received in the amount of 351183943 ticks in 56454 ms
   First tick time2011.12.19 00:00:08.000Last tick time2024.06.20 21:18:12.010
   
   The last 20 ticks for the standard symbol 'EURUSD':
     351183923th Tick2024.06.20 21:17:46.380 Bid=1.07124 (Info tick)
     351183924th Tick2024.06.20 21:17:47.779 Ask=1.07125 Bid=1.07125 (Info tick)
     351183925th Tick2024.06.20 21:17:48.584 Ask=1.07124 Bid=1.07124 (Info tick)
     351183926th Tick2024.06.20 21:17:49.481 Ask=1.07125 (Info tick)
     351183927th Tick2024.06.20 21:17:49.985 Ask=1.07122 Bid=1.07122 (Info tick)
     351183928th Tick2024.06.20 21:17:50.482 Ask=1.07124 Bid=1.07124 (Info tick)
     351183929th Tick2024.06.20 21:17:51.584 Ask=1.07123 Bid=1.07123 (Info tick)
     351183930th Tick2024.06.20 21:17:52.786 Ask=1.07124 Bid=1.07124 (Info tick)
     351183931th Tick2024.06.20 21:17:53.487 Ask=1.07125 Bid=1.07125 (Info tick)
     351183932th Tick2024.06.20 21:17:53.989 Ask=1.07126 Bid=1.07126 (Info tick)
     351183933th Tick2024.06.20 21:17:55.789 Ask=1.07125 Bid=1.07125 (Info tick)
     351183934th Tick2024.06.20 21:17:58.495 Ask=1.07126 Bid=1.07126 (Info tick)
     351183935th Tick2024.06.20 21:18:00.102 Bid=1.07126 (Info tick)
     351183936th Tick2024.06.20 21:18:00.698 Ask=1.07129 Bid=1.07129 (Info tick)
     351183937th Tick2024.06.20 21:18:03.699 Bid=1.07129 (Info tick)
     351183938th Tick2024.06.20 21:18:04.699 Ask=1.07128 Bid=1.07128 (Info tick)
     351183939th Tick2024.06.20 21:18:05.901 Ask=1.07129 Bid=1.07129 (Info tick)
     351183940th Tick2024.06.20 21:18:07.606 Ask=1.07128 Bid=1.07128 (Info tick)
     351183941th Tick2024.06.20 21:18:11.512 Ask=1.07127 Bid=1.07127 (Info tick)
     351183942th Tick2024.06.20 21:18:12.010 Ask=1.07126 Bid=1.07126 (Info tick)
   ...
   Start of adding 351183943 ticks to the history of the custom symbol 'EURUSD.C'
   Added 351183943 ticks to the history of the custom symbol 'EURUSD.Cin 269890 ms
   ...
   Requested 351183943 ticks to download tick history for the symbol 'EURUSD.C'
   The tick history for the 'EURUSD.Csymbol is received in the amount of 351183943 ticks in 116407 ms
   First tick time2011.12.19 00:00:08.000Last tick time2024.06.20 21:18:12.010
   
   The last 20 ticks for the custom symbol 'EURUSD.C':
     351183923th Tick2024.06.20 21:17:46.380 Ask=1.07124 Bid=1.07124 (Info tick)
     351183924th Tick2024.06.20 21:17:47.779 Ask=1.07125 Bid=1.07125 (Info tick)
     351183925th Tick2024.06.20 21:17:48.584 Ask=1.07124 Bid=1.07124 (Info tick)
     351183926th Tick2024.06.20 21:17:49.481 Ask=1.07125 Bid=1.07125 (Info tick)
     351183927th Tick2024.06.20 21:17:49.985 Ask=1.07122 Bid=1.07122 (Info tick)
     351183928th Tick2024.06.20 21:17:50.482 Ask=1.07124 Bid=1.07124 (Info tick)
     351183929th Tick2024.06.20 21:17:51.584 Ask=1.07123 Bid=1.07123 (Info tick)
     351183930th Tick2024.06.20 21:17:52.786 Ask=1.07124 Bid=1.07124 (Info tick)
     351183931th Tick2024.06.20 21:17:53.487 Ask=1.07125 Bid=1.07125 (Info tick)
     351183932th Tick2024.06.20 21:17:53.989 Ask=1.07126 Bid=1.07126 (Info tick)
     351183933th Tick2024.06.20 21:17:55.789 Ask=1.07125 Bid=1.07125 (Info tick)
     351183934th Tick2024.06.20 21:17:58.495 Ask=1.07126 Bid=1.07126 (Info tick)
     351183935th Tick2024.06.20 21:18:00.102 Ask=1.07126 Bid=1.07126 (Info tick)
     351183936th Tick2024.06.20 21:18:00.698 Ask=1.07129 Bid=1.07129 (Info tick)
     351183937th Tick2024.06.20 21:18:03.699 Ask=1.07129 Bid=1.07129 (Info tick)
     351183938th Tick2024.06.20 21:18:04.699 Ask=1.07128 Bid=1.07128 (Info tick)
     351183939th Tick2024.06.20 21:18:05.901 Ask=1.07129 Bid=1.07129 (Info tick)
     351183940th Tick2024.06.20 21:18:07.606 Ask=1.07128 Bid=1.07128 (Info tick)
     351183941th Tick2024.06.20 21:18:11.512 Ask=1.07127 Bid=1.07127 (Info tick)
     351183942th Tick2024.06.20 21:18:12.010 Ask=1.07126 Bid=1.07126 (Info tick)
   */
  }
//+---------------------------------------------------------------------------------------+
//| Creare un simbolo personalizzato, restituire un codice di errore |
//+---------------------------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_nameconst string symbol_pathconst string symbol_origin=NULL)
  {
//--- definire il nome di un simbolo su cui è basata la personalizzazione
   string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
   
//--- se non è stato possibile creare un simbolo personalizzato e questo non corrisponde all'errore 5304, segnalarlo nel journal
   ResetLastError();
   int error=0;
   if(!CustomSymbolCreate(symbol_namesymbol_pathorigin))
     {
      error=GetLastError();
      if(error!=5304)
         PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d"symbol_namesymbol_pathoriginerror);
     }
//--- successo
   return(error);
  }
//+------------------------------------------------------------------+
//| Rimuovere un simbolo personalizzato |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
  {
//--- nascondere il simbolo dalla finestra Market Watch
   ResetLastError();
   if(!SymbolSelect(symbol_namefalse))
     {
      PrintFormat("SymbolSelect(%s, false) failed. Error %d"GetLastError());
      return(false);
     }
      
//--- se non è stato possibile eliminare un simbolo personalizzato, segnalarlo nel journal e restituire 'false'
   ResetLastError();
   if(!CustomSymbolDelete(symbol_name))
     {
      PrintFormat("CustomSymbolDelete(%s) failed. Error %d"symbol_nameGetLastError());
      return(false);
     }
//--- successo
   return(true);
  }
//+------------------------------------------------------------------+
//| Ottenere il numero specificato di tick nell'array |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolconst uint countMqlTick &array[])
  {
//--- notificare l'inizio del caricamento dei dati storici
   PrintFormat("Requested %u ticks to get tick history for the symbol '%s'"countsymbol);
   
//--- fare 3 tentativi per ricevere i tick
   int attempts=0;
   while(attempts<3)
     {
      //--- rilevare l'ora di inizio prima di ricevere i tick
      uint start=GetTickCount();
      
      //--- richiesta della cronologia dei tick dal 1970.01.01 00:00.001 (parametro da=1 ms)
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1count);
      if(received!=-1)
        {
 //--- visualizzare le informazioni sul numero di tick e il tempo trascorso 
         PrintFormat("The tick history for the '%s' symbol is received in the amount of %u ticks in %d ms"symbolreceivedGetTickCount()-start);
         
 //--- se la cronologia dei tick è sincronizzata, il codice di errore è pari a zero - restituire 'true'
         if(GetLastError()==0)
            return(true);
 
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d"
                     symbolreceivedGetTickCount()-startGetLastError());
        }
      //--- conteggio tentativi 
      attempts++; 
      //--- una pausa di un secondo per attendere la fine della sincronizzazione del database dei tick 
      Sleep(1000);
     }
//--- 3 tentativi falliti nella copia dei tick
   return(false);
  }
//+------------------------------------------------------------------+ 
//| restituire la descrizione della stringa di un tick |
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick
  { 
   string desc=StringFormat("%s.%03u "TimeToString(tick.timeTIME_DATE|TIME_MINUTES|TIME_SECONDS),tick.time_msc%1000);
   
//--- controllare i flag del tick
   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); 
   
//--- controllare prima i tick per i flag di trading (non ce ne sono per CustomTicksAdd())
   if(buy_tick || sell_tick
     { 
      //--- formare un output per un tick di trading 
      desc += (buy_tick ? StringFormat("Buy Tick: Last=%G Volume=%d "tick.lasttick.volume)  : ""); 
      desc += (sell_tickStringFormat("Sell Tick: Last=%G Volume=%d ",tick.lasttick.volume) : ""); 
      desc += (ask_tick ? StringFormat("Ask=%G "tick.ask) : ""); 
      desc += (bid_tick ? StringFormat("Bid=%G "tick.ask) : ""); 
      desc += "(Trade tick)"
     } 
   else 
     { 
      //--- formare un output per un info tick in modo leggermente diverso 
      desc += (ask_tick   ? StringFormat("Ask=%G ",  tick.ask)    : ""); 
      desc += (bid_tick   ? StringFormat("Bid=%G ",  tick.ask)    : ""); 
      desc += (last_tick  ? StringFormat("Last=%G "tick.last)   : ""); 
      desc += (volume_tickStringFormat("Volume=%d ",tick.volume): ""); 
      desc += "(Info tick)"
     } 
//--- restituire la descrizione del tick
   return(desc); 
  } 

 

Guarda anche

CustomRatesDelete, CustomRatesUpdate, CustomTicksReplace, CopyTicks, CopyTicksRange