DRAW_COLOR_ZIGZAG

Le style DRAW_COLOR_ZIGZAG dessine les segments des couleurs différentes selon les valeurs de deux tampons d'indicateur. Ce style est la version colorée du style DRAW_ZIGZAG, c'est-à-dire permet de spécifier à chaque segment une propre couleur de l'ensemble des couleurs d'avance prédéterminé. Les segments se dessinent de la valeur dans un premier tampon jusqu'à la valeur dans un deuxième tampon d'indicateur. Aucun des tampons ne peut pas contenir seulement les valeurs vides, puisque dans ce cas le dessin ne passe pas.

On peut spécifier l'épaisseur, la couleur et le style de l'affichage de la ligne comme pour le style DRAW_ZIGZAGpar 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. Pour spécifier quelle valeur doit être considérée comme "vide", établissez cette valeur dans la propriétéPLOT_EMPTY_VALUE:

//---la valeur 0 (la valeur vide) ne participera pas au rendu 
   PlotIndexSetDouble(l'index_de la construction_DRAW_COLOR_ZIGZAG,PLOT_EMPTY_VALUE,0);

Remplissez toujours évidemment par les valeurs les tampons d'indicateur, indiquez une valeur vide dans le tampon sur les barres manquées.

Le nombre de tampons nécessaires pour la construction DRAW_COLOR_ZIGZAG – 3:

  • deux tampons pour la conservation des valeurs des fins des sections du zigzag;
  • 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).

L'exemple de l'indicateur dessinant la scie de long selon les prix High et Low. La couleur, l'épaisseur et le style de la ligne du zigzag se changent par hasard chaqueN ticks.

L'exemple du style DRAW_COLOR_ZIGZAG

Prêtez attention que primordialement à la construction graphique plot1 avec le style DRAW_COLOR_ZIGZAG on spécifie 8 couleurs à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() la couleur est choisie par hasard parmi 14 couleurs stockées dans le 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_ZIGZAG.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_ZIGZAG"
#property description "Dessine la ligne brisée par les segments colorés, la couleur dépend du numéro du jour de la semaine"
#property description "La couleur, l'épaisseur et le style des segments se changent"
#property description " par hasard par chaque N ticks"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot Color_Zigzag
#property indicator_label1  "Color_Zigzag"
#property indicator_type1   DRAW_COLOR_ZIGZAG
//--- spécifions 8 couleurs pour colorer les sections (ils se trouvent dans un tableau spécial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- le paramètre input
input int      N=5;              // le nombre de ticks pour le changement 
int            color_sections;
//--- les tampons des valeurs des fins des segments
double         Color_ZigzagBuffer1[];
double         Color_ZigzagBuffer2[];
//--- le tampon des index de la couleur des fins des segments
double         Color_ZigzagColors[];
//--- 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,Color_ZigzagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Color_ZigzagBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Color_ZigzagColors,INDICATOR_COLOR_INDEX);
//---- le nombre de couleurs pour colorier le zigzag
   color_sections=8;   //  regarder le commentaire pour la propriété #property indicator_color1
//---
   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();
      //--- 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;
     }
 
//--- la structure du temps sera nécessaire pour la réception du jour de la semaine de chaque barre
   MqlDateTime dt;
      
//--- la position du commencement des calculs
   int start=0;
//---si l'indicateur a été calculé sur le tick précédent, nous commençons le calcul par l'avant-dernier
   if(prev_calculated!=0) start=prev_calculated-1;
//--- la boucle des calculs
   for(int i=start;i<rates_total;i++)
     {
      //--- inscrirons le temps de l'ouverture de la barre dans la structure
      TimeToStruct(time[i],dt);
 
      //--- si le numéro de la barre est pair
      if(i%2==0)
        {
         //---  écrivons au 1-er tampon High, et au 2-ème - Low
         Color_ZigzagBuffer1[i]=high[i];
         Color_ZigzagBuffer2[i]=low[i];
         //--- la couleur du segment
         Color_ZigzagColors[i]=dt.day_of_year%color_sections;
        }
      //--- le numéro de la barre est impair
      else
        {
         //--- remplissons la barre dans l'ordre inverse
         Color_ZigzagBuffer1[i]=low[i];
         Color_ZigzagBuffer2[i]=high[i];
         //--- la couleur du segment
         Color_ZigzagColors[i]=dt.day_of_year%color_sections;         
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Change la couleur des segments du zigzag                         |
//+------------------------------------------------------------------+
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("ZigzagColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Modifie l'apparence des segments dans le zigzag                  |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- la ligne pour la formation de l'information sur les propriétés des Color_ZigZag
   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+"\r\nWidth="+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="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }