//+------------------------------------------------------------------+ //| 3MA_CrossOver_AlertNoMAs.mq4 | //| Copyright © 2008, Robert Hill | //| | //| Will send alert when all three MAs first line up | //| fast > med > slow or fast < med < slow | //| Option to now shopw MAs on chart | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Robert Hill" #property indicator_chart_window #property indicator_buffers 5 #property indicator_color1 LawnGreen #property indicator_color2 Red #property indicator_color3 Red #property indicator_color4 Aqua #property indicator_color5 Yellow #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_width4 2 #property indicator_width5 2 extern bool SoundON=true; extern bool EmailON=false; extern bool ShowMAs = true; extern int fastMA_Period=7; extern int medMA_Period=16; extern int slowMA_Period=25; 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 fastMA_Type=1; extern int medMA_Type=1; extern int slowMA_Type=1; 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 fastMA_AppliedPrice = 0;//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 extern int medMA_AppliedPrice = 0;//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 extern int slowMA_AppliedPrice = 0;//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 CrossUp[]; double CrossDown[]; double fastMA[]; double medMA[]; double slowMA[]; int flagval1 = 0; int flagval2 = 0; double myPoint; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string lbl; //---- indicators SetIndexStyle(0, DRAW_ARROW, EMPTY); SetIndexArrow(0, 233); SetIndexBuffer(0, CrossUp); SetIndexStyle(1, DRAW_ARROW, EMPTY); SetIndexArrow(1, 234); SetIndexBuffer(1, CrossDown); SetIndexStyle(2, DRAW_LINE, STYLE_SOLID); SetIndexBuffer(2, fastMA); SetIndexStyle(3, DRAW_LINE, STYLE_SOLID); SetIndexBuffer(3, medMA); SetIndexStyle(4, DRAW_LINE, STYLE_SOLID); SetIndexBuffer(4, slowMA); lbl = getLbl(fastMA_Type); SetIndexLabel(2, lbl + DoubleToStr(fastMA_Period, 0) + ")"); lbl = getLbl(medMA_Type); SetIndexLabel(3, lbl + DoubleToStr(medMA_Period, 0) + ")"); lbl = getLbl(slowMA_Type); SetIndexLabel(4, lbl + DoubleToStr(slowMA_Period, 0) + ")"); myPoint = SetPoint(Symbol()); //---- return(0); } string getLbl(int MA_Type) { string lbl; switch(MA_Type) { case 0 : lbl = "SMA("; break; case 1 : lbl = "EMA("; break; case 2 : lbl = "SMMA("; break; case 3 : lbl = "LWMA("; break; default : lbl = "LSMA("; // Used for any value less than 0 or greater than 3 break; } return(lbl); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int limit, i, counter; double tmp=0; double fastMAnow, medMAnow, slowMAnow, fastMAprevious, medMAprevious, slowMAprevious; double Range, AvgRange; int counted_bars=IndicatorCounted(); //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; for(i = 0; i <= limit; i++) { counter=i; Range=0; AvgRange=0; for (counter=i ;counter<=i+9;counter++) { AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]); } Range=AvgRange/10; if (fastMA_Type > 3) { fastMAnow = iLsma(fastMA_Period, fastMA_AppliedPrice,i); fastMAprevious = iLsma(fastMA_Period, fastMA_AppliedPrice,i+1); } else { fastMAnow = iMA(NULL, 0, fastMA_Period, 0, fastMA_Type, fastMA_AppliedPrice, i); fastMAprevious = iMA(NULL, 0, fastMA_Period, 0, fastMA_Type, fastMA_AppliedPrice, i+1); } if (medMA_Type > 3) { medMAnow = iLsma(medMA_Period, medMA_AppliedPrice,i); medMAprevious = iLsma(medMA_Period, medMA_AppliedPrice,i+1); } else { medMAnow = iMA(NULL, 0, medMA_Period, 0, medMA_Type, medMA_AppliedPrice, i); medMAprevious = iMA(NULL, 0, medMA_Period, 0, medMA_Type, medMA_AppliedPrice, i+1); } if (slowMA_Type > 3) { slowMAnow = iLsma(slowMA_Period, slowMA_AppliedPrice,i); slowMAprevious = iLsma(slowMA_Period, slowMA_AppliedPrice,i+1); } else { slowMAnow = iMA(NULL, 0, slowMA_Period, 0, slowMA_Type, slowMA_AppliedPrice, i); slowMAprevious = iMA(NULL, 0, slowMA_Period, 0, slowMA_Type, slowMA_AppliedPrice, i+1); } if (ShowMAs) { fastMA[i] = fastMAnow; medMA[i] = medMAnow; slowMA[i] = slowMAnow; } CrossUp[i] = 0; CrossDown[i] = 0; // First check for MAs lined up for BUY signal if ((fastMAnow > medMAnow) && (medMAnow > slowMAnow)) { // Check for a fresh cross to reduce arrows and alerts if ((fastMAprevious < medMAprevious) || (medMAprevious < slowMAprevious) || (fastMAprevious < slowMAprevious)) { if (i == 1 && flagval1==0) { flagval1=1; flagval2=0; DoAlert("BUY"); } CrossUp[i] = Low[i] - Range*0.75; } } // Then check for MAs lined up for SELL signal else if ((fastMAnow < medMAnow) && (medMAnow < slowMAnow)) { // Check for a fresh cross to reduce arrows and alerts if ((fastMAprevious > medMAprevious) || (medMAprevious > slowMAprevious) || (fastMAprevious > slowMAprevious)) { if (i == 0 && flagval2==0) { flagval2=1; flagval1=0; DoAlert("SELL"); } CrossDown[i] = High[i] + Range*0.75; } } } return(0); } double SetPoint(string mySymbol) { double mPoint, myDigits; myDigits = MarketInfo (mySymbol, MODE_DIGITS); if (myDigits < 4) mPoint = 0.01; else mPoint = 0.0001; return(mPoint); } double iLsma( int LSMAPeriod, int LSMAPrice,int shift) { double wt; double ma1=iMA(NULL,0,LSMAPeriod,0,MODE_SMA ,LSMAPrice,shift); double ma2=iMA(NULL,0,LSMAPeriod,0,MODE_LWMA,LSMAPrice,shift); wt = MathFloor((3.0*ma2-2.0*ma1)/myPoint)*myPoint; return(wt); } void DoAlert(string which) { datetime tc; tc = TimeCurrent(); if (SoundON) Alert(which + " signal at Ask=",Ask,"\n Bid=",Bid,"\n Date=",TimeToStr(tc,TIME_DATE)," ",TimeHour(tc),":",TimeMinute(tc),"\n Symbol=",Symbol()," Period=",Period()); if (EmailON) SendMail(which + " signal alert",which + " signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(tc,TIME_DATE)+" "+TimeHour(tc)+":"+TimeMinute(tc)+" Symbol="+Symbol()+" Period="+Period()); }