Accès aux Timeseries et aux Données d'un Indicateur

Ce sont les fonctions permettant d'utiliser les timeseries et les indicateurs. Une série chronologique, ou timeserie, diffère des données habituelles par son ordre inverse - les éléments des timeseries sont indexés de la fin du tableau vers son début (des données les plus récentes aux plus anciennes). Pour copier les valeurs des séries chronologiques et les données d'un indicateur, il est recommandé de n'utiliser que des tableaux dynamiques, car les fonctions de copie sont conçues pour n'allouer que la taille nécessaire aux tableaux pour recevoir les valeurs.

Il existe une exception importante à cette règle : si les timeseries et les valeurs de l'indicateur doit être copiées souvent, par exemple à chaque appel à OnTick() dans les Expert Advisors ou à chaque appel de OnCalculate() dans les indicateurs, il est préférable dans ce cas d'utiliser des tableaux distribués de façon statique, car les opérations d'allocation mémoire pour les tableaux dynamiques nécessite davantage de temps, et ceci aura un effet pendant le test et l'optimisation.

La direction de l'indexation doit être prise en compte lors de l'utilisation de fonctions accédant aux timeseries et aux valeurs de l'indicateur. Tout est décrit dans la section Direction d'Indexation dans les Tableaux, les Buffers et les Timeseries.

L'accès aux données d'un indicateur et aux timeseries est implémenté que les données demandées soient prêtes ou pas (c'est le fameux accès asynchrone). Ceci est d'une grande importance pour le calcul d'un indicateur personnalisé, donc, s'il n'y a pas de données, les fonctions de type Copy...() retournent immédiatement une erreur. Cependant, lors de l'accès depuis des Expert Advisors et des scripts, plusieurs tentatives pour obtenir les données sont effectuées dans un court laps de temps, prévu pour donner le temps nécessaire pour télécharger les timeseries demandées ou pour calculer les valeurs de l'indicateur.

La section Organiser l'Accès aux Données décrit le détails pour récupérer, stocker et demander les données dans le terminal client MetaTrader 5.

Direction d'indexatin dans une timeserie et dans un tableau classique

Il est historiquement accepté que l'accès aux données de prix dans un tableau est effectué depuis la fin des données. Physiquement, les nouvelles données sont toujours écrites à la fin du tableau, mais l'indice du tableau est toujours égal à 0. L'indice 0 dans une timeserie correspond aux données de la barre courante, c'est à dire la barre qui correspond à l'intervalle de temps non encore fini pour la période en cours.

Une période est la période de temps pendant laquelle une seule barre de prix est formée. Il y a 21 périodes standards prédéfinies.

Fonction

Action

SeriesInfoInteger

Retourne l'état des données historiques

Bars

Retourne le nombre de barres dans l'historique pour le symbole et la période spécifiés

BarsCalculated

Retourne le nombre de données calculées dans un buffer d'indicateur ou -1 en cas d'erreur (les données n'ont pas encore été calculées.

IndicatorCreate

Retourne le handle sur l'indicateur technique spécifié créé avec un tableau de paramètres de type MqlParam

IndicatorParameters

A partir du handle spécifié, retourne le nombre de paramètres d'entrée de l'indicateur, ainsi que les valeurs et les types des paramètres

IndicatorRelease

Supprime le handle d'un indicateur et libère son bloc de calcul s'il n'est plus utilisé

CopyBuffer

Retourne dans un tableau les données d'un buffer spécifié de l'indicateur spécifié

CopyRates

Retourne dans un tableau les données historiques de la structure Rates pour un symbole et une période spécifiés

CopySeries

Retourne les timseries chronologiques de la structure MqlRates pour le symbole et la période spécifiés et pour la quantité demandée

CopyTime

Retourne dans un tableau les données historiques des heures d'ouverture des barres pour un symbole et une période spécifiés

CopyOpen

Retourne dans un tableau les données historiques des prix d'ouverture des barres pour un symbole et une période spécifiés

CopyHigh

Retourne dans un tableau les données historiques des prix les plus hauts des barres pour un symbole et une période spécifiés

CopyLow

Retourne dans un tableau les données historiques des prix les plus bas des barres pour un symbole et une période spécifiés

CopyClose

Retourne dans un tableau les données historiques des prix de clôture des barres pour un symbole et une période spécifiés

CopyTickVolume

Retourne dans un tableau les données historiques des volumes des ticks pour un symbole et une période spécifiés

CopyRealVolume

Retourne dans un tableau les données historiques des volumes des trades pour un symbole et une période spécifiés

CopySpread

Retourne dans un tableau les données historiques des spreads pour un symbole et une période spécifiés

CopyTicks

Copie les ticks au format MqlTick dans le tableau ticks_array

CopyTicksRange

Copie les ticks au format MqlTick de l'intervalle de dates spécifié dans le tableau ticks_array

iBars

Retourne le nombre de barres dans l'historique pour le symbole et la période spécifiés

iBarShift

Retourne l'indice de la barre correspondant à l'heure spécifiée

iClose

Retourne le prix de clôture (Close) de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iHigh

Retourne le prix le plus haut (High) de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iHighest

Retourne l'indice de la valeur la plus haute trouvée sur le graphique correspondant (décalage relatif à la barre courante)

iLow

Retourne le prix le plus bas (Low) de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iLowest

Retourne l'indice de la valeur la plus basse trouvée sur le graphique correspondant (décalage relatif à la barre courante)

iOpen

Retourne le prix d'ouverture (Open) de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iTime

Retourne l'heure d'ouverture de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iTickVolume

Retourne le volume de ticks de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iRealVolume

Retourne le volume réel de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iVolume

Retourne le volume de ticks de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

iSpread

Retourne la valeur du spread de la barre (indiquée par le paramètre 'shift') sur le graphique correspondant

En dépit du fait qu'en utilisant la fonction ArraySetAsSeries() il est possible de configurer l'accès aux éléments d'un tableau de la même façon que dans une timeserie, il faut se souvenir que les éléments d'un tableau sont stockés physiquement dans un seul ordre - seule la direction d'indexation change. Pour le démontrer, écrivons un exemple :

   datetime TimeAsSeries[];
//--- définit l'accès au tableau comme dans une série chronologique (timeserie)
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("L'opération de copie des heures d'ouverture des 10 dernières barres a échouée");
      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'opération de copie des heures d'ouverture des 10 dernières barres a échouée");
      return;
     }   
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
     }

Le résultat obtenu ressemblera à ceci :

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

Comme nous le voyons dans la sortie ci-dessus, au fur et à mesure que l'indice du tableau TimeAsSeries augmente, la valeur du temps de l'indice baisse, c'est à dire que nous nous déplaçons du présent vers le passé. Pour le tableau classique ArrayNotSeries, le résultat est différent - au fur et à mesure que l'indice augmente, nous nous déplacçons du passé vers le présent.

Voir Aussi

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries