DRAW_COLOR_LINE

Le style DRAW_COLOR_LINE c'est la variante colorée du style DRAW_LINE, il dessine aussi la ligne selon les valeur du tampon d'indicateur. Mais ce style, comme tous les styles de couleur qui ont COLORdans le titre, a un tampon supplémentaire spécial d'indicateur pour stocker l'index (le numéro) de la couleur du tableau spécial spécifié des couleurs. Ainsi, on peut spécifier la couleur de chaque endroit, si on indique les index de la couleur, par lesquels la ligne doit être dessinée sur une barre spécifiée.

On peut spécifier l'épaisseur, la couleur et le style de l'affichage de la ligne comme par les directives du compilateur, et dynamiquement à l'aide de la fonction PlotIndexSetInteger(). Le changement dynamique des propriétés de la construction graphique permet de créer les indicateurs "vivants", qui changent leur aspect en fonction de la situation actuelle.

Le nombre de tampons nécessaires pour la construction DRAW_COLOR_LINE – 2:

  • un tampon pour stocker la valeur de l'indicateur selon lequel se dessine la ligne;
  • un tampon pour stocker l'index de la couleur, par lequel la ligne est dessinée sur chaque barre.

On peut spécifier les couleurs par la directive du compilateur #property indicator_color1 par la virgule. Le nombre de couleurs ne peut pas dépasser 64.

//--- spécifions 5 couleurs pour colorer chaque barre (ils se trouvent dans un tableau spécial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (on peut indiquer environ 64 couleurs)

L'exemple de l'indicateur dessinant la ligne aux prix de la clôture des barres Close. L'épaisseur et le style de la ligne se changent par hasard chaques N=5 ticks.

L'exemple du style DRAW_COLOR_LINE

Les couleurs, par lesquelles les fragments de la ligne sont dessinés, se changent aussi par hasard dans la fonction d'utilisateur ChangeColors().

//+------------------------------------------------------------------+
//| Change la couleur des sections de la ligne                       |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- le nombre de couleurs
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- spécifions une nouvelle couleur par l'image accidentelle pour chaque index de couleur
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- recevrons le nombre accidentel
      int number=MathRand();
      //--- recevrons l'index dans le tableau col[] comme le reste de la division entière
      int i=number%size;
      //--- installons la couleur pour chaque index comme la propriété PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  le numéro du style graphique
                          PLOT_LINE_COLOR,      //  l'identificateur de la propriété
                          plot_color_ind,       //  l'index de la couleur, où nous inscrirons la couleur
                          cols[i]);             //   une nouvelle couleur
      //--- inscrirons les couleurs 
      comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }

Dans l'exemple on montre la particularité des versions "de couleur" des indicateurs — pour changer la couleur du fragment de la ligne il ne faut pas changer la valeur dans le tampon ColorLineColors [] (qui contient les index des couleurs). Il suffit de spécifier les nouvelles couleurs dans un tableau spécial. Cela vous permet de changer rapidement la couleur pour toute la construction graphique, en changeant seulement un petit tableau des couleurs à l'aide de la fonctionPlotIndexSetInteger().

Prêtez attention que primordialement à la construction graphique plot1 avec le style DRAW_COLOR_LINE on spécifie les propriétés à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() ces trois propriétés sont spécifiées par hasard.

Les paramètres N et Length (la longeur des fragments de couleur dans les barres) sont portés aux paramètres extérieurs de l'indicateur pour la possibilité de l'installation manuelle (l'onglet "Paramètres" dans la fenêtre des propriétés de l'indicateur).

//+------------------------------------------------------------------+
//|                                              DRAW_COLOR_LINE.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_COLOR_LINE"
#property description "Dessine la ligne par les morceaux colorés selon 20 barres aux prix Close"
#property description "La couleur, l'épaisseur et le style des fragments de la ligne se change par hasard"
#property description "par chaque N ticks"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
//--- spécifions 5 couleurs pour colorer chaque barre (ils se trouvent dans un tableau spécial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (on peut indiquer environ 64 couleurs)
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- les paramètres input
input int      N=5;           // le nombre de ticks pour le changement 
input int      Length=20;     // la longueur de chaque fragment de la couleur en barres
int            line_colors=5; // le nombre de couleurs spécifiées est égale à 5 - regardez plus haut #property indicator_color1
//--- le tampon pour le dessin
double         ColorLineBuffer[];
//--- le tableau pour le stockage de la couleur du dessin de la ligne sur chaque barre
double         ColorLineColors[];
 
//--- le tableau pour le stockage des couleurs contient 7 éléments
color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- le tableau pour le stockage des styles du dessin de la ligne
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- le binding du tableau et du tampon d'indicateur
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- l'initialisation du générateur des nombres pseudo-accidentels
   MathSrand(GetTickCount());
//---
   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 le nombre critique des ticks est accumulé
   if(ticks>=N)
     {
      //--- changeons les propriétés de la ligne
      ChangeLineAppearance();
      //--- changeons les couleurs, par lesquelles les fragments de la ligne se dessinent
      ChangeColors(colors,5);
      //---oblitérons le compteur des ticks au zéro
      ticks=0;
     }
 
//--- le bloc du calcul des valeurs de l'indicateur
   for(int i=0;i<rates_total;i++)
     {
      //--- inscrirons la valeur de l'indicateur au tampon
      ColorLineBuffer[i]=close[i];
      //--- maintenant spécifions l'index de la couleur pour cette barre par hasard
      int color_index=i%(5*Length);
      color_index=color_index/Length;
      //--- pour cette barre la ligne sera dessinée par la couleur, qui se trouve sous le numéro color_index
      ColorLineColors[i]=color_index;
     }
 
//--- rendons la valeur prev_calculated pour un appel suivant de la fonction
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Change la couleur des sections de la ligne                       |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- le nombre de couleurs
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- spécifions une nouvelle couleur par l'image accidentelle pour chaque index de couleur
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- recevrons le nombre accidentel
      int number=MathRand();
      //--- recevrons l'index dans le tableau col[] comme le reste de la division entière
      int i=number%size;
      //--- installons la couleur pour chaque index comme la propriété PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  le numéro du style graphique
                          PLOT_LINE_COLOR,      //  l'identificateur de la propriété
                          plot_color_ind,       //  l'index de la couleur, où nous inscrirons la couleur
                          cols[i]);             //   une nouvelle couleur
      //--- inscrirons les couleurs 
      comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Modifie l'apparence de la ligne affichée dans l'indicateur       |
//+------------------------------------------------------------------+
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 l'épaisseur de la ligne
   int number=MathRand();
//--- recevrons l'épaisseur comme le reste de la division entière
   int width=number%5; // l'épaisseur est spécifiée de 0 jusqu'à 4
//--- définissons la couleur comme la propriété PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- inscrirons l'épaisseur de la ligne
   comm=comm+" Width="+IntegerToString(width);
 
//--- le bloc du changement du style de la ligne
   number=MathRand();
//--- le diviseur du nombre est égal à la taille du tableau styles
   int size=ArraySize(styles);
//--- recevrons l'index pour le choix de la nouvelle couleur comme le reste de la division entière
   int style_index=number%size;
//--- définissons la couleur comme la propriété PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- inscrirons le style de la ligne
   comm=EnumToString(styles[style_index])+", "+comm;
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }