Référence MQL5Indicateurs Personnalisés 

Les indicateurs d'utilisateur

Le groupe des fonctions utilisées lors de la présentation des indicateurs d'utilisateur. On ne peut pas utiliser ces fonctions pour écrire les conseillers et les scripts.

Fonction

Action

SetIndexBuffer

Attache le tampon d'indicateur indiquée avec le tableau unidimentionnel dynamique du type double

IndicatorSetDouble

Spécifie la valeur de la propriété d'indicateur, ayant le type double

IndicatorSetInteger

Spécifie la valeur de la propriété d'indicateur, ayant le type int

IndicatorSetString

Spécifie la valeur de la propriété d'indicateur, ayant le type string

PlotIndexSetDouble

Spécifie la valeur de la propriété de la ligne d'indicateur, ayant le type double

PlotIndexSetInteger

Spécifie la valeur de la propriété de la ligne d'indicateur, ayant le type int

PlotIndexSetString

Spécifie la valeur de la propriété de la ligne d'indicateur, ayant le type string

PlotIndexGetInteger

Rend la valeur de la propriété de la ligne d'indicateur, ayant le type entier

Propriétés des indicateurs peuvent être installées à l'aide des directives de la compilation, et à l'aide des fonctions. Pour mieux comprendre il est recommandé d'étudierles styles des indicateurs dans les exemples.

Il est nécessaire de placer tous les comptes nécessaires des indicateurs d'utilisateur dans la fonction prédéterminée OnCalculate(). Si on utilise la forme courte de l'appel de la fonction OnCalculate() de l'aspect suivant

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

la variable rates_total contient la valeur  du nombre total d'éléments du tableau price[], transmis à titre du paramètre d'entrée pour le calcul des valeurs d'indicateur.

Le paramètre prev_calculated  — c'est le résultat de l'exécution de la fonction OnCalculate() sur l'appel précédent et permet d'organiser l'algorithme économe du calcul des valeurs d'indicateur. Par exemple, si la valeur courante rates_total=1000, et prev_calculated=999, probablement, il nous suffit de faire les calculs seulement pour une valeur de chaque tampon d'indicateur.

Si l'information sur la grandeur du tableau d'entrée  price était inaccessible, cela a amené à la nécessité de faire les calculs pour les 1000 valeurs de  chaque tampon d'indicateur. Au premier appel de la fonction OnCalculate() la valeur prev_calculated=0. Si le tableau price[] a changé d'une façon ou d'une autre,dans ce cas prev_calculated est aussi égal au 0.

Le paramètre begin montre le nombre de valeurs initiales du tableau price, qui ne contient pas de données pour le calcul. Par exemple, si à titre du du tableau d'entrée on utilisait les valeurs de l'indicateur Accelerator Oscillator (pour lesquelles les premiers 37 valeurs ne sont pas calculées), begin=37. Comme l'exemple nous examinerons l'indicateur simple:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Traînez-le de la fenêtre "Navigateur" à la fenêtre de l'indicateur Accelerator Oscillator et indiquons que les calculs seront produits sur les valeurs de l'indicateur précédent:

Le calcul de l'indicateur selon les valeurs de l'indicateur jeté auparavant

A la suite du premier appel de la fonction OnCalculate() la valeur prev_calculated sera égal au zéro, mais aux appels ultérieurs il sera égal à la valeur rates_total (jusqu'à ce que le nombre de barres sur le graphique de prix n'augmentera pas).

Le patamètre begin montre le nombre de barres initialles, sur lesquelles les valeurs sont manquées

La valeur du paramètre begin sera en exactitude égal au nombre de barres initialles, pour lesauelles les valeurs de l'indicateur  Accelerator ne sont pas calculées conformément à la logique de cet indicateur. Si nous regardons le code primaire de l'indicateur d'utilisateur Accelerator.mq5, nous verrons dans la fonction OnInit() les telles lignes:

//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Notamment par la fonction PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values)nous spécifions le nombre de premières valeurs irrelevantes au tableau  nul d'indicateur  de l'indicateur d'utilisateur, lesquelles il ne faut pas prendre en attention pour les calculs (empty_first_values). Ainsi, nous avons des mécanismes pour:

  1. définissez le nombre de valeurs de l'indicateur, qui ne devraient pas être utilisé pour les calculs dans un autre indicateur d'utilisateur;
  2. recevoir l'information sur le nombre de premières valeurs, qu'il est nécessaire d'ignorer à l'appel de l'autre indicateur d'utilisateur, sans entrer dans la logique de ses calculs.