#property description "L'indicatore evidenzia le candele che sono locali"
#property description "alti e bassi. Intervallo per la ricerca della lunghezza"
#property description "valori estremi devono essere trovati usando i parametri di input "
//--- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plot
#property indicator_label1 "Extremums"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrLightSteelBlue,clrRed,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- costanti predefinite
#define INDICATOR_EMPTY_VALUE 0.0
//--- parametri di input
input int InpNum=4; // Lunghezza semi-intervallo
//--- buffers indicatore
double ExtOpen[];
double ExtHigh[];
double ExtLow[];
double ExtClose[];
double ExtColor[];
//--- variabili globali
int ExtStart=0; // indice della prima candela che non è un estremo
int ExtCount=0; // numero di non-estremi nell'intervallo
//+--------------------------------------------------------------------------------+
//| Riempimento di candele non estreme |
//+--------------------------------------------------------------------------------+
void FillCandles(const double &open[],const double &high[],
const double &low[],const double &close[])
{
//--- riempimento di candele
ArrayCopy(ExtOpen,open,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtHigh,high,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtLow,low,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtClose,close,ExtStart,ExtStart,ExtCount);
}
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,ExtOpen);
SetIndexBuffer(1,ExtHigh);
SetIndexBuffer(2,ExtLow);
SetIndexBuffer(3,ExtClose);
SetIndexBuffer(4,ExtColor,INDICATOR_COLOR_INDEX);
//--- specificare il valore che non è mostrato
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- specificare i nomi dei buffer indicatore per la visualizzazione nella finestra dati
PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;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[])
{
//--- imposta l'indicizzazione dritta nelle time series
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
//--- Variabile di inizio calcolo barra
int start=prev_calculated;
//--- il calcolo non viene effettuato per le prime InpNum*2 barre
if(start==0)
{
start+=InpNum*2;
ExtStart=0;
ExtCount=0;
}
//--- se la barra è appena nata, controlla il prossimo potenziale estremo
if(rates_total-start==1)
start--;
//--- l'indice della barra che dev'essere controllato per l'estremo
int ext;
//--- calcolo loop valore indicatore
for(int i=start;i<rates_total-1;i++)
{
//--- inizialmente sulla barra i senza disegnarla
ExtOpen[i]=0;
ExtHigh[i]=0;
ExtLow[i]=0;
ExtClose[i]=0;
//--- indice dell'estremo per il controllo
ext=i-InpNum;
//--- controllo per il massimo locale
if(IsMax(high,ext))
{
//--- evidenzia di una candela estrema
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=1;
//--- evidenzia altre candele fino all'estremo con un colore neutro
FillCandles(open,high,low,close);
//--- cambia i colori della variabile
ExtStart=ext+1;
ExtCount=0;
//--- passa alla prossima iterazione
continue;
}
//--- controlla il minimo locale
if(IsMin(low,ext))
{
//--- evidenzia di una candela estrema
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=2;
//--- evidenzia altre candele fino all'estremo con un colore neutro
FillCandles(open,high,low,close);
//--- cambia i valori della variabile
ExtStart=ext+1;
ExtCount=0;
//--- passa alla prossima iterazione
continue;
}
//--- incrementa il numero dei non-estremi all'intervallo
ExtCount++;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Controlla se l'auttuale elemento dell'array è un alto locale |
//+--------------------------------------------------------------------------------+
bool IsMax(const double &price[],const int ind)
{
//--- variabile inizio dell' intervallo
int i=ind-InpNum;
//--- periodo di fine dell'intervallo
int finish=ind+InpNum+1;
//--- controlla la prima metà dell'intervallo
for(;i<ind;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- controlla la seconda metà dell'intervallo
for(i=ind+1;i<finish;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- questo èun estremo
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla se i correnti elementi dell'array sono bassi locali |
//+--------------------------------------------------------------------------------+
bool IsMin(const double &price[],const int ind)
{
//--- variabile inizio dell' intervallo
int i=ind-InpNum;
//--- variabile di fine intervallo
int finish=ind+InpNum+1;
//--- controlla la prima metà dell'intervallo
for(;i<ind;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- controlla la seconda metà dell'intervallo
for(i=ind+1;i<finish;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- questo èun estremo
return(true);
}
|