#property indicator_separate_window #property indicator_buffers 7 #property indicator_color1 DeepSkyBlue #property indicator_color2 Black #property indicator_color3 White #property indicator_color4 Black #property indicator_color5 Black #property indicator_color6 Yellow #property indicator_color7 Aqua #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 1 #property indicator_width4 1 #property indicator_width5 1 #property indicator_width6 1 #property indicator_width7 1 #property indicator_level1 0 //--- input parameters extern int PERIOD = 15; extern double lvariator=2.5; extern double hvariator=3.25; extern double svariator=2.0; //--- buffers double buf_lup[] ; double buf_ldn[] ; double buf_lsr[] ; double buf_hup[] ; double buf_hdn[] ; double buf_hsr[] ; double buf_sum[] ; double ema_k0, ema_k1; int work_period; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorDigits(0); SetIndexBuffer(0,buf_lup); SetIndexBuffer(1,buf_ldn); SetIndexBuffer(2,buf_lsr); SetIndexBuffer(3,buf_hup); SetIndexBuffer(4,buf_hdn); SetIndexBuffer(5,buf_hsr); SetIndexBuffer(6,buf_sum); SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_NONE); SetIndexStyle(2,DRAW_LINE); SetIndexStyle(3,DRAW_NONE); SetIndexStyle(4,DRAW_NONE); SetIndexStyle(5,DRAW_LINE); SetIndexStyle(6,DRAW_LINE); ema_k0 = 2.0 / (PERIOD + 1); ema_k1 = 1.0 - ema_k0; work_period = Bars - PERIOD - 2; return(0); } int start() { int i, j ; double lu, ld ,hu , hd ; for(i = Bars - IndicatorCounted() - 1; i >= 0; i--) { if(i > work_period) { buf_lup[i] = -1; buf_hup[i] = -1; buf_ldn[i] = -1; buf_hdn[i] = -1; buf_lsr[i] = -1; buf_lsr[i] = -1; } else if(i == work_period) { buf_lup[i] = 0;buf_hup[i] = 0; buf_ldn[i] = 0;buf_hdn[i] = 0; buf_lsr[i] = 0;buf_hsr[i] = 0; for(j = Bars - 1; j >= i; j--) { calc(j, lu, ld, hu, hd); buf_lup[i] += lu * Volume[j]; buf_ldn[i] +=ld * Volume[j]; buf_lsr[i] += (lu-ld) * Volume[j]; buf_hup[i] += hu * Volume[j]; buf_hdn[i] +=hd * Volume[j]; buf_hsr[i] += (hu-hd) * Volume[j]; } buf_lup[i] /= PERIOD; buf_ldn[i] /= PERIOD; buf_lsr[i] /= PERIOD; buf_hup[i] /= PERIOD; buf_hdn[i] /= PERIOD; buf_hsr[i] /= PERIOD; } else { calc(i, lu, ld, hu, hd); buf_lup[i] = buf_lup[i + 1] * ema_k1 + lu * Volume[i] * ema_k0; buf_ldn[i] = buf_ldn[i + 1] * ema_k1 + ld * Volume[i] * ema_k0; buf_lsr[i] = buf_lsr[i + 1]* ema_k1 + (lu-ld) * Volume[i] * ema_k0; buf_hup[i] = buf_hup[i + 1] * ema_k1 + hu * Volume[i] * ema_k0; buf_hdn[i] = buf_hdn[i + 1] * ema_k1 + hd * Volume[i] * ema_k0; buf_hsr[i] = buf_hsr[i + 1]* ema_k1 + (hu-hd) * Volume[i] * ema_k0; buf_sum[i] =((buf_hsr[i] + buf_lsr[i]) *( High[i] + Low[i] )) / svariator; }} return(0); } // Расчёт величин для бара. void calc(int bar, double &lup, double &ldn,double &hup, double &hdn){ if(High[bar] == Low[bar]) { lup = 0;ldn = 0;hup = 0;hdn = 0; return; } double range = High[bar] - Low[bar]; double lpath = High[bar]- Close[bar]; double lzum = (range -lpath)/lvariator ; double hpath = Close[bar]- Low[bar]; double hzum = (range -hpath)/hvariator ; if(Close[bar] > Open[bar]) { ldn =1.0 - (lzum + lpath)/ range ; lup = 1.0 - ldn; hdn = 1.0 - (hzum + hpath)/ range ; hup = 1.0 - hdn; } else { lup =1.0 - (lzum + lpath)/ range ; ldn = 1.0 - lup; hup = 1.0 - (hzum + hpath)/ range ; hdn = 1.0 - hup; }}