//+------------------------------------------------------------------+
//| Victor Umnyashkin.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| ver 6.0 Final http://www.metaquotes.net |
//+------------------------------------------------------------------+
//---â ñðàâíåíèè ñ 4 âåð óáðàíî äåëåíèå íà N è èçìåíåí ïåðèîä äëÿ ñîâìåñòèìîñòè ñ Ïàðêèíñîíîâñêîé ( âåð. 5 òåñòîâàÿ)
#property copyright "Copyright © 2008, Victor Umnyashkin"
#property link "v354@hotbox.ru"
//---------
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
#property indicator_width1 1
//------parameters
extern int HI_Vol_Period=21;
extern int Trading_Day_In_Year=365;
extern bool Volatility_In_Percent=true;
extern int No_Use_Log_Scale = 0;
extern int Number_Of_Bars=1000;
extern double Coeff_Impl_Vol=1;
//--------------common arrays--------------------------
double HiVol[];
double Price[];
//----------common variables
int Nbar,Per,YearBase,IsLog;
double Percent,Coeff;
//--------------------------
int init()
{
//------åñëè íå çàäàíî êîëè÷åñòâî áàðîâ áåðåì âñþ èñòîðèþ
if( Number_Of_Bars == 0 ) Number_Of_Bars=Bars;
//------reassign parameters
IsLog=No_Use_Log_Scale;
Per=HI_Vol_Period-1; //------Èçìåíåíî !!! ÷òîáû êîëè÷åñòâî áàðîâ äëÿ ðàñêåòà ñîâïàäàëî ñ Ïàðêèíñîíîâñêîé âîëàòèëüíîñòüþ
Coeff=Coeff_Impl_Vol;
//------ïåðèîä äîëæåí áûòü >=2
if( Per <= 1 ) Per=2;
//-----íåëüçÿ ïîñ÷èòàòü çà ïðåäåëàìè äîñòóïíîé èñòîðèè
if( Number_Of_Bars > Bars) Number_Of_Bars=Bars;
//------
Nbar=Number_Of_Bars-Per-1;
//---------------check enough history
if( Nbar <= 1 ) Alert("Íåäîñòàòî÷íî èñòîðèè äëÿ ðàñ÷åòà èíäèêàòîðà. Äîñòóïíî áàðîâ ", Bars," Íàäî ",Per+1);
//------type of measurement unit
Percent=1;
if( Volatility_In_Percent ) Percent=100;
//--------âû÷èñëÿåì ãîäîâóþ áàçó òåêóùåãî òàéìôðåéìà
//-------ò.å. êîëè÷åñòâî áàðîâ òåêóùåãî òàéìôðåéìà â êîëè÷åñòâå òîðãîâûõ äíåé ãîäà( êîë-âî áàðîâ â ãîäó)
YearBase=Trading_Day_In_Year;
YearBase=YearBase*PERIOD_D1/Period();
//--------åñëè ÷èñëî òîðãîâûõ äíåé â ãîäó íå óêàçàíî òî âû÷èñëÿåì ïðîñòî âîëàòèëüíîñòü çà N bar
if( YearBase == 0 ) YearBase=Per+1;
//---- indicators
int dig = MathMax(Digits,4);
if( Volatility_In_Percent ) dig=4;
IndicatorDigits(dig);
IndicatorBuffers(1);
SetIndexBuffer(0,HiVol);
//----òèï ëèíèè
SetIndexStyle(0, DRAW_LINE);
//------------------íå ðèñîâàòü íóëè
SetIndexEmptyValue(0,0);
//-----------ôîðìèðóåì èìÿ èíäèêàòîðíîé ëèíèè
string shortname,fullname;
shortname ="HV("+HI_Vol_Period+")";
if (Volatility_In_Percent) shortname=shortname+" % ";
SetIndexLabel(0,shortname);
//ôîðìèðóåì íàçâàíèå èíäèêàòîðà
fullname="Hist.Volatility ";
if(IsLog == 1 ) fullname="HV of increment";
if(IsLog == 2 ) fullname="HV of difference";
//--------äîáàâëÿåì çíà÷åíèå ãîäîâîé áàçû â áàðàõ åñëè íàäî
if( YearBase != Per+1 ) fullname=fullname+" taken on "+YearBase+ " bars year base";
fullname=fullname+" "+shortname;
//Print(fullname);
IndicatorShortName(fullname);
//-----------ôîðìèðóåì ìàññèâ öåí ïå÷àòàì êîëè÷åñòâî áàðîâ
ArraySetAsSeries(Price,true);
int TMP=ArrayResize(Price,Per+1);
//int TMP2=ArraySize(HiVol);
Print(shortname+" Bars used for calculation ", TMP," All History Bars ", Bars,
" Used history bars ",Number_Of_Bars," Result array lenght Bars ",Nbar);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
//----initial zero
if( counted_bars < 1 )for(int i2=Bars-1; i2<Nbar;i2--) HiVol[i2]=0.0;
//limit=Bars-counted_bars;
limit=Nbar+1;//-counted_bars;
if(counted_bars>Bars-Nbar) limit=Bars-counted_bars+1;
// Print("KT1 Limit = ",limit);
//----calculate indicator
//limit=3;
for( int i = 0 ; i< limit ; i++)
{
//------form price array from Per+1 elemrnts
for( int j=0;j<=Per;j++)
{
Price[j]=Close[i+j];
}
//---------call function of calculate N-Bar volatility
double Volatility= WVHiVol(Per,Price,IsLog);
//------take volatility to year base
//------& multiply on approx coeff of implyed voatility
HiVol[i]=Volatility*MathSqrt(1.0*YearBase/HI_Vol_Period)*Percent*Coeff;
}
return(0);
}
//+------------------------------------------------------------------+
//===========calculate N-Bars Historical Volatility on array Price
//=========== IsLog =0 use the Log scale ; IsLog = 1 use increment Scale Islog=2 difference scale
//=========return N-bar volatility or -1 if error
double WVHiVol(int N,double Price[],int IsLog)
{
int i,Log;double Mid,MidLog,MidIncr;
//-------use the Log scale ?
Log=IsLog;
//if( IsLog != 1 ) Log=0;
//---check parameters
//-------N must be >=2
if( N<=1 )
{
Print("WVHiVol Volatility period = ",N, " It must be >= 2 ",
"Calculation impossible ");
return(-1);
}
//------check array lenght
int M=ArraySize(Price);
if( M < N+1 )
{
Print("WVHiVol Price array lenght = ",M," Volatility period = ",N,
"Calculation impossible ");
return(-1);
}
//---------check price values != 0
bool zerovalue = false;
for( i = 0; i<= N ; i++)
{
if( Price[i] == 0) zerovalue =true;
break;
}
if( zerovalue )
{
Print("WVHiVol Price array contain zero value in ",i," element"+
"Calculation impossible. Switch off the Log scale ");
return(-1);
}
//---------Calc middle value Mid MidIncr & MidLog
Mid=0;MidIncr=0;MidLog=0;double delta=0;
for( i=1; i <= N ; i++)
{
delta=Price[i-1]-Price[i];
Mid = Mid + delta;
delta=delta/Price[i];
MidIncr= MidIncr + delta;
delta=Price[i-1]/Price[i];
MidLog = MidLog + MathLog(delta);
}
//-------divide them on inerval
Mid = Mid;//N;
MidIncr=MidIncr;//N;
MidLog = MidLog;//N;
//----------calc disperce
double Vol=0,VolLog=0,VolIncr=0;delta=0;
for( i=1; i<=N; i++)
{
delta=Price[i-1]-Price[i];
Vol = Vol + (delta-Mid)*(delta-Mid);
delta=delta/Price[i];
VolIncr= VolIncr + (delta-MidIncr)*(delta-MidIncr);
delta = MathLog(Price[i-1]/Price[i]);
VolLog = VolLog + (delta-MidLog)*(delta-MidLog);
}
//Print(" Vol ", DoubleToStr(Vol,15), " VolLog ", DoubleToStr(VolLog,15));
//--------calc volatility
Vol = MathSqrt(Vol/(N-1.0));
VolLog = MathSqrt(VolLog/(N-1.0));
VolIncr = MathSqrt(VolIncr/(N-1.0));
//Print(" Vol ", DoubleToStr(Vol,10), " VolLog ", DoubleToStr(VolLog,10));
//-------return no log scale value
if( Log == 2 ) return(Vol);
if( Log == 1 )return(VolIncr);
//-------return Log scale value
return(VolLog);
}
Comments