//+------------------------------------------------------------------+
//|                                                   CCI simple.mq4 |
//+------------------------------------------------------------------+
#property copyright "mrtools"
#property link      "willtools@aol.com"

#property indicator_separate_window
#property indicator_buffers    4
#property indicator_color1     clrDimGray
#property indicator_color2     clrDimGray
#property indicator_color3     clrDimGray
#property indicator_color4     clrLimeGreen
#property indicator_style2     STYLE_DOT
#property indicator_level1     200
#property indicator_level2     -200
#property indicator_level3     0
#property indicator_levelcolor clrMediumOrchid
#property strict

//
//
//
//
//

extern int                CciPeriod      = 50;             // Cci period
extern ENUM_APPLIED_PRICE CciPrice       = PRICE_TYPICAL;  // Cci price
extern int                BandsPeriod    = 20;             // Bands period
extern double             BandsDeviation = 2;              // Bands deviations


double bandUp[],bandMi[],bandDn[],cci[],prices[];


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int init()
{
    for (int i=0; i<indicator_buffers; i++) SetIndexStyle(i,DRAW_LINE);
    IndicatorBuffers(5);
    SetIndexBuffer(0,bandUp);
    SetIndexBuffer(1,bandMi);
    SetIndexBuffer(2,bandDn);
    SetIndexBuffer(3,cci);
    SetIndexBuffer(4,prices);
    IndicatorShortName("CCI bands("+(string)CciPeriod+"");
return(0);
}
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int start()
{
   int counted_bars=IndicatorCounted();
   int i,limit;
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
         limit = MathMin(Bars-counted_bars,Bars-1);
   //
   //
   //
   //
   //

      for(i=limit; i>=0; i--)
      {
         prices[i]  = iMA(NULL,0,1,0,MODE_SMA,CciPrice,i);
         double avg = 0; for(int k=0; k<CciPeriod && (i+k)<Bars; k++) avg +=         prices[i+k];      avg /= CciPeriod;
         double dev = 0; for(int k=0; k<CciPeriod && (i+k)<Bars; k++) dev += MathAbs(prices[i+k]-avg); dev /= CciPeriod;
         if (dev!=0)
               cci[i] = (prices[i]-avg)/(0.015*dev);
         else  cci[i] = 0;
      }
      for(i=limit; i>=0; i--)
      {
         bandUp[i] = iBandsOnArray(cci,0,BandsPeriod,BandsDeviation,0,MODE_UPPER,i);
         bandDn[i] = iBandsOnArray(cci,0,BandsPeriod,BandsDeviation,0,MODE_LOWER,i);
         bandMi[i] = iBandsOnArray(cci,0,BandsPeriod,BandsDeviation,0,MODE_MAIN ,i);
      }
return(0);
}

   