DRAW_BARS

Le style DRAW_BARS dessine les barres selon les valeurs de quatre tampons d'indicateur, qui contiennent les prix Open, High, Low et Close. 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_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_BARS – 4. Tous les tampons pour la construction doivent aller successivement un après l'autre en ordre donné: Open, High, Low et Close. Aucun des tampons 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_BARS

Prêtez attention que primordialement à la construction graphique plot1 avec le style DRAW_BARS on spécifie la couleur à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() la couleur est spécifiée par hasard . par hasard de la liste d'avance préparée.

//+------------------------------------------------------------------+
//|                                                    DRAW_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_BARS"
#property description "Dessine dans la fenêtre séparée 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 4
#property indicator_plots   1
//--- plot Bars
#property indicator_label1  "Bars"
#property indicator_type1   DRAW_BARS
#property indicator_color1  clrGreen
#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         BarsBuffer1[];
double         BarsBuffer2[];
double         BarsBuffer3[];
double         BarsBuffer4[];
//--- le nom du symbole
string symbol;
//--- le tableau pour le stockage des couleurs
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- s'il y a trop peu de barres - terminons le travail avant terme
   if(bars<50)
     {
      Comment("Spécifiez un plus grand nombre de barres! Le travail de l'indicateur est cessé");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,BarsBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,BarsBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,BarsBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,BarsBuffer4,INDICATOR_DATA);
//---le nom du symbole, selon lequel les barres se dessinent
   symbol=_Symbol;
//--- établissons l'affichage du symbole
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_BARS("+symbol+")");
//--- une valeur vide
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---
   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)
     {
      //--- choisirons un nouveau symbole de la fenêtre "Aperçu du marché"
      symbol=GetRandomSymbolName();
      //--- changeons les propriétés de la ligne
      ChangeLineAppearance();
 
      int tries=0;
      //--- faisons 5 tentatives de remplir les tampons par les prix du symbol
      while(!CopyFromSymbolToBuffers(symbol,rates_total) && 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)
  {
//--- 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_BARS("+name+")");
     }
//--- initialisons les tampons par les valeurs vides
   ArrayInitialize(BarsBuffer1,0.0);   
   ArrayInitialize(BarsBuffer2,0.0);   
   ArrayInitialize(BarsBuffer3,0.0);   
   ArrayInitialize(BarsBuffer4,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
      BarsBuffer1[buffer_index]=rates[i].open;
      BarsBuffer2[buffer_index]=rates[i].high;
      BarsBuffer3[buffer_index]=rates[i].low;
      BarsBuffer4[buffer_index]=rates[i].close;
     }
   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);
  }
//+------------------------------------------------------------------+
//| 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 la couleur des barres
   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_index=number%size;
//--- définissons la couleur comme la propriété PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- inscrirons la couleur de la ligne
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- le bloc du changement de l'épaisseur de la barre
   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);
  }