#property description "L'indicateur calcule les valeurs absolues des différences entre"
#property description "les prix Open et Close ou High et Low, les affichant dans une sous-fenêtre"
#property description "sous forme d'histrogramme."
//--- paramètres de l'indicateur
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- éléments dessinés
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//--- paramètres d'entrée
input bool InpAsSeries=true; // Sens d'indexation dans le buffer de l'indicateur
input bool InpPrices=true; // Prix à utilise pour les calculs (true - Open,Close ; false - High,Low)
//--- buffer de l'indicateur
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Calcul des valeurs de l'indicateur |
//+------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
const double &first[],const double &second[],double &buffer[])
{
//--- variable de départ pour le calcul des barres
int start=prev_calculated;
//--- travaille sur la dernière barre si les valeurs de l'indicateur ont déjà été calculées sur le tick précédent
if(prev_calculated>0)
start--;
//--- définit le sens d'indexation des tableaux
bool as_series_first=ArrayGetAsSeries(first);
bool as_series_second=ArrayGetAsSeries(second);
bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- remplace le sens d'indexation avec un accès direct si nécessaire
if(as_series_first)
ArraySetAsSeries(first,false);
if(as_series_second)
ArraySetAsSeries(second,false);
if(as_series_buffer)
ArraySetAsSeries(buffer,false);
//--- calcule les valeurs de l'indicateur
for(int i=start;i<rates_total;i++)
buffer[i]=MathAbs(first[i]-second[i]);
}
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int OnInit()
{
//--- lie les buffers de l'indicateur
SetIndexBuffer(0,ExtBuffer);
//--- définit le sens d'indexation du buffer de l'indicateur
ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- vérifie pour quels prix l'indicateur est calculé
if(InpPrices)
{
//--- Prix Open et Close
PlotIndexSetString(0,PLOT_LABEL,"BodySize");
//--- définit la couleur de l'indicateur
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);
}
else
{
//--- Prix High et Low
PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");
//--- définit la couleur de l'indicateur
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé |
//+------------------------------------------------------------------+
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[])
{
//--- calcule l'indicateur selon la valeur du flag
if(InpPrices)
CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
else
CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- retourne la valeur de prev_calculated pour le prochain appel
return(rates_total);
}
|