//+------------------------------------------------------------------+ //| Louw Coetzer aka FX Sniper | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //| FX_Sniper's_Ergodic_CCI_Trigger_Alert_Mod.mq4 //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, Fx Sniper." #property link "http://www.dunno.net/" //+------------------------------------------------------------------+ //| FX_Sniper's_Ergodic_CCI_&_Trigger_Alert_Fast by mladen | //+------------------------------------------------------------------+ //2008fxtsd #property copyright "mladen" #property link "mladenfx@gmail.com" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_width1 2 #property indicator_maximum 2 #property indicator_minimum 0 // // // // // extern int pq = 1; extern int pr = 7; extern int ps = 3; extern int trigger = 3; extern int TimeFrame = 0; extern bool ShowArrow = true; extern double IndicatorValue = 1; extern bool alertsOn = true; extern bool alertsSound = true; extern bool alertsMessage = true; extern bool alertsEmail = false; extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF"; string IndicatorFileName; double ErgoCCI[]; double MainCCI[]; double buffer[][8]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { SetIndexBuffer(0,ErgoCCI); SetIndexLabel(0,"Ergodic CCI"); SetIndexBuffer(1,MainCCI); SetIndexLabel(1,"Trigger Line"); if (ShowArrow) { SetIndexBuffer(0,ErgoCCI); SetIndexStyle (0,DRAW_ARROW); SetIndexArrow (0,167); SetIndexBuffer(1,MainCCI); SetIndexStyle (1,DRAW_ARROW); SetIndexArrow (1,167); } TimeFrame=MathMax(TimeFrame, Period()); string shortname = "FXSniper\'s_Ergodic ("+pq+","+pr+","+ps+"; "+trigger+") ["+TimeFrame+"]"; IndicatorShortName (shortname); IndicatorFileName = WindowExpertName(); return(0); } // // // // // #define mtm 0 #define absmtm 1 #define var1 2 #define var2 3 #define var2a 4 #define var2b 5 #define var2c 6 #define var2d 7 // // // // // int start() { int i,r,limit,counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if (TimeFrame != Period()) { limit = MathMax(limit,TimeFrame/Period()); for(i=limit; i>=0; i--) { int y = iBarShift(NULL,TimeFrame,Time[i]); ErgoCCI[i] = iCustom(NULL,TimeFrame,IndicatorFileName,pq,pr,ps,trigger,0,alertsOn,alertsSound,alertsMessage, alertsEmail,0,y); MainCCI[i] = iCustom(NULL,TimeFrame,IndicatorFileName,pq,pr,ps,trigger,0,alertsOn,alertsSound,alertsMessage, alertsEmail,1,y); } if (ShowArrow) for(int shift =limit; shift>=0; shift--) { MainCCI[shift] = IndicatorValue; ErgoCCI[shift] = IndicatorValue; if (ErgoCCI[shift] > MainCCI[shift]) { MainCCI[shift] = EMPTY_VALUE; ErgoCCI[shift] = IndicatorValue; } else if (ErgoCCI[shift] < MainCCI[shift]) { MainCCI[shift] = IndicatorValue; ErgoCCI[shift] = EMPTY_VALUE; } return(0); } if (ArrayRange(buffer,0) != Bars) ArrayResize(buffer,Bars); // // // // // double alphaPq = 2.0/(1.0+pq); double alphaPr = 2.0/(1.0+pr); double alphaPs = 2.0/(1.0+ps); double alphaTrigger = 2.0/(1.0+trigger); for(i=limit,r=Bars-limit-1; i >=0; i--,r++) { buffer[r][mtm] = Close[i]-Close[i+1]; buffer[r][absmtm] = MathAbs(buffer[r][mtm]); buffer[r][var1] = buffer[r-1][var1] + alphaPq*(buffer[r][mtm] -buffer[r-1][var1]); buffer[r][var2] = buffer[r-1][var2] + alphaPr*(buffer[r][var1] -buffer[r-1][var2]); buffer[r][var2a] = buffer[r-1][var2a] + alphaPq*(buffer[r][absmtm]-buffer[r-1][var2a]); buffer[r][var2b] = buffer[r-1][var2b] + alphaPr*(buffer[r][var2a] -buffer[r-1][var2b]); buffer[r][var2c] = buffer[r-1][var2c] + alphaPs*(buffer[r][var2] -buffer[r-1][var2c]); buffer[r][var2d] = buffer[r-1][var2d] + alphaPs*(buffer[r][var2b] -buffer[r-1][var2d]); if (buffer[r][var2d]!=0) ErgoCCI[i] = (500*buffer[r][var2c]/buffer[r][var2d]); else ErgoCCI[i] = 0; MainCCI[i] = MainCCI[i+1] + alphaTrigger*(ErgoCCI[i]-MainCCI[i+1]); } } if (alertsOn) { if(MainCCI[1] <= ErgoCCI[1] && MainCCI[0] > ErgoCCI[0]) doAlert("short"); if(MainCCI[1] >= ErgoCCI[1] && MainCCI[0] < ErgoCCI[0]) doAlert("long"); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // void doAlert(string doWhat) { static string previousAlert="nothing"; static datetime previousTime; string message; if (previousAlert != doWhat || previousTime != Time[0]) { previousAlert = doWhat; previousTime = Time[0]; // // // // // message = StringConcatenate(Symbol()," M",Period()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," ergodic ",doWhat); if (alertsSound) PlaySound("ok.wav");//alert2 if (alertsMessage) Alert(message); if (alertsEmail) SendMail(StringConcatenate(Symbol()," ergodic crossing"),message); } }
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
IndicatorFileName
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen
It plays sound alerts
It sends emails