CopyBuffer

Retourne la quantité nécessaire de données du buffer spécifié d'un certain indicateur.

copyBuffer

Le compte des éléments de données copiées (buffer de l'indicateur avec l'indice buffer_num) à partir du point de départ est effectué du présent vers le passé, c'est à dire que la position de départ de 0 signifie la barre courante (valeur de l'indicateur pour la barre courante).

Lors de la copie d'une quantité inconnue de données, il est recommandé d'utiliser un tableau dynamique buffer[] comme buffer destination, car la fonction CopyBuffer() essaye d'allouer la taille du tableau destination à la taille des données copiées. Si le buffer d'un indicateur (tableau pré-alloué pour stocker les valeurs de l'indicateur par la fonction SetIndexBufer()) est utilisé comme le tableau destination buffer[], la copie partielle est autorisée. Un exemple est disponible dans l'indicateur personnalisé Awesome_Oscillator.mql5 dans le package standard du terminal.

Si vous devez effectuer une copie partielle des valeurs de l'indicateur dans un autre tableau (autre que le buffer d'un indicateur), vous devriez utiliser un tableau intermédiaire dans lequel le nombre désiré est copié. Après cela, copiez le nombre désiré d'éléments depuis ce tableau intermédiaire dans le tableau destination.

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  CopyBuffer(
   int       indicator_handle,     // handle de l'indicateur
   int       buffer_num,           // numéro du buffer de l'indicateur
   int       start_pos,            // position de départ
   int       count,                // quantité à copier
   double    buffer[]              // tableau de destination pour la copie
   );

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

int  CopyBuffer(
   int       indicator_handle,     // handle de l'indicateur
   int       buffer_num,           // numéro du buffer de l'indicateur
   datetime  start_time,           // date et heure de début
   int       count,                // quantité à copier
   double    buffer[]              // tableau de destination pour la copie
   );

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

int  CopyBuffer(
   int       indicator_handle,     // handle de l'indicateur
   int       buffer_num,           // numéro du buffer de l'indicateur
   datetime  start_time,           // date et heure de début
   datetime  stop_time,            // date et heure de fin
   double    buffer[]              // tableau de destination pour la copie
   );

Parameters

indicator_handle

[in]  Le handle sur l'indicateur, retourné par la fonction correspondante de l'indicateur.

buffer_num

[in]  Le numéro du buffer de l'indicateur.

start_pos

[in]  La position du premier élément à copier.

count

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

start_time

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

stop_time

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

buffer[]

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

Valeur de Retour

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

Note

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.

Exemple :

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- dessine la MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- paramètres d'entrée
input bool               AsSeries=true;
input int                period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- buffers de l'indicateur
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| Fonction d'initialisation d'un indicateur personnalisé           |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapping des buffers de l'indicateur
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Paramètre AsSeries = ",AsSeries);
   Print("Le buffer de l'indicateur après SetIndexBuffer() est une timeserie = ",
         ArrayGetAsSeries(MABuffer));
//--- définit le nom court de l'indicateur
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- définit AsSeries (dépend des paramètres d'entrée)
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("Le buffer de l'indicateur après ArraySetAsSeries(MABuffer,true); est une timeserie = ",
         ArrayGetAsSeries(MABuffer));
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- vérifie si toutes les données sont calculées
   if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- toutes les données ne peuvent pas être copiées
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      //--- la dernière valeur est toujours copiée
      to_copy++;
     }
//--- essaie de copier
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- retourne la valeur de prev_calculated pour l'appel suivant
   return(rates_total);
  }
//+------------------------------------------------------------------+

L'exemple ci-dessus illustre comment le buffer d'un indicateur est rempli avec les valeurs du buffer d'un autre indicateur depuis l'indicateur sur le même symbole/la même période.

Un exemple détaillé de la demande de données historiques est visible 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 :

 

Voir aussi

Propriétés des Indicateurs Personnalisés, SetIndexBuffer