//+------------------------------------------------------------------+ //| CCI.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 LightSeaGreen //---- input parameters //---- indicator parameters extern string m = "--Moving Average Types--"; extern string m0 = " 0 = SMA"; extern string m1 = " 1 = EMA"; extern string m2 = " 2 = SMMA"; extern string m3 = " 3 = LWMA"; extern string m4 = " 4 = LSMA"; extern int MA_Type=0; extern string p = "--Applied Price Types--"; extern string p0 = " 0 = close"; extern string p1 = " 1 = open"; extern string p2 = " 2 = high"; extern string p3 = " 3 = low"; extern string p4 = " 4 = median(high+low)/2"; extern string p5 = " 5 = typical(high+low+close)/3"; extern string p6 = " 6 = weighted(high+low+close+close)/4"; extern int MA_AppliedPrice = 0; extern string c = "--CCI Inputs--"; extern int CCIPeriod = 14; //---- buffers double CCIBuffer[]; double RelBuffer[]; double DevBuffer[]; double MovBuffer[]; int MA_Mode; string strMAType; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 3 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(1, RelBuffer); SetIndexBuffer(2, DevBuffer); SetIndexBuffer(3, MovBuffer); //---- indicator lines SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, CCIBuffer); //---- if(CCIPeriod <= 0) CCIPeriod = 14; //---- SetIndexDrawBegin(0, CCIPeriod); //---- name for DataWindow and indicator subwindow label switch (MA_Type) { case 1: strMAType="EMA"; MA_Mode=MODE_EMA; break; case 2: strMAType="SMMA"; MA_Mode=MODE_SMMA; break; case 3: strMAType="LWMA"; MA_Mode=MODE_LWMA; break; case 4: strMAType="LSMA"; break; default: strMAType="SMA"; MA_Mode=MODE_SMA; break; } short_name = "CCI-" +strMAType+ " (" +CCIPeriod + ") "; IndicatorShortName(short_name); SetIndexLabel(0, short_name); //---- return(0); } //+------------------------------------------------------------------------+ //| LSMA - Least Squares Moving Average function calculation | //| LSMA_In_Color Indicator plots the end of the linear regression line | //+------------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| LSMA with PriceMode | //| PrMode 0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2, | //| 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4 | //+------------------------------------------------------------------+ double LSMA(int TimeFrame, int Rperiod, int prMode, int shift) { int i, myShift; double sum, pr; int length; double lengthvar; double tmp; double wt; length = Rperiod; sum = 0; for(i = length; i >= 1 ; i--) { lengthvar = length + 1; lengthvar /= 3; tmp = 0; myShift = length - i + shift; switch (prMode) { case 0: pr = iClose(NULL,TimeFrame,myShift);break; case 1: pr = iOpen(NULL,TimeFrame,myShift);break; case 2: pr = iHigh(NULL,TimeFrame,myShift);break; case 3: pr = iLow(NULL,TimeFrame,myShift);break; case 4: pr = (iHigh(NULL,TimeFrame,myShift) + iLow(NULL,TimeFrame,myShift))/2;break; case 5: pr = (iHigh(NULL,TimeFrame,myShift) + iLow(NULL,TimeFrame,myShift) + iClose(NULL,TimeFrame,myShift))/3;break; case 6: pr = (iHigh(NULL,TimeFrame,myShift) + iLow(NULL,TimeFrame,myShift) + iClose(NULL,TimeFrame,myShift) + iClose(NULL,TimeFrame,myShift))/4;break; } tmp = ( i - lengthvar)*pr; sum+=tmp; } wt = sum*6/(length*(length+1)); wt = MathFloor(wt/Point)*Point; return(wt); } //+------------------------------------------------------------------+ //| Commodity Channel Index | //+------------------------------------------------------------------+ int start() { int i, k, counted_bars = IndicatorCounted(); double price, sum, mul; if(CCIPeriod <= 1) return(0); if(Bars <= CCIPeriod) return(0); //---- initial zero if(counted_bars < 1) { for(i = 1; i <= CCIPeriod; i++) CCIBuffer[Bars-i] = 0.0; for(i = 1; i <= CCIPeriod; i++) DevBuffer[Bars-i] = 0.0; for(i = 1; i <= CCIPeriod; i++) MovBuffer[Bars-i] =0.0; } //---- last counted bar will be recounted int limit = Bars - counted_bars; if(counted_bars > 0) limit++; //---- moving average for(i = 0; i < limit; i++) { if (MA_Type == 4) MovBuffer[i]=LSMA(0, CCIPeriod, MA_AppliedPrice,i); else MovBuffer[i]=iMA(NULL,0,CCIPeriod,0,MA_Mode,MA_AppliedPrice,i); } //---- standard deviations i = Bars - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = Bars - counted_bars - 1; mul = 0.015 / CCIPeriod; while(i >= 0) { sum = 0.0; k = i + CCIPeriod - 1; while(k >= i) { price =(High[k] + Low[k] + Close[k]) / 3; sum += MathAbs(price - MovBuffer[i]); k--; } DevBuffer[i] = sum*mul; i--; } i = Bars - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { price = (High[i] + Low[i] + Close[i]) / 3; RelBuffer[i] = price - MovBuffer[i]; i--; } //---- cci counting i = Bars - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { if(DevBuffer[i] == 0.0) CCIBuffer[i] = 0.0; else CCIBuffer[i] = RelBuffer[i] / DevBuffer[i]; i--; } //---- return(0); } //+------------------------------------------------------------------+