DRAW_COLOR_SECTION

The DRAW_COLOR_SECTION style is a color version of DRAW_SECTION, but unlike the latter, it allows drawing sections of different colors. Lo stile DRAW_COLOR_SECTION, come tutti gli stili di colore con la parola COLOR nel titolo, contiene un buffer indicatore aggiuntivo speciale che memorizza l'indice del colore (numero) da un array di di colori impostato in modo speciale. Così, il colore di ogni sezione può essere definito specificando l'indice di colore dell'indice della barra che corrisponde alla fine sezione.

The width, color and style of the sections can be specified like for the DRAW_SECTION style - using compiler directives or dynamically using the PlotIndexSetInteger() function. Cambiamenti dinamici delle proprietà di plotting permettono di "animare" gli indicatori, in modo che il loro aspetto cambi a seconda della situazione attuale.

Le sezioni vengono disegnate da un valore non vuoto di un altro valore non vuoto del buffer indicatore, i valori vuoti vengono ignorati. Per specificare quale valore deve essere considerato come "vuoto", impostare questo valore nella proprietà PLOT_EMPTY_VALUE: ad esempio, se l'indicatore deve essere disegnato come una sequenza di sezioni su valori diversi da zero, allora è necessario impostare il valore zero come uno vuoto:

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

Riempire sempre esplicitamente i valori dei buffer indicatore, impostare un valore vuoto in un buffer per gli elementi che non devono essere tracciati.

Il numero di buffer necessari per tracciare DRAW_COLOR_SECTION è 2.

  • un buffer per memorizzare i valori degli indicatori utilizzati per il disegno di una linea;
  • un buffer per memorizzare l'indice del colore, che viene utilizzato per elaborare la sezione (ha senso impostare solo valori non vuoti).

I colori possono essere specificati con la direttiva del compilatore #property indicator_color1 separati da una virgola. Il numero di colori non può superare 64.

Un esempio di indicatore che trae sezioni colorate ciascuna lunga 5 barre, utilizzando i valori del prezzo High. Il colore, la larghezza e lo stile delle sezioni cambiano in modo casuale ogni N ticks.

Un esempio di DRAW_COLOR_SECTION

Notare che inizialmente per Plot1 con DRAW_COLOR_SECTION 8 colori vengono impostati utilizzando la direttiva del compilatore #property. Poi nella funzioneOnCalculate(), i colori vengono impostati in modo casuale dalla gamma di colori colori[].

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_SECTION.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 mostrare DRAW_COLOR_SECTION"
#property description "Esso disegna sezioni colorate con la lunghezza uguale al numero specificato di barre"
#property description "Il colore, spessore e stile delle sezioni vengono cambiati in modo casuale"
#property description "dopo ogni N ticks"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorSection
#property indicator_label1  "ColorSection"
#property indicator_type1   DRAW_COLOR_SECTION
//--- Definisce 8 colori per la colorazione delle sezioni selezione (vengono conservate in uno speciale array)
#property indicator_color1  clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMediumVioletRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parametri di input
input int      N=5;                      // Numero di ticks da cambiare
input int      bars_in_section=5;        // La lunghezza delle sezioni espressa in barre
//--- Una variabile ausiliaria per calcolare la fine delle sezioni
int            divider;
int            color_sections;
//--- Un buffer per il plotting
double         ColorSectionBuffer[];
//--- Un buffer per memorizzare il colore linea su ciascuna barra
double         ColorSectionColors[];
//--- 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,ColorSectionBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
/ / --- Il valore 0 (vuoto) parteciperà al disegno
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- Il numero di colori ai colori delle sezioni
   int color_sections=8;   //  mostra un commento a #property indicator_color1
//--- Controllare il parametro indicatore
   if(bars_in_section<=0)
     {
      PrintFormat("Invalid section length=%d",bars_in_section);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=color_sections*bars_in_section;
//---
   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 colori usati per tracciare le sezioni
      ChangeColors(colors,color_sections);
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- Il numero della barra da cui inizia il calcolo dei valori degli indicatori
   int start=0;
//--- Se l'indicatore è stato calcolato prima, allora impostare l'inizio sulla barra precedente
   if(prev_calculated>0) start=prev_calculated-1;
//--- Qui ci sono tutti i calcoli dei valori degli indicatori
   for(int i=start;i<rates_total;i++)
     {
      //--- Se il numero della barra è divisibile per il section_length, significa che questa è la fine delle sezioni
      if(i%bars_in_section==0)
        {
         //--- Imposta la fine della sezione presso il prezzo elevato di questo bar
         ColorSectionBuffer[i]=high[i];
         //--- Un resto della divisione del numero di barra per number_of_colors*scetion_length
         int rest=i%divider;
         //Ottiene il numero dei colori =  da 0 a number_of_colors-1
         int color_indext=rest/bars_in_section;
         ColorSectionColors[i]=color_indext;
        }
      //--- Se il resto della divisione è pari a barre, 
      else
        {
         //--- Se non è successo niente, ignora bar - set 0
         else ColorSectionBuffer[i]=0;
        }
     }
//--- 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 intera
      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("SectionColorIndex[%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);
  }