//+------------------------------------------------------------------+ //| Cowabunga.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Blue #property indicator_color4 Red extern int IndicatorDisplacement = 15; extern bool Show_Trend = true; extern bool Only_Show_Valid_Triggers= true; extern bool Send_Mail; //---- buffers double UPTrend[]; double DNTrend[]; double UPTrigger[]; double DNTrigger[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- additional buffers are used for counting IndicatorBuffers(4); //---- indicators SetIndexLabel(2,NULL); SetIndexLabel(3,NULL); if((Symbol()=="GBPUSD")&&(Period()==PERIOD_M15)) { SetIndexLabel(0,NULL); SetIndexLabel(1,NULL); SetIndexStyle(0,DRAW_LINE,STYLE_DOT,1,Blue); SetIndexStyle(1,DRAW_LINE,STYLE_DOT,1,Red); } else { SetIndexLabel(0,"UP TREND"); SetIndexLabel(1,"DOWN TREND"); SetIndexStyle(0,DRAW_LINE,0,3,Blue); SetIndexStyle(1,DRAW_LINE,0,3,Red); } SetIndexStyle(2,DRAW_ARROW,EMPTY,3,Blue); SetIndexStyle(3,DRAW_ARROW,EMPTY,3,Red); SetIndexArrow(2,SYMBOL_ARROWUP); SetIndexArrow(3,SYMBOL_ARROWDOWN); SetIndexBuffer(0,UPTrend); SetIndexBuffer(1,DNTrend); SetIndexBuffer(2,UPTrigger); SetIndexBuffer(3,DNTrigger); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int maCross,StochCHANGE,maCross4H,StochCHANGE4H,MACDChange,i,counted_bars=IndicatorCounted(); double ma5now,ma10now,ma5prev,ma10prev,ma5now4H,ma10now4H,ma5prev4H,ma10prev4H; double RSI,Stoch1,Stoch2,Signal1,Signal2,MACDChange1,MACDChange2,RSI4H,Stoch4H1,Stoch4H2,Signal4H1,Signal4H2; int Trigger,i4h; static int TrendON; bool GBP15; string text,CRLF; CRLF = CharToStr(13) + CharToStr(10); GBP15=((Symbol()=="GBPUSD")&&(Period()==PERIOD_M15)); if(Bars<=100) return(0); //---- check for possible errors if(counted_bars<0) return(-1); //---- the last counted bar will be recounted if(counted_bars>0) counted_bars--; i=Bars-counted_bars; while(i>=0) { //---- TREND4H i4h=iBarShift(NULL,PERIOD_H4,iTime(NULL,0,i+1),true)+1; ma5now4H=iMA(NULL,PERIOD_H4,5,0,MODE_EMA,PRICE_CLOSE,i4h); ma10now4H=iMA(NULL,PERIOD_H4,10,0,MODE_EMA,PRICE_CLOSE,i4h); ma5prev4H=iMA(NULL,PERIOD_H4,5,0,MODE_EMA,PRICE_CLOSE,i4h+1); ma10prev4H=iMA(NULL,PERIOD_H4,10,0,MODE_EMA,PRICE_CLOSE,i4h+1); if(ma5now4H > ma5prev4H && ma10now4H > ma10prev4H && ma5prev4H < ma10prev4H && ma5now4H > ma10now4H) maCross4H=1; else if(ma5now4H < ma5prev4H && ma10now4H < ma10prev4H && ma5prev4H > ma10prev4H && ma5now4H < ma10now4H) maCross4H=2; else maCross4H=0; RSI4H= iRSI(NULL,PERIOD_H4,9,PRICE_CLOSE,i4h); Stoch4H1= iStochastic(NULL,PERIOD_H4,10,3,3,MODE_SMA,0,MODE_MAIN,i4h); Stoch4H2= iStochastic(NULL,PERIOD_H4,10,3,3,MODE_SMA,0,MODE_MAIN,i4h+1); Signal4H1= iStochastic(NULL,PERIOD_H4,10,3,3,MODE_SMA,0,MODE_SIGNAL,i4h); Signal4H2= iStochastic(NULL,PERIOD_H4,10,3,3,MODE_SMA,0,MODE_SIGNAL,i4h+1); if(Stoch4H1>Stoch4H2 && Signal4H1>Signal4H2) StochCHANGE4H=1; else if(Stoch4H1<Stoch4H2 && Signal4H1<Signal4H2) StochCHANGE4H=2; else StochCHANGE4H=0; if((maCross4H==1) && (RSI4H>50) && (StochCHANGE4H==1)) TrendON=1; if((maCross4H==2) && (RSI4H<50) && (StochCHANGE4H==2)) TrendON=-1; if(Show_Trend) { if(TrendON==1) { UPTrend[i]= High[i]+IndicatorDisplacement*Point; SetIndexLabel(0,"UP TREND"); SetIndexLabel(1,NULL); } else if(TrendON==-1) { DNTrend[i]= Low[i]-IndicatorDisplacement*Point; SetIndexLabel(0,NULL); SetIndexLabel(1,"DOWN TREND"); } } if(GBP15) { //---- TRIGGERS ma5now=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,i+1); ma10now=iMA(NULL,0,10,0,MODE_EMA,PRICE_CLOSE,i+1); ma5prev=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,i+2); ma10prev=iMA(NULL,0,10,0,MODE_EMA,PRICE_CLOSE,i+2); if(ma5now > ma5prev && ma10now > ma10prev && ma5prev < ma10prev && ma5now > ma10now) maCross=1; else if(ma5now < ma5prev && ma10now < ma10prev && ma5prev > ma10prev && ma5now < ma10now) maCross=2; else maCross=0; RSI= iRSI(NULL,0,9,PRICE_CLOSE,i+1); Stoch1= iStochastic(NULL,0,10,3,3,MODE_SMA,0,MODE_MAIN,i+1); Stoch2= iStochastic(NULL,0,10,3,3,MODE_SMA,0,MODE_MAIN,i+2); Signal1= iStochastic(NULL,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,i+1); Signal2= iStochastic(NULL,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,i+2); if(Stoch1>Stoch2 && Signal1>Signal2) StochCHANGE=1; else if(Stoch1<Stoch2 && Signal1<Signal2) StochCHANGE=2; else StochCHANGE=0; MACDChange1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i+1); MACDChange2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i+2); if(MACDChange2<0 && MACDChange2<MACDChange1) MACDChange=1; else if(MACDChange2>0 && MACDChange2>MACDChange1) MACDChange=2; else MACDChange=0; if((maCross==1) && (RSI>50) && (StochCHANGE==1) && (MACDChange==1) && ((TrendON==1)||(Only_Show_Valid_Triggers==false))) Trigger=1; if((maCross==2) && (RSI<50) && (StochCHANGE==2) && (MACDChange==2) && ((TrendON==-1)||(Only_Show_Valid_Triggers==false))) Trigger=2; if((UPTrigger[i+1]!=0x7fffffff)||(DNTrigger[i+1]!=0x7fffffff)) Trigger=0; if(Trigger==1) UPTrigger[i+1]= High[i+1]+10*Point; if(Trigger==2) DNTrigger[i+1]= Low[i+1]-10*Point; if((Trigger)&&(Send_Mail) && (TimeYear(Time[i])>=Year())&&(TimeMonth(Time[i])>=Month())&&(TimeDay(Time[i])>=Day())&&(TimeHour(Time[i])>=Hour())&&(TimeMinute(Time[i])>=Minute())) { if(Trigger==1) text="BUY "; else text="SELL "; text=text + "trigger occurred on " +TimeDay(Time[i+1])+"/"+TimeMonth(Time[i+1])+"/"+TimeYear(Time[i+1])+" at "+TimeHour(Time[i+1])+":"+TimeMinute(Time[i+1]) + " (server time)" + CRLF; text=text + CRLF + CRLF; text=text + "Trend is "; if(TrendON==1) text=text + "UP" + CRLF + CRLF; else text=text + "DOWN" + CRLF + CRLF; text = text +"MA5 = " + ma5now + CRLF; text = text +"MA10 = " + ma10now + CRLF; text = text +"MA5 Previous Bar = " + ma5prev + CRLF; text = text +"MA10 Previous Bar = " + ma10prev + CRLF; text = text +"RSI = " + RSI + CRLF; text = text +"STOCHASTIC MAIN = " + Stoch1 + CRLF; text = text +"STOCHASTIC SIGNAL = " + Signal1 + CRLF; text = text +"STOCHASTIC MAIN Previous Bar = " + Stoch2 + CRLF; text = text +"STOCHASTIC SIGNAL Previous Bar = " + Signal2 + CRLF; text = text +"MACD = " + MACDChange1 + CRLF; text = text +"MACD Previous Bar = " + MACDChange2 + CRLF; SendMail("COWABUNGA Trigger",text); Print(text); } /*if(Trigger>0) { Print(TimeDay(Time[i])+"/"+TimeMonth(Time[i])+"/"+TimeYear(Time[i])+" at "+TimeHour(Time[i])+":"+TimeMinute(Time[i])); Print(Day()+"/"+Month()+"/"+Year()+" at "+Hour()+":"+Minute()); Print(Send_Mail); }*/ } Trigger=0; i--; } return(0); } //+-----------------------------------------------------------------+
Sample
image not available
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_ARROW
Indicators Used:
Moving average indicator
Relative strength index
Stochastic oscillator
MACD Histogram
Custom Indicators Used:
Order Management characteristics:
Other Features:
It sends emails