#property description "L'indicatore calcola i valori assoluti della differenza tra"
#property description "i prezzi Open e Close o High e Low visualizzandoli in una sottofinestra separata"
#property description "come un istogramma."
//--- impostazioni indicatore
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//--- parametri di input
input bool InpAsSeries=true; // Direzione di indicizzazione nel buffere indicatore
input bool InpPrices=true; // Calcolo dei prezzi (true - Open,Close; false - High,Low)
//--- buffer indicatore
double ExtBuffer[];
//+--------------------------------------------------------------------------------+
//| Calcola i valori dell'indicatore |
//+--------------------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
const double &first[],const double &second[],double &buffer[])
{
//--- variabile iniziale per il calcolo delle barre
int start=prev_calculated;
//--- lavora all'ultima barra se i valori degli indicatori sono già stati calcolati al tick precedente
if(prev_calculated>0)
start--;
//--- definisce la direzione di indicizzazione nell'array
bool as_series_first=ArrayGetAsSeries(first);
bool as_series_second=ArrayGetAsSeries(second);
bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- sostituisce la direzione di indicizzazione con una diretta se necessario
if(as_series_first)
ArraySetAsSeries(first,false);
if(as_series_second)
ArraySetAsSeries(second,false);
if(as_series_buffer)
ArraySetAsSeries(buffer,false);
//--- calcola i valori dell'indicatore
for(int i=start;i<rates_total;i++)
buffer[i]=MathAbs(first[i]-second[i]);
}
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- lega i buffer indicatore
SetIndexBuffer(0,ExtBuffer);
//--- imposta l'elemento di indicizzazione nel buffer indicatore
ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- controlla per quali prezzi l'indicatore è calcolato
if(InpPrices)
{
//--- Apre e Chiude i prezzi
PlotIndexSetString(0,PLOT_LABEL,"BodySize");
//--- imposta i colori dell'indicatore
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);
}
else
{
//--- Prezzi High e Low
PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");
//--- imposta i colori dell'indicatore
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);
}
//---
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[])
{
//--- calcola l'indicatore in base al valore della flag
if(InpPrices)
CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
else
CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
|