#property indicator_separate_window
#property indicator_maximum 300
#property indicator_minimum -300
#property indicator_buffers 1
#property indicator_color1  DimGray
#property indicator_levelstyle 0;
#property indicator_level1  200
#property indicator_level2  100
#property indicator_level3  0
#property indicator_level4  -100
#property indicator_level5  -200
#property indicator_levelcolor 4868682

enum Pr{Cc,HL,HLC,HLCC,H_0_L};

extern Pr     CCIPrice    = Cc;
extern int    CCIPeriod   = 41;
extern double H_0_L_level = 0;

double cci2,H_0_L_leve2,avg,dev;
double Bcci[],Bprices[];

int init(){
   IndicatorBuffers(2);
   SetIndexBuffer(0,Bcci);
   SetIndexBuffer(1,Bprices);
   IndicatorShortName(NULL);
   H_0_L_leve2=0-H_0_L_level;
 return(0);
}

int start(){int i,k,limit=Bars-IndicatorCounted()-1;

   for(i=limit;i>=0;i--){if(CCIPrice==Cc){Bprices[i]=Close[i];}else
                         if(CCIPrice==HL){Bprices[i]=(High[i]+Low[i])*0.5;}else
                         if(CCIPrice==HLC){Bprices[i]=(High[i]+Low[i]+Close[i])/3;}else
                         if(CCIPrice==HLCC){Bprices[i]=(High[i]+Low[i]+Close[i]+Close[i])*0.25;}else
                         if(CCIPrice==H_0_L){cci2=iCCI(NULL,0,CCIPeriod,0,i);
                                             if(cci2>H_0_L_level){Bprices[i]=High[i];}else
                                             if(cci2<H_0_L_leve2){Bprices[i]=Low[i];}
                                             else{                Bprices[i]=Close[i];}}}

   for(i=limit;i>=0;i--){avg=0; dev=0;
                        for(k=0;k<CCIPeriod;k++){avg=avg+Bprices[i+k];}              avg=avg/CCIPeriod;
                        for(k=0;k<CCIPeriod;k++){dev=dev+MathAbs(Bprices[i+k]-avg);} dev=dev/CCIPeriod;
                           if(dev!=0){Bcci[i]=(Bprices[i]-avg)/(0.015*dev);}
                           else{               Bcci[i]=0;}}
 return(0);
}