DRAW_COLOR_SECTION

Le style DRAW_COLOR_SECTION c'est une variante colorée du style DRAW_SECTION, mais contrairement à ce dernier, permet de dessiner chaque section par sa propre couleur. Le style DRAW_COLOR_SECTION, comme tous les styles de couleur ayantCOLORdans le titre, contient le 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 section, si on indique les index de la couleur pour la barre, sur laquelle tombe la fin de la section.

On peut spécifier l'épaisseur, la couleur et le style des segments comme pour le style DRAW_SECTIONpar 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 créer les indicateurs "vivants", qui changent leur aspect en fonction de la situation actuelle.

Les sections se dessinent d'une valeur non vide à l'autre valeur non vide du tampon d'indicateur, les valeurs vides sont manquées. Pour indiquer, quelle valeur doit être considérée comme "vide", établissez cette valeur dans la propriété PLOT_EMPTY_VALUE. Par exemple, si l'indicateur doit se dessiner par les segments selon les valeurs non nulles, il faut spécifier la valeur nulle comme vide:

//---la valeur 0 (la valeur vide) ne participera pas au rendu 
   PlotIndexSetDouble(индекс_построения_DRAW_COLOR_SECTION,PLOT_EMPTY_VALUE,0);

Remplissez toujours évidemment par les valeurs tous les éléments du tampon d'indicateur, spécifiez aux éléments non-rendus la valeur vide.

Le nombre de tampons nécessaires pour la construction DRAW_COLOR_SECTION – 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 section est dessinée (il faut spécifier seulement pour les valeurs non vides).

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.

L'exemple de l'indicateur dessinant les sections multicolores d'une longueur de 5 barres selon les prix High. La couleur, l'épaisseur et le style des sections se changent par hasard chaqueN ticks.

L'exemple du style DRAW_COLOR_SECTION

Prêtez attention que primordialement à la construction graphiqueplot1 avec le style DRAW_COLOR_SECTION on spécifie 8 couleurs à l'aide de la directive du compilateur #property. Puis dans la fonction OnCalculate() les couleurs sont spécifiées par hasard du tableau colors[].

Le paramètre N est sorti dans les 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_SECTION.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_SECTION"
#property description "Dessine par les segments colorés de la longueur au nombre spécifié des barres"
#property description "La couleur, l'épaisseur et le style des sections se changent par hasard"
#property description "dans chaques N ticks"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorSection
#property indicator_label1  "ColorSection"
#property indicator_type1   DRAW_COLOR_SECTION
//--- spécifions 8 couleurs pour colorer les sections (ils se trouvent dans un tableau spécial)
#property indicator_color1  clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMediumVioletRed
#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      bars_in_section=5;        // la longueur des sections en barres
//---la variable auxiliaire pour le calcul des fins des sections
int            divider;
int            color_sections;
//--- le tampon pour le dessin
double         ColorSectionBuffer[];
//--- le tableau pour le stockage de la couleur du dessin de la ligne sur chaque barre
double         ColorSectionColors[];
//--- le tableau pour le stockage des couleurs contient 14 éléments
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- 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()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorSectionBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
//---la valeur 0 (la valeur vide) ne participera pas au rendu 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- le nombre de couleurs pour colorier les sections
   color_sections=8;   //  regarder le commentaire pour la propriété #property indicator_color1
//---vérifions le paramètre de l'indicateur
   if(bars_in_section<=0)
     {
      PrintFormat("La valeur inadmissible de la longueur la section=%d",bars_in_section);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=color_sections*bars_in_section;
//---
   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 sections sont dessinées
      ChangeColors(colors,color_sections);
      //---oblitérons le compteur des ticks au zéro
      ticks=0;
     }
 
//--- le numéro de la barre, par laquelle nous commencerons le calcul des valeurs de l'indicateur
   int start=0;
//--- si l'indicateur a été déjà calculé, établissons start sur la barre précédente
   if(prev_calculated>0) start=prev_calculated-1;
//--- Tous les calculs des valeurs de l'indicateur se trouvent ici
   for(int i=start;i<rates_total;i++)
     {
      //--- si le numéro de la barre se divise sans reste en longueur_de la section, cela signifie que c'est la fin de la section
      if(i%bars_in_section==0)
        {
         //---fixerons la fin du segment sur le prix High de cette barre
         ColorSectionBuffer[i]=high[i];
         //--- le reste de la division du numéro de la barre sur longueur_de la section*le nombre_des couleurs
         int rest=i%divider;
         //recevrons le numéro de la couleur =  de 0 jusqu'au nombre_des couleurs-1
         int color_indext=rest/bars_in_section;
         ColorSectionColors[i]=color_indext;
        }
      //--- si le reste de la division est égal aux barres, 
      else
        {
         //--- si rien n'est pas convenu, manquons cette barre - mettons la valeur 0
         ColorSectionBuffer[i]=0;
        }
     }
//--- 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("SectionColorIndex[%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);
  }