DRAW_COLOR_BARS

Lo stile DRAW_COLOR_BARS disegna barre sui valori delle quattro buffer di indicatori, che contengono i prezzi Open, High, Low e Close. Questo stile è una versione avanzata di DRAW_BARS e permette di specificare per ogni barra un singolo colore dal set predefinito di colori. E' utilizzato per la creazione di indicatori personalizzati come barre, incluse quelli in una sottofinestra separata di un grafico e su altri strumenti finanziari.

Il colore delle barre può essere impostato utilizzando le direttive del compilatore o in modo dinamico utilizzando la funzione PlotIndexSetInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di "animare" gli indicatori, in modo che il loro aspetto cambia a seconda della situazione attuale.

L'indicatore è disegnato solo per queste barre, per cui i valori non vuoti di tutti e quattro i buffer indicatore sono impostati. Per specificare quale valore deve essere considerato come "vuoto", impostare questo valore nelle proprietà PLOT_EMPTY_VALUE:

/ / --- Il valore 0 (vuoto) parteciperà al disegno
   PlotIndexSetDouble(index_of_plot_DRAW_COLOR_BARS,PLOT_EMPTY_VALUE,0);

Riempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare le barre.

Il numero di buffer richiesti per il plotting di DRAW_COLOR_BARS è 5:

  • quattro buffer per memorizzare i valori di Open, High, Low e Close;
  • un buffer per memorizzare l'indice del colore, che viene utilizzato per disegnare una barra (ha senso impostarlo solo per le barre che verranno disegnate).

Tutti i buffer per il tracciamento dovrebbero andare uno dopo l'altro, nell'ordine: Open, High, Low, Close e il buffer del colore. Nessuno dei buffer di prezzo possono contenere solo valori nulli, poiché in questo caso nulla è tracciato.

Un esempio di indicatore che disegna barre su uno strumento finanziario selezionato in una finestra separata. Il colore delle barre varia casualmente ogni N ticks. Il parametro N è impostato nei parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà dell' indicatore).

Un esempio di stile DRAW_COLOR_BARS

Si prega di notare che per Plot1 con lo stile DRAW_COLOR_BARS, 8 colori vengono impostati utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() il colore è scelto a caso dai 14 colori memorizzati nell'array colori[].

//+--------------------------------------------------------------------------------+
//|                                                            DRAW_COLOR_BARS.mq5 |
//|                                      Copyright 2011, MetaQuotes Software Corp. | 
//|                                                           https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Un indicatore che dimostra DRAW_COLOR_BARS"
#property description "Esso disegna barre di diverso colore di un simbolo selezionato in una finestra separata"
#property description "Il colore e lo spessore delle barre, così come il simbolo, vengono cambiati dinamicamente"
#property description "ogni 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
//--- Definisce 8 colori per la colorazione delle barre (che sono memorizzate nella matrice speciale)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parametri di input
input int      N=5;              // Il numero di ticks per cambiare il tipo
input int      bars=500;         // Il numero di barre da mostrare
input bool     messages=false;   // Mostra i messaggi nel log "Expert Advisors" 
//--- Buffer Indicatore
double         ColorBarsBuffer1[];
double         ColorBarsBuffer2[];
double         ColorBarsBuffer3[];
double         ColorBarsBuffer4[];
double         ColorBarsColors[];
//--- Nome simbolo
string symbol;
int    bars_colors;
//--- Un array per memorizzare i colori contiene 14 elementi
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
  };
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   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);
//---- Numero di colori per le barre da colorare
   bars_colors=8;   //  mostra un commento a #property indicator_color1 property
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                                |
//+--------------------------------------------------------------------------------+
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;
//--- Conta ticks per cambiare lo stile, il colore e la larghezza della barra
   ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
   if(ticks>=N)
     {
      //--- Imposta un nuovo simbolo dalla finestra Market Watch
      symbol=GetRandomSymbolName();
      //--- Cambia le proprietà della linea
      ChangeLineAppearance();
      //--- Cambia i colori usati per disegnare le candele
      ChangeColors(colors,bars_colors);
      int tries=0;
      //--- Fa 5 tentativi per riempire il buffer con i prezzi dal simbolo
      while(!CopyFromSymbolToBuffers(symbol,rates_total,bars_colors) && tries<5)
        {
         //--- Un contatore delle chiamate della funzione CopyFromSymbolToBuffers()
         tries++;
        }
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Riempie i buffer indicatore con i prezzi                                       |
//+--------------------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,int total,int bar_colors)
  {
//--- Nell'array rates[], copieremo Open, High, Low e Close
   MqlRates rates[];
//--- Il contatore dei tentativi
   int attempts=0;
//--- Quanto è stato copiato
   int copied=0;
//--- Fa 25 tentativi per ottenere una timeseries sul simbolo desiderato
   while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
     {
      Sleep(100);
      attempts++;
      if(messagesPrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
     }
//--- Se non è riuscito a copiare un numero sufficiente di barre
   if(copied!=bars)
     {
      //--- Forma un messaggio stringa
      string comm=StringFormat("Per il simbolo %s, è riuscito a ricevere solo %d barre delle %d richieste",
                               name,
                               copied,
                               bars
                               );
      //--- Mostra un messaggio in un commento nella finestra del grafico principale
      Comment(comm);
      //--- Mostra il messaggio
      if(messagesPrint(comm);
      return(false);
     }
   else
     {
      //--- Imposta il display del simbolo 
      PlotIndexSetString(0,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
      IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_BARS("+name+")");
     }
//--- Inizializza i buffers con valori vuoti
   ArrayInitialize(ColorBarsBuffer1,0.0);
   ArrayInitialize(ColorBarsBuffer2,0.0);
   ArrayInitialize(ColorBarsBuffer3,0.0);
   ArrayInitialize(ColorBarsBuffer4,0.0);
 
//--- Copia prezzi nei buffers
   for(int i=0;i<copied;i++)
     {
      //--- Calcola l'indice appropriato per i buffers
      int buffer_index=total-copied+i;
      //--- Scrive i prezzi nei buffers
      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);
  }
//+--------------------------------------------------------------------------------+
//| Restituisce in modo casuale il simoblo dal Market Watch                        |
//+--------------------------------------------------------------------------------+
string GetRandomSymbolName()
  {
//--- Il numero dei simboli mostrati nella finestra Market Watch
   int symbols=SymbolsTotal(true);
//--- La posizione di un simbolo nella lista - un numero casuale da 0 a simboli
   int number=MathRand()%symbols;
//--- Restituisce il nome di un simbolo nella posizione specificata
   return SymbolName(number,true);
  }
//+--------------------------------------------------------------------------------+
//| Cambia il colore dei segmenti zigzag                                           |
//+--------------------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- Il numero dei colori
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- Per ogni indice colore definisce un nuovo colore casualmente
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- Ottiene un valore casuale
      int number=MathRand();
      //--- Ottiene un indice nell'array col[] come resto della divisione dell'intero
      int i=number%size;
      //--- Imposta il colore per ogni indice che ha proprietà PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  Il numero di stili grafici
                          PLOT_LINE_COLOR,      //  Identificatore proprietà
                          plot_color_ind,       //  Lìindice del colore, dove scriviamo il colore
                          cols[i]);             //  Un nuovo colore
      //--- Scrivi i colori
      comm=comm+StringFormat("BarColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza delle barre                                                 |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Una stringa per la formazione delle informazioni riguardo le proprietà della barra
   string comm="";
 
//--- Un blocco per il cambio della larghezza delle barre
   int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
   int width=number%5;   // La larghezza è impostata da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Scrive il nome del simbolo
   comm="\r\n"+symbol+comm;
 
//--- Imposta le informazioni del grafico usando un commento
   Comment(comm);
  }