Accesso alle Timeseries e ad i dati degli Indicatori

Si tratta di funzioni per lavorare con le serie temporali (_* Timeseries) e con gli indicatori. Una timeseries si differenzia dal consueto array di dati, per via del suo ordinamento inverso - elementi delle timeseries sono indicizzati a partire dalla fine di un array fino al suo inizio (a partire dai dati più recenti a quelli più vecchi). Per copiare i valori delle time-series degli indicatori e dei dati, si consiglia di utilizzare solo array dinamici, perché le funzioni di copiatura sono progettate per assegnare la grandezza necessaria degli array che ricevono i valori.

C'è un' importante eccezione a questa regola: se i valori delle timeseries e degli indicatori devono essere copiati spesso, ad esempio ad ogni chiamata di OnTick() negli Expert Advisors o ad ogni chiamata di OnCalculate() negli indicatori, in questo caso sarebbe meglio utilizzare gli array staticamente distribuiti, perché operazioni di allocazione di memoria per gli array dinamici richiedono più tempo, e ciò avrà un effetto durante il testing e l'ottimizzazione.

Quando si utilizzano funzioni che accedono ai valori di timeseries e indicatori, la direzione di indicizzazione dovrebbe essere presa in considerazione. Questo è descritto nella sezione Direzione di indicizzazione negli e nelle timeseries.

L'accesso ai dati dell' indicatore e timeseries è implementato indipendentemente dal fatto se i dati richiesti sono pronti (il cosiddetto accesso asincrono). Questo è estremamente importante per il calcolo dell' indicatore personalizzato, quindi se non vi sono dati, funzioni di tipo Copy...() restituiscono immediatamente un errore. Tuttavia, quando si accede da Expert Advisor e script, diversi tentativi di ricezione dei dati vengono realizzati in una piccola pausa, che è volta a fornire un po' di tempo necessario per scaricare TimeSeries richieste per calcolare i valori degli indicatori.

La sezione Organizzare l' Accesso ai Dati descrive i dettagli di ricezione, archiviazione e richiede i dati sui prezzi nel terminale client MetaTrader 5.

La direzione di indicizzazione in una timeseries ed in una array comune

È storicamente accettato che un accesso ai dati dei prezzi in un array viene eseguito a partire dalla fine dei dati. Fisicamente, i nuovi dati vengono sempre scritti alla fine dell'array, ma l'indice della matrice è sempre uguale a zero. L'indice 0 nell'array timeseries denota i dati della barra corrente, cioè la barra che corrisponde all'intervallo di tempo non-finito in questo timeframe.

Un timeframe è il periodo di tempo, durante il quale viene formata una barra di prezzo unico. Ci sono 21 timeframes standard predefiniti.

Funzione

Azione

SeriesInfoInteger

Restituisce le informazioni sullo stato dei dati storici

Bars

Restituisce il numero di barre dello storico di un simbolo e periodo specificati

BarsCalculated

Restituisce il numero di dati calcolati in un buffer indicatore, oppure -1 in caso di errore (dati non sono stati ancora calcolati)

IndicatorCreate

Restituisce l'handle per l'indicatore tecnico specificato creato da una serie di parametri di tipo MqlParam

IndicatorParameters

Basato sull' handler specificato, restituisce il numero di parametri di input dell'indicatore, nonché i valori e tipi dei parametri

IndicatorRelease

Rimuove un handle indicatore e rilascia il blocco di calcolo dell'indicatore, se non è usato da nessun altro

CopyBuffer

Mette in un array i dati di un buffer specificato da un indicatore specificato

CopyRates

Mette in un array i dati storici della struttura Rates per un simbolo e periodo specificati

CopySeries

Ottiene le Timeseries sincronizzate dalla struttura MqlRates per il simbolo-periodo specificato e la quantità specificata. I dati vengono ricevuti nella serie di array indicati

CopyTime

Mette in un array i dati storici dell'orario di apertura della barra per un simbolo e periodo specificati

CopyOpen

Mette in un array i dati storici sul prezzo di apertura della barra per un simbolo e periodo specificati

CopyHigh

Mette in un array i dati storici sul prezzo massimo della barra per un periodo e simbolo specificati

CopyLow

Mette in un array i dati storici sul prezzo minimo della barra per un simbolo e periodo specificati

CopyClose

Mette in un array i dati storici sul prezzo di chiusura della barra per un simbolo e periodo specificati

CopyTickVolume

Mette in un array i dati storici relativi ai volumi tick per un simbolo e periodo specificati

CopyRealVolume

Mette in un array i dati storici sui volumi trade per un simbolo e periodo specificati

CopySpread

Mette in un array i dati storici sugli spread per un simbolo e periodo specificati

CopyTicks

La funzione riceve ticks nel formato MqlTick in ticks_array

CopyTicksRange

La funzione riceve ticks in formato MqlTick nell'intervallo di date specificato in ticks_array

iBars

Restituisce il numero di barre di un simbolo e di un periodo corrispondenti, disponibili nello storico

iBarShift

Restituisce l'indice della barra corrispondente al tempo/orario specificato

iClose

Restituisce il prezzo Close (di chiusura) della barra (indicato dal parametro 'shift') sul chart corrispondente

iHigh

Restituisce il prezzo High della barra (indicata dal parametro 'shift') sul chart corrispondente

iHighest

Restituisce l'indice del valore più alto trovato sul chart corrispondente (spostamento relativo alla barra corrente)

iLow

Restituisce il prezzo Low della barra (indicato dal parametro 'shift') sul chart corrispondente

iLowest

Restituisce l'indice del valore più piccolo trovato sul chart corrispondente (slittamento relativo alla barra corrente)

iOpen

Restituisce il prezzo Open della barra (indicata dal parametro 'shift') sul chart corrispondente

iTime

Restituisce il tempo di apertura della barra (indicato dal parametro 'shift') sul chart corrispondente

iTickVolume

Restituisce il volume tick della barra (indicato dal parametro 'shift') sul chart corrispondente

iRealVolume

Restituisce il volume reale della barra (indicato dal parametro 'shift') sul chart corrispondente

iVolume

Restituisce il volume tick della barra (indicato dal parametro 'shift') sul chart corrispondente

iSpread

Restituisce il valore di spread della barra (indicato dal parametro 'shift') sul chart corrispondente

Nonostante il fatto che con la funzione ArraySetAsSeries() è possibile impostare negli array l'accesso agli elementi come quelli nelle timeseries, va ricordato che gli elementi dell'array vengono fisicamente memorizzati in un solo e medesimo ordine - solo la direzione di indicizzazione cambia. Per dimostrare questo fatto cerchiamo di fare un esempio:

   datetime TimeAsSeries[];
//--- imposta l' accesso all'array come ad una timeseries
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("L'operazione di copia dei valori dell'orario di apertura per le ultime 10 barre, è fallita");
      return;
     }
   Print("TimeCurrent =",TimeCurrent());
   Print("ArraySize(Time) =",ArraySize(TimeAsSeries));
   int size=ArraySize(TimeAsSeries);
   for(int i=0;i<size;i++)
     {
      Print("TimeAsSeries["+i+"] =",TimeAsSeries[i]);
     }
 
   datetime ArrayNotSeries[];
   ArraySetAsSeries(ArrayNotSeries,false);
   ResetLastError();
   copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
   if(copied<=0)
     {
      Print("L'operazione di copia dei valori dell'orario di apertura per le ultime 10 barre, è fallita");
      return;
     }   
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
     }

Come risultato si otterrà un output come questo:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
 
ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

Come si vede dall' output, così come aumenta l'indice dell'array TimeAsSeries, il valore temporale dell'indice diminuisce, cioè si passa dal presente al passato. Per l'array comune ArrayNotSeries il risultato è diverso - cos come indice cresce, si passa dal passato al presente.

Vedere anche

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries