DRAW_COLOR_BARS

Le style DRAW_COLOR_BARS dessine les barres selon les valeurs de quatre tampons d'indicateur, qui contiennent les prix Open, High, Low et Close. Ce style est une version avancée du style DRAW_BARS et permet de spécifier la couleur de l'ensemble des couleurs d'avance prédéterminé pour chaque barre. Il est destiné à la création des indicateurs personnels en forme des barres, y compris dans une sous- fenêtre séparée du graphique et selon d'autres instruments financiers.

On peut spécifier la couleur des barres par les directives du compilateur ou dynamiquement à l'aide de la fonctionPlotIndexSetInteger(). 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 dessiné seulement pour ces barres, pour lesquelles on a spécifié les valeurs non vides de tous les quatre tampons 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(индекс_построения_DRAW_COLOR_BARS,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_BARS – 5:

  • quatre tampons pour stocker les valeurs Open, High, Low et Close;
  • un tampon pour stocker l'index de la couleur, par lequel la barre est dessinée (il faut spécifier seulement pour les barres dessinées).

Tous les tampons pour la construction doivent aller successivement un après l'autre en ordre donné: Open, High, Low, Close et le tampon de la couleur.  Aucun des tampons de prix ne peut pas contenir seulement les valeurs vides, puisque dans ce cas le dessin ne passe pas.

L'exemple de l'indicateur dessinant les barres selon l'instrument financier indiqué dans la fenêtre séparée. La couleur des barres se change chaques N 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).

L'exemple du style DRAW_COLOR_BARS

Prêtez attention que primordialement à la construction graphique plot1 avec le style DRAW_COLOR_BARS on spécifie 8 couleurs à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() les couleurs sont choisies par hasard parmi 14 couleurs stockées dans le tableau colors[].

//+------------------------------------------------------------------+
//|                                              DRAW_COLOR_BARS.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_BARS"
#property description "Dessine dans la fenêtre séparée par les couleurs différentes les barres selon le symbole choisi"
#property description "La couleur et l'épaisseur et le symbole des barres se changent par hasard "
#property description "par chaque N ticks"
 
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot ColorBars
#property indicator_label1  "ColorBars"
#property indicator_type1   DRAW_COLOR_BARS
//--- spécifions 8 couleurs pour colorer les barres (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
//--- les paramètres input
input int      N=5;              // le nombre de ticks pour le changement de l'aspect
input int      bars=500;         // combien de barres montrer
input bool     messages=false;   // l'affichage des messages dans le journal "Experts"
//--- les tampons d'indicateur
double         ColorBarsBuffer1[];
double         ColorBarsBuffer2[];
double         ColorBarsBuffer3[];
double         ColorBarsBuffer4[];
double         ColorBarsColors[];
//--- le nom du symbole
string symbol;
int    bars_colors;
//--- le tableau pour le stockage des couleurs contient 14 éléments
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorBarsBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorBarsBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorBarsBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorBarsBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorBarsColors,INDICATOR_COLOR_INDEX);
//---- le nombre de couleurs pour colorier les barres
   bars_colors=8;   //  à voir 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 tics pour le changement du style, de la couleur et de l'épaisseur de la barre
   ticks++;
//---si s'est accumulé le nombre suffisant des ticks
   if(ticks>=N)
     {
      //--- choisirons un nouveau symbole de la fenêtre "Aperçu du marché"
      symbol=GetRandomSymbolName();
      //--- changeons les propriétés de la ligne
      ChangeLineAppearance();
      //--- changeons les couleurs, par lesquelles les barres sont dessinées
      ChangeColors(colors,bars_colors);
      int tries=0;
      //--- faisons 5 tentatives de remplir les tampons par les prix du symbol
      while(!CopyFromSymbolToBuffers(symbol,rates_total,bars_colors) && tries<5)
        {
         //--- le compteur des appels de la fonction CopyFromSymbolToBuffers()
         tries++;
        }
      //---oblitérons le compteur des ticks au zéro
      ticks=0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Remplissons les tampons d'indicateur par les prix                |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,int total,int bar_colors)
  {
//--- copions les prix Open, High, Low et Close au tableau rates[]
   MqlRates rates[];
//--- le compteur des tentatives
   int attempts=0;
//--- combien on a été copié
   int copied=0;
//--- faisons 25 tentatives de recevoir la série temporelle selon le symbole nécessaire
   while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
     {
      Sleep(100);
      attempts++;
      if(messagesPrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
     }
//--- si on n'a pas réussi à copier le nombre suffisant des barres
   if(copied!=bars)
     {
      //--- formons la chaîne du message
      string comm=StringFormat("On a réussi à recevoir seulement %d barres de %d barres demandées pour le symbole %s",
                               name,
                               copied,
                               bars
                               );
      //--- déduisons le message au commentaire sur une principale fenêtre du graphique
      Comment(comm);
      //--- déduisons les messages
      if(messagesPrint(comm);
      return(false);
     }
   else
     {
      //--- établissons l'affichage du symbole 
      PlotIndexSetString(0,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
      IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_BARS("+name+")");
     }
//--- initialisons les tampons par les valeurs vides
   ArrayInitialize(ColorBarsBuffer1,0.0);
   ArrayInitialize(ColorBarsBuffer2,0.0);
   ArrayInitialize(ColorBarsBuffer3,0.0);
   ArrayInitialize(ColorBarsBuffer4,0.0);
 
//--- copions les prix aux tampons
   for(int i=0;i<copied;i++)
     {
      //--- calculons l'index correspondant pour les tampons
      int buffer_index=total-copied+i;
      //--- inscrivons les prix aux tampons
      ColorBarsBuffer1[buffer_index]=rates[i].open;
      ColorBarsBuffer2[buffer_index]=rates[i].high;
      ColorBarsBuffer3[buffer_index]=rates[i].low;
      ColorBarsBuffer4[buffer_index]=rates[i].close;
      //---
      ColorBarsColors[buffer_index]=i%bar_colors;
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Rend accidentellement le symbole du Market Watch                 |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
  {
//--- le nombre de symboles montrés dans la fenêtre "Aperçu du marché"
   int symbols=SymbolsTotal(true);
//--- la position du symbole dans la liste - le nombre accidentel de 0 jusqu'aux symbols
   int number=MathRand()%symbols;
//--- rendons le nom du symbole selon la position indiquée
   return SymbolName(number,true);
  }
//+------------------------------------------------------------------+
//| 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("BarColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Modifie l'apparence des barres                                   |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- la ligne pour la formation de l'information sur les propriétés des barres
   string comm="";
 
//--- le bloc du changement de l'épaisseur de la barre
   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);
 
//--- inscrirons le nom du symbole
   comm="\r\n"+symbol+comm;
 
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }