//+------------------------------------------------------------------+
//|                                                 iCCI_Revercy.mq4 |
//|                                                        EvgeTrofi |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © Evgeniy Trofimov, 2009"
#property link      "http://vkontakte.ru/id5374887/"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Gray
extern int  CCIPeriod = 14;
extern double FindCCIlv1 = 100.0;
extern double FindCCIlv2 = 50.0;
extern bool showCCI0 = 1;
#property indicator_style3 2
#property indicator_style4 2
#property indicator_style5 4

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//   IndicatorBuffers(2);
   IndicatorDigits(Digits);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexDrawBegin(0,CCIPeriod);
   SetIndexLabel(0, "CloseUP");
   SetIndexDrawBegin(1,CCIPeriod);
   SetIndexLabel(1, "CloseDN");
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,ExtMapBuffer5);//
   IndicatorShortName("CCI_Revercy("+CCIPeriod+", "+FindCCIlv1+", "+FindCCIlv2+")");
   return(0);
}//init()
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int BeginBar;
   int counted_bars=IndicatorCounted(); // Ранее вычисленные бары
   if(counted_bars<0) return(-1); //---- обходим возможные ошибки
//---- новые бары не появились и поэтому ничего рисовать не нужно
   BeginBar=Bars-counted_bars-1;
//---- основные переменные
   double Price, CCILast, CCI;
   for(int t=BeginBar; t>=0; t--) {
      ExtMapBuffer1[t]=PriceCCI(FindCCIlv1, t, 0);
      ExtMapBuffer2[t]=PriceCCI(FindCCIlv1, t, 1);
      ExtMapBuffer3[t]=PriceCCI(FindCCIlv2, t, 0);
      ExtMapBuffer4[t]=PriceCCI(FindCCIlv2, t, 1);
      if (showCCI0)
      ExtMapBuffer5[t]=PriceCCI(0, t, 0);
      /*
      CCILast=iCCI(NULL,0,CCIPeriod,PRICE_TYPICAL,t+2);
      CCI=iCCI(NULL,0,CCIPeriod,PRICE_TYPICAL,t+1);
      if((CCILast>0 && CCI<0) || 
         (CCILast<0 && CCI>0))  {
         ExtMapBuffer1[t+2]=EMPTY_VALUE;
      }
      */
   }//Next t
   return(0);
} //start()
//+------------------------------------------------------------------+
double PriceCCI(double LevelCCI, int CurrentCandle=0, int index=0) {
   //Вычисляем текущий CCI
   double MovBuffer;
   double Price, SummPrice, Abs, SummAbs;
   double K = 0.015;
   int j;
   for(int i=CCIPeriod-1; i>=0; i--) {
      j=i+CurrentCandle;
      Price = (High[j]+Low[j]+Close[j])/3;
      MovBuffer=iMA(NULL,0,CCIPeriod,0,MODE_SMA,PRICE_TYPICAL,CurrentCandle);
      Abs = MathAbs(Price-MovBuffer);
      if(i>0) {
         SummPrice += Price;
         SummAbs += Abs;
      }
   }//Next i
   double CCI = (Price-MovBuffer)/((SummAbs+Abs)*K/CCIPeriod);
//   Comment("CCI("+CCIPeriod+") = "+DoubleToStr(CCI,4)+"\nFindCCI = "+DoubleToStr(LevelCCI,1));
   //В зависимости от знака CCI для расчёта необходимой цены используется соответствующая формула
   double H = High[CurrentCandle];
   double L =  Low[CurrentCandle];
          i = CCIPeriod;
   if(index==0) {
      CCI=LevelCCI;
      Price = -(H*i-L*i*i-H*i*i+L*i-CCI*H*K-CCI*L*K+3*SummPrice*i-
      CCI*3*K*SummPrice+CCI*H*K*i+CCI*L*K*i+CCI*3*K*SummAbs*i)/
      (i-i*i-CCI*K+CCI*K*i);
   } else {
      CCI=-LevelCCI;
      Price = -(H*i-L*i*i-H*i*i+L*i+CCI*H*K+CCI*L*K+3*SummPrice*i+
      CCI*3*K*SummPrice-CCI*H*K*i-CCI*L*K*i+CCI*3*K*SummAbs*i)/
      (i-i*i+CCI*K-CCI*K*i);
   }


   return(Price);
}//PriceCCI()
//+------------------------------------------------------------------+