DRAW_COLOR_HISTOGRAM2

Lo stile DRAW_COLOR_HISTOGRAM2 disegna un istogramma di un colore specificato - segmenti verticali utilizzando i valori di due buffer indicatore. Ma a differenza del mono-colore DRAW_HISTOGRAM2, in questo stile ogni colonna dell'istogramma può avere il suo colore da un insieme predefinito. I valori di tutti i segmenti vengono presi dal buffer indicatore.

La larghezza, stile e colore dell'istogramma possono essere specificati come per lo stile DRAW_HISTOGRAM2 - 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.

Lo stile DRAW_COLOR_HISTOGRAM2 può essere utilizzato in una sottofinestra separata di un grafico e nella sua finestra principale. Per i valori vuoti nulla viene tracciato, tutti i valori nei buffer indicatore devono essere impostati in modo esplicito. I buffer non vengono inizializzati con i valori vuoti.

Il numero di buffer necessari per tracciare DRAW_COLOR_HISTOGRAM2 è 3:

  • due buffer per memorizzare l'estremità superiore e inferiore del segmento verticale su ciascuna barra;
  • un buffer per memorizzare l'indice del colore, che viene utilizzato per disegnare il segmento (ha senso impostare solo valori non vuoti).

Un esempio di indicatore che disegna un istogramma di colore specificato tra i prezzi Alti e Bassi. Per ogni giorno della settimana, le linee dell'istogramma hanno un colore differente. Il colore del giorno, la larghezza e lo stile dell'istogramma cambiano in modo casuale ogni N ticks.

Un esempio di stile DRAW_COLOR_HISTOGRAM2

Si prega di notare che per Plot1 con lo stile DRAW_COLOR_HISTOGRAM2, 5 colori vengono impostati utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() i colori sono scelti a caso dai 14 colori memorizzati nell' array colors[] .

Il parametro N è impostato in parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).

//+--------------------------------------------------------------------------------+
//|                                                      DRAW_COLOR_HISTOGRAM2.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_COLOR_HISTOGRAM2"
#property description "Disegna un segmento tra Open e Close su ciascuna barra"
#property description "Il colore, lo spessore e lo stile vengono cambiati casualmente"
#property description "dopo ogni N ticks"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot ColorHistogram_2
#property indicator_label1  "ColorHistogram_2"
#property indicator_type1   DRAW_COLOR_HISTOGRAM2
//--- Definisce 5 colori per colorare l'istogramma in base ai giorni della settimana (che sono memorizzati nella matrice speciale)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- parametri input
input int      N=5;              // Il numero di ticks che cambiano l'istogramma
int            color_sections;
//--- Valori dei buffer
double         ColorHistogram_2Buffer1[];
double         ColorHistogram_2Buffer2[];
//--- Un buffer di indici di colore
double         ColorHistogram_2Colors[];
//--- Un array per memorizzare i colori contiene 14 elementi
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- 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,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- Imposta un valore vuoto
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- Il numero di colori per colorare la sinusoide
   color_sections=8;   //  Vedere il commento a #property indicator_color1      
//---
   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();
      //--- Cambia i colori usati per disegnare l'istogramma
      ChangeColors(colors,color_sections);      
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- Calcola i valori dell'indicatore
   int start=0;
//--- Per ottenere il giorno della settimana per il prezzo di apertura di ogni barra
   MqlDateTime dt;
//--- 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++)
     {
      TimeToStruct(time[i],dt);
      //--- valore
      ColorHistogram_2Buffer1[i]=high[i];
      ColorHistogram_2Buffer2[i]=low[i];
      //--- Imposta l'indice del colore secondo il giorno della settimana
      int day=dt.day_of_week;
      ColorHistogram_2Colors[i]=day;
     }
//--- Restituisce il valore prev_calculated per la successiva chiamata della funzione
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Cambia il colore dei segmenti della linea                                      |
//+--------------------------------------------------------------------------------+
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("HistogramColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza di una linea visualizzata nell'indicatore                   |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
   string comm="";
//--- Un blocco per modificare la larghezza della linea
   int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
   int width=number%5; // Lo spessore è impostato 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+" Width="+IntegerToString(width);
 
//--- Un blocco per cambiare lo stile della linea
   number=MathRand();
//--- Il divisore è uguale alla grandezza dell'array styles
   int size=ArraySize(styles);
//--- Ottiene l'indice per selezionare un nuovo stile, come resto della divisione intera
   int style_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Scrive lo stile della linea
   comm=EnumToString(styles[style_index])+", "+comm;
//--- Imposta le informazioni del grafico usando un commento
   Comment(comm);
  }