Price Data Components
2
Views
0
Downloads
0
Favorites
Historical volatility - high-low
ÿþ//+------------------------------------------------------------------
#property copyright "© mladen, 2018"
#property link "mladenfx@gmail.com"
#property description "Historical volatility (high/low)"
//+------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
#property indicator_label1 "Historical volatility"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrDarkGray,clrSkyBlue,clrDodgerBlue
#property indicator_width1 2
//--- input parameters
input int inpVolPeriod=18; // Volatility period
//--- buffers and global variables declarations
double val[],valc[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,val,INDICATOR_DATA);
SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX);
//---
IndicatorSetString(INDICATOR_SHORTNAME,"Historical volatility (high/low)("+(string)inpVolPeriod+")");
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator de-initialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
if(Bars(_Symbol,_Period)<rates_total) return(prev_calculated);
double work[]; ArrayResize(work,inpVolPeriod); ArrayInitialize(work,0);
int i=(int)MathMax(prev_calculated-1,0); for(; i<rates_total && !_StopFlag; i++)
{
double avg = 0;
double sum = 0;
for(int k=0; k<inpVolPeriod && (i-k)>=0; k++)
{
work[k] = MathLog(high[i-k]/low[i-k]);
avg += work[k];
}
avg/=inpVolPeriod;
for(int k=0; k<inpVolPeriod; k++) sum+=(work[k]-avg)*(work[k]-avg);
//
//---
//
val[i] = MathSqrt(sum/inpVolPeriod);
valc[i] = (i>0) ?(val[i]>val[i-1]) ? 1 :(val[i]<val[i-1]) ? 2 : valc[i-1]: 0;
}
return (i);
}
//+------------------------------------------------------------------+
Comments