CopyTickVolume

La fonction copie la quantité spécifiée de données historiques du volume des ticks dans le paramètre volume_array pour la paire symbole-période sélectionnée. Il est à noter que l'ordre des éléments est du présent vers le passé, c'est à dire que la position de départ de 0 signifie la barre courante.

CopyTickVolume

Lors de la copie d'une quantité inconnue de données, il est recommandé d'utiliser un tableau dynamique comme tableau destination, car si le nombre de données est inférieur (ou supérieur) que la longueur du tableau destination, la fonction essaye de réallouer la mémoire pour que l'ensemble des données demandées puisse être contenu.

Si vous connaissez la quantité de données à copier, il est préférable d'utiliser un buffer alloué de façon statique, afin d'éviter une allocation mémoire excessive.

Ceci quelque soit la propriété du tableau destination - as_series=true ou as_series=false. Les données seront copiées afin que le plus vieil élément soit situé au départ de la mémoire physique allouée pour le tableau. Il existe 3 variantes d'appel à la fonction.

Appel avec la première position et le nombre d'éléments désirés

int  CopyTickVolume(
   string           symbol_name,      // nom du symbole
   ENUM_TIMEFRAMES  timeframe,        // période
   int              start_pos,        // position de départ
   int              count,            // quantité de données à copier
   long             volume_array[]    // tableau destination pour le volume des ticks
   );

Appel avec la date de début et le nombre d'éléments désirés

int  CopyTickVolume(
   string           symbol_name,      // nom du symbole
   ENUM_TIMEFRAMES  timeframe,        // période
   datetime         start_time,       // date et heure de début
   int              count,            // quantité de données à copier
   long             volume_array[]    // tableau destination pour le volume des ticks
   );

Appel avec les dates de début et de fin d'un intervalle de temps désiré

int  CopyTickVolume(
   string           symbol_name,      // nom du symbole
   ENUM_TIMEFRAMES  timeframe,        // période
   datetime         start_time,       // date et heure de début
   datetime         stop_time,        // date et heure de fin
   long             volume_array[]    // tableau destination pour le volume des ticks
   );

Parameters

symbol_name

[in]  Nom du symbole.

timeframe

[in]  Période.

start_pos

[in]  La position de départ correspondant au 1er élément à copier.

count

[in]  Quantité de données à copier.

start_time

[in]  Heure de la barre correspondant au premier élément à copier.

stop_time

[in]  Heure de la barre correspondant au dernier élément à copier.

volume_array[]

[out]  Tableau d'éléments de type long.

Valeur de Retour

Retourne le nombre de données copiées ou -1 en cas d'erreur.

Note

Si l'ensemble de l'intervalle des données demandées est en dehors des données disponibles sur le serveur, la fonction retourne -1. Si des données en dehors de TERMINAL_MAXBARS (nombre maximum de barres sur le graphique) sont demandées, la fonction retournera également -1.

Lors de la demande de données par un indicateur, si les timeseries demandées ne sont pas encore construites ou si elles doivent être téléchargées du serveur, la fonction retournera immédiatement -1, et le téléchargement ou la construction sera initiée.

Lors de la demande de données par un Expert Advisor ou un script, le téléchargement depuis le serveur sera lancé si le terminal n'a pas encore ces données localement, ou la construction des timeseries demandées sera lancée si les données peuvent être construites à partir de l'historique local mais qu'elles ne sont pas encore prêtes. La fonction retournera la quantité de données qui seront prêtes au moment de l'expiration du délai, mais le téléchargement de l'historique continuera, et la fonction retournera plus de données à la prochaine demande similaire.

Lors de la demande de données à partir de la date de départ et du nombre désiré d'elements, seules les données dont la date est inférieure (donnée plus récente) ou égale à la date spécifiée seront retournées. Cela signifie que l'heure d'ouverture de n'importe quelle barre, pour laquelle une valeur est retournée (volume, spread, valeur du buffer de l'indicateur, prix Open, High, Low, Close ou heure d'ouverture) est toujours inférieure ou égale à celle spécifiée.

Lors de la demande de données dans un intervalle spécifié de dates, seules les données de cet intervalle seront retournées. L'intervalle est défini et compté en secondes. Cela signifie que l'heure d'ouverture de n'importe quelle barre, pour laquelle une valeur est retournée (volume, spread, valeur du buffer de l'indicateur, prix Open, High, Low, Close ou heure d'ouverture) est toujours dans l'intervalle demandé.

Donc, si le jour courant est samedi, au moment d'essayer de copier les données sur l'intervalle de la semaine en spécifiant start_time=Last_Tuesday et stop_time=Last_Friday, la fonction retournera 0, car l'heure d'ouverture sur l'intervalle de la semaine est le dimanche, mais une barre 1 semaine ne rentre pas dans l'intervalle spécifié.

Si vous devez retourner une valeur correspondant à la barre non complète actuelle, vous pouvez utiliser la 1ère forme d'appel en spécifiant start_pos=0 et count=1.

Exemple :

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- dessine le TickVolume
#property indicator_label1  "TickVolume"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  C'143,188,139'
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- paramètres d'entrée
input int      bars=3000;
//--- buffers de l'indicateur
double         TickVolumeBuffer[];
//+------------------------------------------------------------------+
//| Fonction d'initialisation d'un indicateur personnalisé           |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- mapping des buffers de l'indicateur
   SetIndexBuffer(0,TickVolumeBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
  }
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé                |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      long timeseries[];
      ArraySetAsSeries(timeseries,true);
      int prices=CopyTickVolume(Symbol(),0,0,bars,timeseries);
      for(int i=0;i<rates_total-prices;i++) TickVolumeBuffer[i]=0.0; 
      for(int i=0;i<prices;i++) TickVolumeBuffer[rates_total-1-i]=timeseries[prices-1-i]; 
      Print("Nombre de valeurs de TickVolume reçues : "+prices);
     }
   else
     {
      long timeseries[];
      int prices=CopyTickVolume(Symbol(),0,0,1,timeseries);
      TickVolumeBuffer[rates_total-1]=timeseries[0]; 
     }  
//--- retourne la valeur de prev_calculated pour l'appel suivant
   return(rates_total);
  }

Vous pouvez voir un exemple détaillé de demande des données historiques dans la section Méthodes de Liaison d'Objet. Le script disponible dans cette section montre comment obtenir les valeurs de l'indicateur iFractals sur les 1000 dernières barres et comment afficher les 10 fractales haussières et baissières sur le graphique. Une technique identique peut être utilisée pour tous les indicateurs qui ont des données manquantes et qui sont habituellement dessinés avec les styles suivants :