//+------------------------------------------------------------------+ //| 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; i2Bars-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