DRAW_FILLING

Le style DRAW_FILLING dessine le domaine coloré entre les valeurs de deux tampons d'indicateur. En fait ce style dessine deux lignes et peint l'espace entre eux par une de deux couleurs spécifiées. Il est destiné à la création des indicateurs dessinant les canaux. Aucun des tampons ne peut pas contenir seulement les valeurs vides, puisque dans ce cas le dessin ne passe pas.

On peut spécifier deux couleurs de remplissage

  • la première couleur pour ces domaines, où les valeurs dans le premier tampon d'indicateur sont plus grandes que les valeurs dans le deuxième tampon d'indicateur;
  • la deuxième couleur pour ces domaines, où les valeurs dans le deuxième tampon d'indicateur sont plus grandes que les valeurs dans le premier tampon d'indicateur.

Vous pouvez spécifier la couleur de remplissagepar les directives du compilateur ou dynamiquement à l'aide de la fonction PlotIndexSetInteger(). Le changement dynamique des propriétés de la construction graphique permet de "vivifier" les indicateurs pour qu'ils changent l'aspect en fonction de la situation actuelle.

L'indicateur est calculé pour toutes les barres, pour lesquelles les valeurs des deux tampons d'indicateur ne sont pas égales à 0 et ne sont pas égales à la valeur nulle. Pour spécifier quelle valeur doit être considérée comme "vide", établissez cette valeur dans la propriétéPLOT_EMPTY_VALUE:

   #define INDICATOR_EMPTY_VALUE -1.0
   ...
//--- la valeur INDICATOR_EMPTY_VALUE (une valeur vide) ne participera pas dans le calcul 
   PlotIndexSetDouble(L'indice_de la construction_DRAW_FILLING,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);

La rendu sur les barres, qui ne participent pas au calcul de l'indicateur, dépendra des valeurs dans les tampons d'indicateur:

  • Les barres pour lesquelles les valeurs des deux tampons d'indicateurs sont égales à 0, ne participent pas à la rendu de l'indicateur. C'est-à-dire le domaine avec les valeurs nulles ne sera pas coloré.

DRAW_FILLING_without_drawing

  • Les barres pour lesquelles les valeurs des deux tampons d'indicateurs sont égales à la valeur vide, ne participent pas à la rendu de l'indicateur. Le domaine avec les valeurs vides sera coloré de telle manière pour joindre les domaines avec les valeurs significatives.

DRAW_FILLING_with_drawing

Il est important de marquer que si "une valeur vide" est égale au zéro, les barres qui ne participant pas dans le calcul de l'indicateur seront aussi colorées.

Le nombre de tampons nécessaires pour la construction DRAW_FILLING – 2.

L'exemple de l'indicateur dessinant dans la fenêtre séparée le canal entre deux glissants moyens avec différentes périodes de la prise de moyenne. Le changement de la couleur à l'intersection des moyens montre visuellement le remplacement des tendances montante et descendante. Les couleurs se changent chaquesN ticks par hasard. Le paramètre N est porté auxparamètres extérieurs de l'indicateur pour la possibilité de l'installation manuelle (l'onglet "Paramètres" dans les propriétés de l'indicateur).

DRAW_FILLING

Prêtez attention que primordialement à la construction graphiqueplot1 avec le style DRAW_FILLING on spécifie deux couleurs à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() les nouvelles couleurs sont spécifiées par hasard.

//+------------------------------------------------------------------+
//|                                                 DRAW_FILLING.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "L'indicateur pour la démonstration DRAW_FILLING"
#property description "Dessine dans la fenêtre séparée le canal entre deux moyens"
#property description "La couleur du remplissage du canal se change par hasard"
#property description "dans chaques N ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Intersection
#property indicator_label1  "Intersection"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrRed,clrBlue
#property indicator_width1  1
//--- les paramètres input
input int      Fast=13;          // la période de la glissante moyenne rapide
input int      Slow=21;          // la période de la glissante moyenne lente
input int      shift=1;          // le décalage des moyennes au futur (positif)
input int      N=5;              // le nombre de ticks pour le changement 
//--- les tampons d'indicateur
double         IntersectionBuffer1[];
double         IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- le tableau pour le stockage des couleurs
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSlateGray};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
   fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
   slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   static int ticks=0;
//--- calculons les ticks pour le changement du style, de la couleur et de l'épaisseur de la ligne
   ticks++;
//---si s'est accumulé le nombre suffisant des ticks
   if(ticks>=N)
     {
      //--- changeons les propriétés de la ligne
      ChangeLineAppearance();
      //---oblitérons le compteur des ticks au zéro
      ticks=0;
     }
 
//---faisons le premier calcul de l'indicateur ou les données sont changées et on demande la recalculation complète
   if(prev_calculated==0)
     {
      //--- copions toutes les valeurs des indicateurs dans les tampons correspondants
      int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
     }
   else // remplissons économiquement seulement les données, qui sont mises à jour
     {
      //--- recevrons la différence dans les barres entre le lancement actuel et précédente OnCalculate()
      int to_copy=rates_total-prev_calculated;
      //--- s'il n'y a pas de différence, en tout cas copions une seule valeur - sur la barre nulle
      if(to_copy==0) to_copy=1;
      //--- copions to_copy des valeurs à la fin de tampons d'indicateur
      int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| change les couleurs du remplissage du canal                                   |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- la ligne pour la formation de l'information sur les propriétés de la ligne
   string comm="";
//--- le bloc du changement de la couleur de la ligne
   int number=MathRand(); // recevrons le nombre accidentel
//--- le diviseur du nombre est égal au montant du tableau colors[]
   int size=ArraySize(colors);
 
//--- recevrons l'index pour le choix de la nouvelle couleur comme le reste de la division entière
   int color_index1=number%size;
//--- définissons la première couleur comme la propriété PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- inscrirons la première couleur
   comm=comm+"\r\nColor1 "+(string)colors[color_index1];
 
//--- recevrons l'index pour le choix de la nouvelle couleur comme le reste de la division entière
   number=MathRand(); // recevrons le nombre accidentel
   int color_index2=number%size;
//--- définissons la deuxième couleur comme la propriété PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- inscrirons la deuxième couleur
   comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }