DRAW_HISTOGRAM

Lo stile DRAW_HISTOGRAM disegna un istogramma come una sequenza di colonne di un colore specificato da zero ad un valore specificato. I valori sono presi dal buffer indicatore. La larghezza, il colore e lo stile della colonna possono essere specificati come per lo stile DRAW_LINE - utilizzando le direttive del compilatore o in modo dinamico utilizzando la funzione PlotIndexSetInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di cambiare l'aspetto dell'istogramma sulla base della situazione attuale.

Dal momento che una colonna dal livello zero è disegnata su ogni barra, DRAW_HISTOGRAM dovrebbe meglio essere utilizzata in una finestra di grafico separata. Molto spesso questo tipo di tracciamento viene utilizzato per creare indicatori del tipo oscillatore, per esempio, Bears Power oppure OSMA. Per i valori vuoti non visualizzabili deve essere specificato il valore zero.

Il numero di buffer necessari per tracciare DRAW_HISTOGRAM è 1.

Un esempio di indicatore che disegna una sinusoide di un colore specificato basato sulla funzione MathSin(). Il colore, la larghezza e lo stile di tutte le colonne dell'istogramma cambiano in modo casuale ogni N ticks. Il parametro barre specifica il periodo della sinusoide, che è dopo il numero specificato di barre per cui la sinusoide ripeterà il ciclo.

Un esempio di stile DRAW_HISTOGRAM

Notare che inizialmente per Plot1 con DRAW_HISTOGRAM le proprietà vengono impostate utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà vengono impostate in modo casuale. Il parametro N è impostato in parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).

//+--------------------------------------------------------------------------------+
//|                                                             DRAW_HISTOGRAM.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 per dimostrare DRAW_HISTOGRAM"
#property description "Esso disegna una sinusoide come un istogramma in una finestra separata"
#property description "Il colore e la larghezza delle colonne vengono modificate in modo casuale"
#property description "dopo ogni N ticks"
#property description "I parametri delle barre impostano il numero delle barre nel ciclo della sinusoide"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Histogram
#property indicator_label1  "Histogram"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parametri di input
input int      bars=30;          // Il periodo della sinusoide in barre
input int      N=5;              // Il numero di ticks che cambiano l'istogramma
//--- buffers indicatore
double         HistogramBuffer[];
//--- Un fattore per ottenere l'angolo di 2Pi in radianti, moltiplicato per il parametro di barre
double    multiplier;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato  |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- Calcola il moltiplicatore
   if(bars>1)multiplier=2.*M_PI/bars;
   else
     {
      PrintFormat("Imposta il valore di bars=%d maggiore di 1",barre);
      //--- Terminazione precoce dell'indicatore 
      return(INIT_PARAMETERS_INCORRECT);
     }
//---
   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;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
   ticks++;
//--- Se un numero critico di ticks è stato accumulato
   if(ticks>=N)
     {
      //--- Cambia le proprietà della linea
      ChangeLineAppearance();
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- Calcola i valori dell'indicatore
   int start=0;
//--- Se già calcolato nelle precedenti starts di OnCalculate
   if(prev_calculated>0) start=prev_calculated-1; // imposta l'inizio del calcolo con la penultima barra
//--- Compila il buffer di indicatore con valori
   for(int i=start;i<rates_total;i++)
     {
      HistogramBuffer[i]=sin(i*multiplier);
     }
//--- Restituisce il valore prev_calculated per la successiva chiamata della funzione
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza delle linee nell'indicatore                 |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
   string comm="";
//--- Un blocco per cambiare il colore della linea
   int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors [] 
   int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
   int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- Un blocco per modificare la larghezza della linea
   number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
   int width=number%5;   // La larghezza è impostata da 0 a 4
//--- Imposta la larghezza
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Un blocco per cambiare lo stile della linea
   number=MathRand();
//--- Il divisore è uguale alla grandezza dell'array styles
   size=ArraySize(styles);
//--- Ottiene l'indice per selezionare un nuovo stile, come resto della divisione intera
   int style_index=number%size;
//--- Imposta lo stile della linea
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Scrive lo stile della linea
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Imposta le informazioni del grafico usando un commento
   Comment(comm);
  }