DRAW_COLOR_LINE

Il valore DRAW_COLOR_LINE è una variante colorata dello stile DRAW_LINE e disegna una linea con i valori del buffer di indicatore. Ma questo stile, come tutti gli stili di colore con la parola COLOR nel loro titolo ha un buffer indicatore aggiuntivo speciale che memorizza l'indice di colore (numero) da un array di di colori impostato in modo speciale. Così, il colore di ogni segmento della linea può essere definito specificando l'indice di colore dell'indice per disegnare la linea in questa barra.

La larghezza, stile e colori delle linee possono essere impostati utilizzando le direttive del compilatore e dinamicamente 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.

Il numero di buffer necessari per tracciare DRAW_COLOR_LINE è 2.

  • un buffer per memorizzare i valori degli indicatori utilizzati per il disegno di una linea;
  • un buffer per memorizzare l'indice del colore della linea su ciascuna barra.

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.

//--- Definire 5 colori per colorare ogni barra (sono memorizzati nell' array speciale)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Up to 64 colors can be specified)

Un esempio di indicatore che disegna una linea utilizzando i prezzi Close delle barre. La larghezza della linea e lo stile cambiano in modo casuale ogni N=5 ticks.

Un esempio di stile DRAW_COLOR_LINE

I colori dei segmenti di linea anche cambiano anche in modo casuale nella funzione personalizzata ChangeColors().

//+--------------------------------------------------------------------------------+
//| 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("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }

L'esempio mostra la caratteristica delle versioni "colore" degli indicatori - per modificare il colore di un segmento di una linea, non è necessario modificare i valori nel buffer ColorLineColors[] (che contiene gli indici del colore). Tutto quello che dovete fare è impostare nuovi colori in un'array speciale. Questo permette di cambiare rapidamente il colore una volta per l'intero plotting, cambiando solo una piccola gamma di colori utilizzando la funzione PlotIndexSetInteger().

Notare che inizialmente per Plot1 con DRAW_COLOR_LINE le proprietà vengono impostate utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà sono impostate in modo casuale.

I parametri N e lunghezza (la lunghezza dei segmenti di colore nei bar) i parametri sono impostati nei parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).

//+--------------------------------------------------------------------------------+
//|                                                            DRAW_COLOR_LINE.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_LINE"
#property description "Traccia una linea sul prezzo di chiusura in pezzi colorati di 20 battute ciascuna"
#property description "La larghezza, lo stile e il colore delle parti della linea vengono modificati in modo casuale"
#property description "ogni N ticks"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
//--- Definire 5 colori per colorare ogni barra (sono memorizzati nell' array speciale)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Up to 64 colors can be specified)
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parametri di input
input int      N=5;           //Numero di ticks da cambiare
input int      Length=20;     // La lunghezza di ciascuna parte di colore in barre
int            line_colors=5; // Il numero di colori impostati è 5 - vedi #property indicator_color1
//--- Un buffer per il plotting
double         ColorLineBuffer[];
//--- Un buffer per memorizzare il colore linea su ciascuna barra
double         ColorLineColors[];
 
//--- L'array per memorizzare i colori contiene 7 elementi
color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- 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()
  {
//--- Associa un array e un buffer indicatore
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- Inizializzazione del generatore di numeri pseudo-casuali
   MathSrand(GetTickCount());
//---
   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 delle sezioni della linea
      ChangeColors(colors,5);
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- Blocco per il calcolo dei valori dell'indicatore
   for(int i=0;i<rates_total;i++)
     {
      //--- Scrive il valore dell'indicatore nel buffer
      ColorLineBuffer[i]=close[i];
      //--- Ora, imposta casualmente un set di indici di colori per questa barra
      int color_index=i%(5*Length);
      color_index=color_index/Length;
      //--- Per questa barra, la linea avrà il colore con l'indice color_index
      ColorLineColors[i]=color_index;
     }
 
//--- 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("LineColorIndex[%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);
  }