//+------------------------------------------------------------------+ //| Vidya.mq4 | //| | //| Vidya developed by Tushar Chande | //+------------------------------------------------------------------+ #property copyright "mladen" #property link "mladenfx@gmail.com" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 clrDeepSkyBlue #property indicator_color2 clrDimGray #property indicator_color3 clrDarkOrange #property indicator_width1 2 #property indicator_width3 2 #property indicator_style2 STYLE_DOT #property strict // // // // // extern int CmoPeriod = 10; // CMO period extern int SmoothPeriod = 9; // Smoothing period extern bool ShowHighLine = true; // Show high line? extern bool ShowMiddleLine = true; // Show middle line? extern bool ShowLowLine = true; // Show low line? double vidya1[],vidya2[],vidya3[]; //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // int init() { SetIndexBuffer(0,vidya1); SetIndexBuffer(1,vidya2); SetIndexBuffer(2,vidya3); return(0); } int start() { int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; int limit = MathMin(Bars-counted_bars,Bars-1); for(int i=limit; i>=0; i--) { double median = (High[i]+Low[i])/2; if (ShowHighLine) vidya1[i] = iVidya(High[i],median,CmoPeriod,SmoothPeriod,i,0); if (ShowMiddleLine) vidya2[i] = iVidya(median ,median,CmoPeriod,SmoothPeriod,i,1); if (ShowLowLine) vidya3[i] = iVidya(Low[i] ,median,CmoPeriod,SmoothPeriod,i,2); } return(0); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // #define _vidyaInstances 3 #define _vidyaInstancesSize 3 double vidya_work[][_vidyaInstances*_vidyaInstancesSize]; #define vidya_price 0 #define vidya_pricc 1 #define vidya_value 2 double iVidya(double price, double pricc, int cmoPeriods, int smoothPeriod, int r, int instanceNo=0) { if (ArrayRange(vidya_work,0)!=Bars) ArrayResize(vidya_work,Bars); r = Bars-r-1; int s = instanceNo*_vidyaInstancesSize; // // // using two prices prevents errors when zone indicator is calculated // // vidya_work[r][s+vidya_price] = price; vidya_work[r][s+vidya_pricc] = pricc; double sumUp = 0, sumDo = 0; for (int k=0; k=0; k++) { double diff = vidya_work[r-k][s+vidya_pricc]-vidya_work[r-k-1][s+vidya_pricc]; if (diff > 0) sumUp += diff; else sumDo -= diff; } vidya_work[r][s+vidya_value] = (r>0) ? vidya_work[r-1][s+vidya_value]+((((sumUp+sumDo)!=0)?MathAbs((sumUp-sumDo)/(sumUp+sumDo)):1)*2.00/(1.00+MathMax(smoothPeriod,1)))*(vidya_work[r][s+vidya_price]-vidya_work[r-1][s+vidya_value]) : price; return(vidya_work[r][s+vidya_value]); }