//+------------------------------------------------------------------+ //| Val_Bars.mq4 | //| Fateev | //| fateevvv@yandex.ru | //+------------------------------------------------------------------+ #property copyright "Fateev" #property link "fateevvv@yandex.ru" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 DodgerBlue #property indicator_color2 Tomato //---- input parameters extern int n=25; // Количество дней для вычисления средней волатильности extern int History=5000; // Количество баров для расчета //---- buffers double ExtMapBuffer1[]; // Средняя волатильность double ExtMapBuffer2[]; // Текущая волатильность bool Work=true; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexBuffer(1,ExtMapBuffer2); //---- name for DataWindow SetIndexLabel(0,"Средняя волатильность"); SetIndexLabel(1,"Текущая волатильность"); switch(Period()) { case 1: break; case 5: break; case 15: break; case 30: break; case 60: break; case 240: break; default: Alert("Индикатор работает только на внутредневных барах"); Work=false; } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if(Work==false) return; double val_shift, av_val; datetime current_Hour, current_Minute; bool F=false; int i,j,jj; int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; int limit = Bars - counted_bars; if(counted_bars==0) limit-=1+n; i=limit; // if (i>History-1) // Если много баров то .. // i=History-1; // ..рассчитывать заданное колич. while(i>=0) { current_Hour =TimeHour(Time[i]); //Запоминаем текущий час current_Minute=TimeMinute(Time[i]); //Запоминаем текущую минуту val_shift=0; av_val=0; j=0; //количество посчитанных часовых баров jj=i+1; F=false; //Флаг находки всех n баров while(F==false && jjlimit) break; if(TimeMinute(Time[jj])==current_Minute && TimeHour(Time[jj])==current_Hour) { val_shift=val_shift+(High[jj]-Low[jj]); j++; } if(j==n) { F=true; //Все n баров найдены av_val=NormalizeDouble(val_shift/n,Digits); } jj++; } ExtMapBuffer1[i]=av_val; ExtMapBuffer2[i]=High[i]-Low[i]; i--; } return(0); } //+------------------------------------------------------------------+