OnCalculate

La fonction est appelée dans les indicateurs lorsque l'évènement Calculate se produit pour gérer les changements de prix. Il y a 2 types de fonctions. Un seul peut être utilisé dans un indicateur simple.

Calculs basés sur un tableau de données

int  OnCalculate(
   const int        rates_total,       // taille du tableau price[]
   const int        prev_calculated,   // nombre de barres gérées durant l'appel précédent
   const int        begin,             // numéro de l'indice dans le tableau price[] où les données utiles commencent
   const double&    price[]            // tableau de valeurs pour le calcul
   );

Calculs basés sur les séries de la période courante

int  OnCalculate(
   const int        rates_total,       // taille des séries temporelles d'entrée
   const int        prev_calculated,   // nombre de barres gérées durant l'appel précédent
   const datetime&  time[],            // Tableau des heures
   const double&    open[],            // Tableau des prix Open
   const double&    high[],            // Tableau des prix High
   const double&    low[],             // Tableau des prix Low
   const double&    close[],           // Tableau des prix Close
   const long&      tick_volume[],     // Tableau du volume des ticks
   const long&      volume[],          // Tableau des volumes réels
   const int&       spread[]           // Tableau des spreads
   );

Parameters

rates_total

[in]  Taille du tableau price[] ou des séries d'entrée disponibles pour l'indicateur pour le calcul. Dans le 2ème type de fonction, la valeur du paramètre correspond au nombre de barres du graphique sur lequel il est lancé.

prev_calculated

[in] Contient la valeur retournée par la fonction OnCalculate() pendant l'appel précédent. Il est conçu pour ignorer les barres qui n'ont pas changé depuis le lancement précédent de cette fonction.

begin

[in]  Indice des données du tableau price[] à partir duquel les données utiles commencent. Il vous permet d'ignorer les données initiales ou les données manquantes, pour lesquelles il n'y a pas de valeurs correctes.

price[]

[in]  Tableau de valeurs pour les calculs. L'une des timeseries des prix ou le buffer d'un indicateur calculé peuvent être passés comme tableau price[]. Le type des données passées pour le calcul peut être défini avec la variable prédéfinie _AppliedTo.

time{}

[in]  Tableau contenant les heures d'ouverture des barres.

open[]

[in]  Tableau contenant les prix Open des barres.

high[]

[in]  Tableau contenant les prix High des barres.

low[]

[in]  Tableau contenant les prix Low des barres.

close[]

[in]  Tableau contenant les prix Close des barres.

tick_volume[]

[in]  Tableau contenant les volumes des ticks.

volume[]

[in]  Tableau contenant les volumes réels.

spread[]

[in]  Tableau contenant les spreads des barres.

Valeur de Retour

Valeur de type int à passer dans le paramètre prev_calculated au prochain appel de la fonction.

Note

Si la fonction OnCalculate() est égale à zéro, aucune valeur pour l'indicateur n'est affichée dans la fenêtre des Données du terminal client.

Si le prix a changé depuis le dernier appel à la fonction OnCalculate() (un historique plus profond a été chargé ou des sauts dans l'hisrtorique ont été remplis), la valeur du paramètre d'entrée prev_calculated est mise à zéro par le terminal lui-même.

Pour définir la direction d'indexation dans les tableaux time[], open[], high[], low[], close[], tick_volume[], volume[] et spread[], appelez la fonction ArrayGetAsSeries(). Pour ne pas dépendre des valeurs par défaut, appelez la fonction ArraySetAsSeries() pour les travaux sur lesquels vous souhaitez travailler.

Lors de l'utilisation du premier type de la fonction, une timeserie ou un indicateur est sélectionné par l'utilisateur comme tableau price[] dans l'onglet Paramètres lors du lancement de l'indicateur. Pour cela, spécifiez l'élément nécessaire dans la liste déroulante dans le champ "Appliquer à".

Pour obtenir les valeurs d'un indicateur personnalisé depuis d'autres programmes mql5, la fonction iCustom() est utilisée. Elle retourne un handle sur l'indicateur pour être utilisé par la suite. Il est également possible de spécifier le tableau price [] ou le handle d'un autre indicateur. Ce paramètre doit être passé en dernier dans la liste des variables d'entrée d'un indicateur personnalisé.

Il est nécessaire d'utiliser le lien entre la valeur retournée par la fonction OnCalculate() et le deuxième paramètre d'entrée prev_calculated. Lors de l'appel à la fonction, le paramètre prev_calculated contient la valeur retournée par la fonction OnCalculate() pendant l'appel précédent. Ceci permet d'implémenter des algorithmes permettant d'économiser les ressources pour calculer un indicateur personnalisé afin d'éviter les calculs répétitifs pour les barres qui n'ont pas changé depuis l'appel précédent à cette fonction.

 

Indicateur exemple

//+------------------------------------------------------------------+
//|                                           OnCalculate_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Extrait du calcul de l'indicateur Momentum"
 
//---- paramètres de l'indicateur
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//---- entrées
input int MomentumPeriod=14; // Période du calcul
//---- buffer de l'indicateur
double    MomentumBuffer[];
//--- variable globale pour stocker la période de calcul
int       IntPeriod;
//+------------------------------------------------------------------+
//| Fonction d'initialisation d'un indicateur personnalisé           |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- vérification des paramètres d'entrée
   if(MomentumPeriod<0)
     {
      IntPeriod=14;
      Print("Le paramètre de la période a une valeur incorrecte. La valeur suivante est définie pour les calculs ",IntPeriod);
     }
   else
      IntPeriod=MomentumPeriod;
//---- buffers  
   SetIndexBuffer(0,MomentumBuffer,INDICATOR_DATA);
//---- nom de l'indicateur à afficher dans la fenêtre des Données et dans les sous-fenêtres
   IndicatorSetString(INDICATOR_SHORTNAME,"Momentum"+"("+string(IntPeriod)+")");
//--- définit l'indice de la barre de début de dessin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,IntPeriod-1);
//--- définit 0.0 comme valeur vide qui ne sera pas dessinée
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- précision de l'affichage de l'indicateur
   IndicatorSetInteger(INDICATOR_DIGITS,2);
  }
//+------------------------------------------------------------------+
//|  Calcul de l'indicateur Momentum                                 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,     // taille du tableau price[] 
                const int prev_calculated, // nombre de barres gérées précédemment
                const int begin,           // indice du début des données significatives 
                const double &price[])     // tableau des valeurs
  {
//--- position initiale pour les calculs
   int StartCalcPosition=(IntPeriod-1)+begin;
//---- si les données de calcul sont insuffisantes
   if(rates_total<StartCalcPosition)
      return(0);  // sort avec la valeur zéro - l'indicateur n'est pas calculé
//--- début du dessin de l'indicateur
   if(begin>0)
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartCalcPosition+(IntPeriod-1));
//--- début des calculs, définit la position de départ
   int pos=prev_calculated-1;
   if(pos<StartCalcPosition)
      pos=begin+IntPeriod;
//--- boucle principale de calcul
   for(int i=pos;i<rates_total && !IsStopped();i++)
      MomentumBuffer[i]=price[i]*100/price[i-IntPeriod];
//--- exécution de OnCalculate terminée. Retourne la nouvelle valeur de prev_calculated pour le prochain appel
   return(rates_total);
  }

Voir également

ArrayGetAsSeries, ArraySetAsSeries, iCustom, Fonctions de gestion des évènements, Exécution du programme, Evènements du terminal client, Accès aux timeseries et aux indicateurs