//+------------------------------------------------------------------+ //| 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 link "Sound & email added by cja" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 LightSeaGreen //---- input parameters extern int CCIPeriod=14; extern bool SendEmail = false; extern bool SoundAlert_ON = false; extern string SoundFile ="alert2.wav"; extern int CCIHigh=100; extern int CCILow=-100; int PlayedSoundH = False; int PlayedSoundL = False; //---- buffers double CCIBuffer[]; double RelBuffer[]; double DevBuffer[]; double MovBuffer[]; //+------------------------------------------------------------------+ //| 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); SetLevelValue(0,CCIHigh); SetLevelValue(1,CCILow); SetLevelStyle(2,0,DarkSlateGray); //---- name for DataWindow and indicator subwindow label string Alert1="",Alert2=""; if(SendEmail==true)Alert1="ON"; if(SendEmail==false)Alert1="OFF"; if(SoundAlert_ON==true)Alert2="ON"; if(SoundAlert_ON==false)Alert2="OFF"; short_name="CCI( "+CCIPeriod+" ) [ Sound Alert "+Alert2+" ] [ Email Alert "+Alert1+" ]"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); //---- SetIndexDrawBegin(0,CCIPeriod); //---- return(0); } //+------------------------------------------------------------------+ //| Commodity Channel Index | //+------------------------------------------------------------------+ int start() { int i,k,counted_bars=IndicatorCounted(); double price,sum,mul; 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; iCCIPeriod-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--; } if(CCIBuffer[0]CCILow){PlayedSoundL = False;} if(CCIBuffer[0]>=CCIHigh && PlayedSoundH == False){if(SoundAlert_ON==true) PlaySound(SoundFile); if (SendEmail==true)SendMail("CCI "+Symbol()+" M"+Period()+"","CCI Xrossed @ Level "+CCIHigh+"\n"+Symbol()+" M"+Period()+"\n"+"Price "+DoubleToStr(Bid,Digits)+"\n" +"Time = "+TimeToStr(TimeLocal(),TIME_SECONDS)+"\n"+"Date = "+TimeToStr(TimeLocal(),TIME_DATE)+""); { PlayedSoundH = True;} if(CCIBuffer[0]<=CCILow && PlayedSoundL == False){if(SoundAlert_ON==true) PlaySound(SoundFile); if (SendEmail==true)SendMail("CCI "+Symbol()+" M"+Period()+"","CCI Xrossed @ Level "+CCILow+"\n"+Symbol()+" M"+Period()+"\n"+"Price "+DoubleToStr(Bid,Digits)+"\n" +"Time = "+TimeToStr(TimeLocal(),TIME_SECONDS)+"\n"+"Date = "+TimeToStr(TimeLocal(),TIME_DATE)+""); { PlayedSoundL = True;} }} //---- return(0); } //+------------------------------------------------------------------+