//+--------------------------------------------------------------------------------+
//| 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);
}
|