//+------------------------------------------------------------------+
//|                                                        Vidya.mq4 |
//|                                                           mladen |
//|                                                                  |
//| Vidya developed by Tushar Chande                                 |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"

#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  DodgerBlue

//
//
//
//
//

extern int    CmoPeriod1    = 25;
extern int    SmoothPeriod1 =  9;
extern int    Price1        = PRICE_CLOSE;
extern int    ma            =  9;
extern ENUM_MA_METHOD MAmode  =  MODE_SMA; 

//
//
//
//
//

double vidya1[], Bma[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int init()
{
   SetIndexBuffer(0,vidya1);
   SetIndexBuffer(1,Bma);
   return(0);
}

//
//
//
//
//

int start()
{
   int counted_bars = IndicatorCounted();
   int i,limit;
   
   if(counted_bars < 0) return(-1);
   if(counted_bars > 0) counted_bars--;
           limit = Bars-counted_bars;
   
   //
   //
   //
   //
   //
   
   for(i=limit; i>=0; i--) 
   {
      vidya1[i] = iVidya(iMA(NULL,0,1,0,MODE_SMA,Price1,i),CmoPeriod1,SmoothPeriod1,0,i);
   }
   for(i=limit; i>=0; i--) 
   {
      Bma[i] = iMAOnArray(vidya1,0,ma,0,MAmode,i);
   }
   return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

double  vidya_work[][2];
#define vidya_price 0
#define vidya_value 1

//
//
//
//
//

double iVidya(double price, int cmoPeriods, int smoothPeriods, int forCalculation, int i)
{
   if (ArrayRange(vidya_work,0)!=Bars) ArrayResize(vidya_work,Bars);
   
   int r = Bars-i-1;
   int s = forCalculation*2;
      double alpha = 2.00/(1.00+smoothPeriods);
   
      //
      //
      //
      //
      //
      
      vidya_work[r][s+vidya_price] = price;
            double sumUp  = 0;
            double sumDo  = 0;
            for (int j=0; j < cmoPeriods; j++)
            {
               double diff = vidya_work[r-j][s+vidya_price]-vidya_work[r-j-1][s+vidya_price];
               if (diff > 0)
                     sumUp += diff;
               else  sumDo -= diff;
            }      
            double k = 1;
               if ((sumUp+sumDo)!=0) k = MathAbs((sumUp-sumDo)/(sumUp+sumDo));
      
          vidya_work[r][s+vidya_value] = vidya_work[r-1][s+vidya_value]+(k*alpha)*(vidya_work[r][s+vidya_price]-vidya_work[r-1][s+vidya_value]);
          
      //
      //
      //
      //
      //
                
   return(vidya_work[r][s+vidya_value]);
}