DRAW_FILLING

Lo stile DRAW_FILLING disegna un'area colorata tra i valori dei due buffer indicatore. In realtà, questo stile disegna due linee e riempie lo spazio tra di loro con uno dei due colori specificati. E' usato per la creazione di indicatori che disegnano canali. Nessuno dei buffer può contenere solo valori vuoti, perché in questo caso nulla è tracciato.

È possibile impostare due colori di riempimento:

  • il primo colore è usato per le zone in cui i valori del primo buffer sono maggiori dei valori nel secondo buffer indicatore;
  • il secondo colore è usato per le aree in cui valori nel secondo buffer sono maggiori dei valori nel primo buffer indicatore.

Il colore di riempimento 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 è calcolato per tutte le barre, per cui i valori dei due buffer indicatore sono uguali né 0 né al valore vuoto. Per specificare quale valore deve essere considerato come "vuoto", impostare questo valore nelle proprietà PLOT_EMPTY_VALUE:

   #define INDICATOR_EMPTY_VALUE -1.0
   ...
//--- INDICATOR_EMPTY_VALUE (valore vuoto) non partecipa nel calcolo di 
   PlotIndexSetDouble (DRAW_FILLING_creation_index,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);

Il disegno delle barre che non partecipano al calcolo dell'indicatore dipende dai valori nei buffer indicatori:

  • Le barre, per le quali i valori di entrambi i buffer indicatori sono uguali a 0, non partecipano a disegnare l'indicatore. Ciò significa che l'area con valori zero non viene compilata.

DRAW_FILLING_without_drawing

  • Barre, per le quali i valori dei buffers indicatori sono pari al "valore vuoto", partecipano a disegnare l'indicatore. La zona con valori vuoti sarà compilata in modo da collegare le aree con valori significativi.

DRAW_FILLING_with_drawing

Va notato che se il "valore vuoto" è uguale a zero, le barre che non partecipano nel calcolo dell'indicatore vengono inoltre compilate.

Il numero di buffer necessari per tracciare DRAW_FILLING è 2.

Un esempio di indicatore che disegna un canale tra due MAs con differenti periodi di mediazione in una finestra separata. Il cambiamento dei colori all'incrocio delle medie mobili mostra visivamente il cambiamento delle tendenze al rialzo e al ribasso. I colori cambiano in modo casuale 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).

DRAW_FILLING

Notare che inizialmente per Plot1 con DRAW_FILLING le proprietà vengono impostate utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() nuovi colori vengono impostati in modo casuale.

//+--------------------------------------------------------------------------------+
//|                                                               DRAW_FILLING.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_FILLING"
#property description "Esso disegna un canale tra due MA in una finestra separata"
#property description "Il colore di riempimento viene cambiato dinamicamente"
#property description "dopo ogni N ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Intersection
#property indicator_label1  "Intersezione"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrRed,clrBlue
#property indicator_width1  1
//--- parametri di input
input int      Fast=13;          // Il periodo di fast MA
input int      Slow=21;          // Il periodo di slow MA
input int      shift=1;          // Lo slittamento dei MA verso il futuro(positivo)
input int      N=5;              // Numero di ticks da cambiare 
//--- Buffer Indicatore
double         IntersectionBuffer1[];
double         IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSlateGray};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
   fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
   slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
   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 sufficiente di ticks è stato accumulato
   if(ticks>=N)
     {
      //--- Cambia le proprietà della linea
      ChangeLineAppearance();
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- Fa il primo calcolo dell'indicatore, o i dati cambiano e richiede un ricalcolo completo
   if(prev_calculated==0)
     {
      //--- Copiare tutti i valori degli indicatori nei buffer appropriati
      int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
     }
   else // Riempie solo quei dati che sono aggiornati
     {
      //--- Ottiene la differenza nei barre tra l'inizio corrente e precedente di OnCalculate()
      int to_copy=rates_total-prev_calculated;
      //--- Se non c'è differenza, copieremo ancora un valore - sulla barra a zero
      if(to_copy==0) to_copy=1;
      //--- copia i valori to_copy alla fine dei buffer indicatore
      int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Cambia i colori del riempimento del canale                                     |
//+--------------------------------------------------------------------------------+
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_index1=number%size;
//--- Imposta il primo colore come proprietà PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- Scrive il primo colore
   comm=comm+"\r\nColor1 "+(string)colors[color_index1];
 
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
   number=MathRand(); // Ottiene un numero casuale
   int color_index2=number%size;
//--- Imposta il secondo colore come proprietà PLOT_LINE_COLOR 
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- Scrive il secondo colore
   comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- Imposta le informazioni del grafico usando un commento
   Comment(comm);
  }