// See http://www.forexrealm.com/technical-analysis/technical-indicators/price-action-indicator.html

#property indicator_separate_window
#property indicator_buffers 3

#property indicator_color1 Lime
#property indicator_color2 DarkOrange
#property indicator_color3 Blue


extern int    MoveAvgPeriod5    = 5;
extern int    MoveAvgPeriod10    =10;
extern int    MoveAvgPeriod20    =20;
extern int    MoveAvgMethod    = MODE_EMA;

double dPainBuffer5[];
double dPainBuffer10[];
double dPainBuffer20[];

int init() {
    IndicatorShortName("PAIN-5");
    SetIndexBuffer(0,dPainBuffer5);
    SetIndexLabel(0,"PAIN-5");
    
    IndicatorShortName("PAIN-10");
    SetIndexBuffer(1,dPainBuffer10);
    SetIndexLabel(1,"PAIN-10");
    
    IndicatorShortName("PAIN-20");
    SetIndexBuffer(2,dPainBuffer20);
    SetIndexLabel(2,"PAIN-20");
    
    return(0);
 
}

int start() {

  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   // int iBarsToCalc = Bars - IndicatorCounted();
   // if (iBarsToCalc < Bars) iBarsToCalc++;
   
  //  for (int i=iBarsToCalc-1;i>=0;i--) {
  
  for(int i=0; i<limit; i++){
    
        double dCloseMA5 = iMA(NULL,0,MoveAvgPeriod5,0,MoveAvgMethod,PRICE_CLOSE,i);
        double dOpenMA5  = iMA(NULL,0,MoveAvgPeriod5,0,MoveAvgMethod,PRICE_OPEN, i);
        double dHighMA5 = iMA(NULL,0,MoveAvgPeriod5,0,MoveAvgMethod,PRICE_HIGH, i);
        double dLowMA5   = iMA(NULL,0,MoveAvgPeriod5,0,MoveAvgMethod,PRICE_LOW,  i);
        dPainBuffer5[i] = ( (dCloseMA5-dOpenMA5)+(dCloseMA5-dHighMA5)+(dCloseMA5-dLowMA5) );
        }
     
    for(i=0; i<limit; i++){   
        double dCloseMA10 = iMA(NULL,0,MoveAvgPeriod10,0,MoveAvgMethod,PRICE_CLOSE,i);
        double dOpenMA10  = iMA(NULL,0,MoveAvgPeriod10,0,MoveAvgMethod,PRICE_OPEN, i);
        double dHighMA10 = iMA(NULL,0,MoveAvgPeriod10,0,MoveAvgMethod,PRICE_HIGH, i);
        double dLowMA10   = iMA(NULL,0,MoveAvgPeriod10,0,MoveAvgMethod,PRICE_LOW,  i);
        dPainBuffer10[i] = ( (dCloseMA10-dOpenMA10)+(dCloseMA10-dHighMA10)+(dCloseMA10-dLowMA10) );
        }
       
    for(i=0; i<limit; i++) {
        double dCloseMA20 = iMA(NULL,0,MoveAvgPeriod20,0,MoveAvgMethod,PRICE_CLOSE,i);
        double dOpenMA20  = iMA(NULL,0,MoveAvgPeriod20,0,MoveAvgMethod,PRICE_OPEN, i);
        double dHighMA20 = iMA(NULL,0,MoveAvgPeriod20,0,MoveAvgMethod,PRICE_HIGH, i);
        double dLowMA20   = iMA(NULL,0,MoveAvgPeriod20,0,MoveAvgMethod,PRICE_LOW,  i);
        dPainBuffer20[i] = ( (dCloseMA20-dOpenMA20)+(dCloseMA20-dHighMA20)+(dCloseMA20-dLowMA20) );
        }
        
        
    }
    
    return(0);

}