#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualizza tre livelli orizzontali in una finestra indicatore separata
#property indicator_level1 20
#property indicator_level2 50
#property indicator_level3 80
//--- imposta lo spessore dei livelli orizzontali
#property indicator_levelwidth 5
//--- imposta il colore dei livelli orizzontali
#property indicator_levelcolor clrAliceBlue
//--- imposta lo stile dei livelli orizzontali
#property indicator_levelstyle STYLE_DOT
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- imposta le descrizioni dei livelli orizzontali
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primo livello (indice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Secondo livello (indice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terzo livello (indice 2)");
//--- imposta il nome corto per l'indicatore
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetInteger() Demo");
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 tick_counter=0;
//--- calcola i ticks
tick_counter++;
//--- e calcola i colori dei livelli orizzontali a seconda del contatore del tick
ChangeLevelColor(0,tick_counter,3,6,10); // gli ultimi tre paramteri cambiano colore
ChangeLevelColor(1,tick_counter,3,6,8);
ChangeLevelColor(2,tick_counter,4,7,9);
//--- modifica lo stile delle linee orizzontali
ChangeLevelStyle(0,tick_counter);
ChangeLevelStyle(1,tick_counter+5);
ChangeLevelStyle(2,tick_counter+15);
//--- ottiene lo spessore come resto della divisione intera del numero di ticks per 5
int width=tick_counter%5;
//--- iterazione su tutti i livelli orizzontali ed impostazioni dello spessore
for(int l=0;l<3;l++)
IndicatorSetInteger(INDICATOR_LEVELWIDTH,l,width+1);
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Imposta il colore della linea orizzontale nella finestra indicatore separata |
//+--------------------------------------------------------------------------------+
void ChangeLevelColor(int level, // numero di linee orizzontali
int tick_number,// dividendo, numero per ottenere il resto della divisione
int f_trigger, // primo divisore del cambio di colore
int s_trigger, // secondo divisore del cambio di colore
int t_trigger) // terzo divisore del cambio di colore
{
static color colors[3]={clrRed,clrBlue,clrGreen};
//--- indice del colore dall'array colors[]
int index=-1;
//--- calcola il numero di colori dall'array colors[] per disegnare una linea orizzontale
if(tick_number%f_trigger==0)
index=0; // se tick_number è diviso per f_trigger senza dare resto
if(tick_number%s_trigger==0)
index=1; // se tick_number è diviso per s_trigger senza dare resto
if(tick_number%t_trigger==0)
index=2; // se tick_number è diviso per t_trigger senza dare resto
//--- se il colore è definito, impostarlo
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELCOLOR,level,colors[index]);
//---
}
//+--------------------------------------------------------------------------------+
//| Imposta lo stile della linea orizzontale nella finestra indicatore separata |
//+--------------------------------------------------------------------------------+
void ChangeLevelStyle(int level, // numero della linea orizzontale
int tick_number// numer per ottenere il resto della divisione
)
{
//--- array per memorizzare gli stili
static ENUM_LINE_STYLE styles[5]=
{STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//--- indice degli stili dall'array styles[]
int index=-1;
//--- calcola il numero dall'array styles[] per impostare lo stile della linea orizzontale
if(tick_number%50==0)
index=5; // se tick_number diviso per 50 è senza resto, allora lo stile è STYLE_DASHDOTDOT
if(tick_number%40==0)
index=4; // ... lo stile è STYLE_DASHDOT
if(tick_number%30==0)
index=3; // ... STYLE_DOT
if(tick_number%20==0)
index=2; // ... STYLE_DASH
if(tick_number%10==0)
index=1; // ... STYLE_SOLID
//--- se lo stile è definito, impostarlo
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELSTYLE,level,styles[index]);
}
|