Miscellaneous
0
Views
0
Downloads
0
Favorites
ParkinsonHistVolatility
//+------------------------------------------------------------------+
//| Victor Umnyashkin.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| ver 1.0 http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Victor Umnyashkin"
#property link "v354@hotbox.ru"
//---------
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 MediumSeaGreen
#property indicator_width1 1
//------parameters
extern int HI_Vol_Period=21;
extern int Trading_Day_In_Year=365;
extern bool Volatility_In_Percent=true;
int Is_Use_Log_Scale = 1;
extern int Number_Of_Bars=1000;
extern double Coeff_Impl_Vol=1;
//--------------common arrays--------------------------
double HiVol[];
double Hi[],Lo[];
//----------common variables
int Nbar,Per,YearBase,IsLog;
double Percent,Coeff;
//--------------------------
int init()
{
//------åñëè íå çàäàíî êîëè÷åñòâî áàðîâ áåðåì âñþ èñòîðèþ
if( Number_Of_Bars == 0 ) Number_Of_Bars=Bars;
//------reassign parameters
IsLog=Is_Use_Log_Scale;
Per=HI_Vol_Period;
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;
//---- 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 ="PHV("+Per+")";
if (Volatility_In_Percent) shortname=shortname+" % ";
SetIndexLabel(0,shortname);
//ôîðìèðóåì íàçâàíèå èíäèêàòîðà
fullname="Parkinson Hi Vol ";
if(IsLog != 1 ) fullname="Hist.Vol.No Log scale";
//--------äîáàâëÿåì çíà÷åíèå ãîäîâîé áàçû â áàðàõ åñëè íàäî
if( YearBase != Per ) fullname=fullname+" taken on "+YearBase+ " bars year base";
fullname=fullname+" "+shortname;
//Print(fullname);
IndicatorShortName(fullname);
//-----------ôîðìèðóåì ìàññèâ öåí ïå÷àòàì êîëè÷åñòâî áàðîâ
//ArraySetAsSeries(Price,true);
int TMP;//=ArrayResize(Price,Per);
ArraySetAsSeries(Hi,true);
TMP=ArrayResize(Hi,Per);
ArraySetAsSeries(Lo,true);
TMP=ArrayResize(Lo,Per);
//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;
if(counted_bars>Bars-Nbar) limit=Bars-counted_bars+1;
//----calculat indicator
//limit=3;
for( int i = 0 ; i< limit ; i++)
{
//------form price array
for( int j=0;j<Per;j++)
{
Hi[j]=High[i+j];Lo[j]=Low[i+j];
}
//---------call function of calculate N-Bar volatility
double Volatility= WVHiVolParkinson(Per,Hi,Lo);
//------take volatility to year base
//------& multiply on approx coeff of implyed voatility
HiVol[i]=Volatility*MathSqrt(1.0*YearBase/Per)*Percent*Coeff;
//HiVol[i]=Volatility;
}
return(0);
}
double WVHiVolParkinson(int N,double Hi[],double Lo[])
{
double Log2=MathLog(2.0);
double sum=0;
for( int i =0 ; i<N ; i++ )
{
sum = sum + MathPow( MathLog( Hi[i]/Lo[i] ) ,2 )/(4*Log2);
}
sum=MathSqrt(sum/*/N*/);
return(sum);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---