//+------------------------------------------------------------------+ //| 12425.mq4 | //| Copyright Shaun Overton | //| www.onestepremoved.com | //+------------------------------------------------------------------+ #define DECIMAL_CONVERSION 10 #define COMMENT_DIGITS 2 // defines for evaluating entry conditions #define LAST_BAR 1 #define THIS_BAR 0 #define NEGATIVE_VALUE -1 // defines for managing trade orders #define RETRYCOUNT 10 #define RETRYDELAY 500 #define LONG 1 #define SHORT -1 #define ALL 0 #define ORDER_COMMENT "EA Order" #property copyright "Snowden, Programmed by OneStepRemoved.com" #property link "www.onestepremoved.com" extern double Risk = 0.5; extern double Lots = 1.0; extern int Stop = 50; extern int TakeProfit = 100; extern bool Reverse = false; extern string MondayStartTime = "00:00"; extern string MondayEndTime = "23:59"; extern string TuesdayStartTime = "00:00"; extern string TuesdayEndTime = "23:59"; extern string WednesdayStartTime = "00:00"; extern string WednesdayEndTime = "23:59"; extern string ThursdayStartTime = "00:00"; extern string ThursdayEndTime = "23:59"; extern string FridayStartTime = "00:00"; extern string FridayEndTime = "23:59"; extern string MondayNoBreakStartTime = "00:00"; extern string FridayNoBreakEndTime = "17:00"; extern bool MonFriNoBreak = true; extern bool IntraBar = false; extern int MagicNumber = 0; extern bool WriteScreenshots = true; extern int TrailStart = 50; extern int TrailAmount = 10; //AMA param extern int periodAMA=9; extern int nfast=2; extern int nslow=30; extern double G=2.0; extern double dK=2.0; //LWMA param extern int FasterLWMA = 5; extern int SlowerLWMA = 6; extern bool soundAlert = true; extern string soundFile = "lwma_crossover.wav"; extern bool textAlert = true; //MACD param extern int FastEMA=12; extern int SlowEMA=26; extern int SignalEMA=9; //indicator checks double AMABlue; double AMAGold; double MACDhisto; double MACD; double LWMA0up; double LWMA1up; double LWMA2up; double LWMA0down; double LWMA1down; double LWMA2down; bool bullish; bool bearish; bool IsLong=false; bool IsShort=false; bool OneTrade=false; bool InTime=false; datetime lastTradeTime; datetime lastAlertTime; datetime currentTime; datetime once=NULL; datetime CheckTime1=NULL; extern int SlippageExit = 6; extern int SlippageEnter =2; string display = ""; double trailStart, trailAmount; int decimalConv = 1; int minSLTPdstnc; int init() { if (Digits == 3 || Digits == 5) { Stop *= DECIMAL_CONVERSION; TakeProfit *= DECIMAL_CONVERSION; TrailStart *= DECIMAL_CONVERSION; TrailAmount *= DECIMAL_CONVERSION; SlippageExit *= DECIMAL_CONVERSION; SlippageEnter *= DECIMAL_CONVERSION; decimalConv = DECIMAL_CONVERSION; } trailStart = TrailStart * Point; trailAmount = TrailAmount * Point; // get miniumum stop/take profit distance minSLTPdstnc = MarketInfo(Symbol(), MODE_STOPLEVEL); Print("Broker: " + AccountCompany()); Comment("Loading... awaiting new tick"); return(0); } int deinit() { ExitAll(SHORT); ExitAll(LONG); return(0); } int start() { Comment(""); TrailStop(MagicNumber,trailStart,trailAmount); checkopentrades(); //risk % if(Risk!=0.0) Lots = (Risk * AccountEquity()) / MarketInfo(Symbol(), MODE_MARGINREQUIRED); //check enter InTime=false; if(TimeDayOfWeek(Time[0])>=1&&TimeDayOfWeek(Time[0])<=5) { InTime=true; CheckTimes(); if(InTime) { if(IntraBar) { AssignIndicators(THIS_BAR); if(((LWMA0up != EMPTY_VALUE && LWMA0up != 0.0)||(LWMA1up != EMPTY_VALUE && LWMA1up != 0.0)||(LWMA2up != EMPTY_VALUE && LWMA2up != 0.0)) && MACDhisto>0 && (AMABlue != EMPTY_VALUE && AMABlue != 0.0)&& !OneTrade) { if (currentTime != Time[0]) { currentTime = Time[0]; if(Reverse) { bearish = DoTrade(SHORT, Lots, Stop,TakeProfit ,""); bullish = false; IsShort=true; OneTrade=true; } else { bullish = DoTrade(LONG, Lots, Stop,TakeProfit ,""); bearish = false; OneTrade=true; IsLong=true; } } } if(((LWMA0down != EMPTY_VALUE && LWMA0down != 0.0)||(LWMA1down != EMPTY_VALUE && LWMA1down != 0.0)||(LWMA2down != EMPTY_VALUE && LWMA2down != 0.0)) && MACDhisto<0 && (AMAGold != EMPTY_VALUE && AMAGold != 0.0)&& !OneTrade) { if (currentTime != Time[0]) { currentTime = Time[0]; if(Reverse) { bullish = DoTrade(LONG, Lots, Stop,TakeProfit ,""); bearish = false; OneTrade=true; IsLong=true; } else { bearish = DoTrade(SHORT, Lots, Stop,TakeProfit ,""); bullish = false; IsShort=true; OneTrade=true; } } } } else { AssignIndicators(LAST_BAR); if(((LWMA0up != EMPTY_VALUE )||(LWMA1up != EMPTY_VALUE )) && MACDhisto>0 && (AMABlue != EMPTY_VALUE && AMABlue != 0.0)&& !OneTrade) { if(currentTime!=Time[0]) { currentTime=Time[0]; if(Reverse) { bearish = DoTrade(SHORT, Lots, Stop,TakeProfit ,""); bullish = false; IsShort=true; OneTrade=true; } else { bullish = DoTrade(LONG, Lots, Stop,TakeProfit ,""); bearish = false; OneTrade= true; IsLong= true; } } } if(((LWMA0down != EMPTY_VALUE && LWMA0down != 0.0)||(LWMA1down != EMPTY_VALUE && LWMA1down != 0.0)) && MACDhisto<0 && (AMAGold != EMPTY_VALUE && AMAGold != 0.0)&& !OneTrade) { if(currentTime!=Time[0]) { currentTime=Time[0]; if(Reverse) { bullish = DoTrade(LONG, Lots, Stop,TakeProfit ,""); bearish = false; OneTrade= true; IsLong= true; } else { bearish = DoTrade(SHORT, Lots, Stop,TakeProfit ,""); bullish = false; IsShort=true; OneTrade=true; } } } } } else { ExitAll(SHORT); ExitAll(LONG); OneTrade=false; IsLong=false; IsShort=false; } }//end check time of week //check exits if(IntraBar) { AssignIndicators(THIS_BAR); } else { AssignIndicators(LAST_BAR); LWMA1down=LWMA0down; LWMA1up=LWMA0up; } if( (MACDhisto<=0) && currentTime!=Time[0]) { if(Reverse&&IsShort) { if(IntraBar) { ExitAll(SHORT); OneTrade=false; IsShort=false; } else { ExitAll(SHORT); OneTrade=false; IsShort=false; } } else if(!Reverse&&IsLong) { if(IntraBar) { ExitAll(LONG); OneTrade=false; IsLong=false; } else { ExitAll(LONG); OneTrade=false; IsLong=false; } } } if( (MACDhisto>=0) && currentTime!=Time[0]) { if(Reverse&&IsLong) { if(IntraBar) { ExitAll(LONG); OneTrade=false; IsLong=false; } else { ExitAll(LONG); OneTrade=false; IsLong=false; } } else if(!Reverse&&IsShort) { if(IntraBar) { ExitAll(SHORT); OneTrade=false; IsShort=false; } else { ExitAll(SHORT); OneTrade=false; IsShort=false; } } } return(0); } void checkopentrades() { bool notrades=true; for(int i = OrdersTotal() - 1; i >= 0; i-- ) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if( OrderMagicNumber() == MagicNumber || OrderSymbol() == Symbol() ) {notrades=false;} } if(notrades) { OneTrade=false; IsShort=false; IsLong=false; } } void AssignIndicators(int bar) { AMABlue =iCustom( Symbol(), Period(), "AMA", periodAMA, nfast, nslow, G, dK,1, bar); AMAGold =iCustom( Symbol(), Period(), "AMA", periodAMA, nfast, nslow, G, dK,2, bar); MACDhisto=iCustom( Symbol(), Period(), "FX-Bay_MACD",FastEMA, SlowEMA, SignalEMA,2,bar); MACD =iCustom( Symbol(), Period(), "FX-Bay_MACD",FastEMA, SlowEMA, SignalEMA,0,bar); LWMA0up =iCustom( Symbol(), Period(), "LWMA", FasterLWMA, SlowerLWMA, soundAlert, soundFile, textAlert,0,bar); LWMA1up =iCustom( Symbol(), Period(), "LWMA", FasterLWMA, SlowerLWMA, soundAlert, soundFile, textAlert,0,bar+1); LWMA2up =iCustom( Symbol(), Period(), "LWMA", FasterLWMA, SlowerLWMA, soundAlert, soundFile, textAlert,0,bar+2); LWMA0down=iCustom( Symbol(), Period(), "LWMA", FasterLWMA, SlowerLWMA, soundAlert, soundFile, textAlert,1,bar); LWMA1down=iCustom( Symbol(), Period(), "LWMA", FasterLWMA, SlowerLWMA, soundAlert, soundFile, textAlert,1,bar+1); LWMA2down=iCustom( Symbol(), Period(), "LWMA", FasterLWMA, SlowerLWMA, soundAlert, soundFile, textAlert,1,bar+2); } bool DoTrade(int dir, double volume, int stop, int take, string comment) { double sl, tp; bool retVal = false; switch(dir) { case LONG: if (stop != 0) { sl = (stop*Point); } else { sl = 0; } if (take != 0) { tp = (take*Point); } else { tp = 0; } retVal = OpenTrade(LONG, volume, sl, tp, comment); break; case SHORT: if (stop != 0) { sl = (stop*Point); } else { sl = 0; } if (take != 0) { tp = (take*Point); } else { tp = 0; } retVal = OpenTrade(SHORT, volume, sl, tp, comment); break; } return(retVal); } void CheckTimes() { if(MonFriNoBreak) { if(TimeDayOfWeek(Time[0])==1) { if(TimeToStr(TimeCurrent(),TIME_MINUTES)=="23:59") InTime=true; else InTime= CheckTime(MondayNoBreakStartTime,"23:59"); } else if(TimeDayOfWeek(Time[0])==5) { if(TimeToStr(TimeCurrent(),TIME_MINUTES)=="00:00") InTime=true; else InTime=CheckTime("00:00",FridayNoBreakEndTime); } } else { switch(TimeDayOfWeek(Time[0])) { case 1:InTime=CheckTime(MondayStartTime,MondayEndTime); if(TimeToStr(TimeCurrent(),TIME_MINUTES)=="23:59" && MondayEndTime=="23:59") InTime=true; if(MondayStartTime==MondayEndTime) InTime=false; break; case 2:InTime=CheckTime(TuesdayStartTime,TuesdayEndTime); if( (TimeToStr(TimeCurrent(),TIME_MINUTES)=="23:59" && TuesdayEndTime=="23:59") || (TimeToStr(TimeCurrent(),TIME_MINUTES)=="00:00" && TuesdayStartTime == "00:00") ) InTime=true; if(MondayStartTime==TuesdayEndTime) InTime=false; break; case 3:InTime=CheckTime(WednesdayStartTime,WednesdayEndTime); if(TimeToStr(TimeCurrent(),TIME_MINUTES)=="23:59" && WednesdayEndTime=="23:59" || TimeToStr(TimeCurrent(),TIME_MINUTES)=="00:00" && WednesdayStartTime == "00:00") InTime=true; if(WednesdayStartTime==WednesdayEndTime) InTime=false; break; case 4:InTime=CheckTime(ThursdayStartTime,ThursdayEndTime); if(TimeToStr(TimeCurrent(),TIME_MINUTES)=="23:59" && ThursdayEndTime=="23:59" || TimeToStr(TimeCurrent(),TIME_MINUTES)=="00:00" && ThursdayStartTime == "00:00") InTime=true; if(ThursdayStartTime==ThursdayEndTime) InTime=false; break; case 5:InTime=CheckTime(FridayStartTime,FridayEndTime); if(TimeToStr(TimeCurrent(),TIME_MINUTES)=="00:00" && FridayStartTime=="00:00") InTime=true; if(FridayStartTime==FridayEndTime) InTime=false; break; default:InTime=false; } if(!InTime) Alert("false "+ TimeToStr(TimeCurrent(),TIME_MINUTES) ); } } bool OpenTrade(int dir, double volume, double stop, double take, string comment, int t = 0) { int i, j, ticket, cmd; double prc, sl, tp, lots; string cmt; color clr; Print("OpenTrade("+dir+","+DoubleToStr(volume,3)+","+DoubleToStr(stop,Digits)+","+DoubleToStr(take,Digits)+","+t+")"); lots = CheckLots(volume); for (i=0; i 0 || tp > 0) { Print("OpenTrade: opened ticket " + ticket); Screenshot("OpenTrade"); // Assign Stop Loss and Take Profit to order AssignSLTP(ticket, dir, stop, take); return (true); } else { if( ticket > 0 ) { Screenshot("OpenTrade_SLTP"); return( true ); } } // end if( sl > 0 || tp > 0) } // end if (ticket != -1) else if (ticket == -1) {// look for any open trades that are missing a stop loss and take profit if (FindTradesMissingSLTP(dir, stop, take, comment)) { Screenshot("OpenTrade_SLTP"); return( true ); } } Print("OpenTrade: error \'"+ErrorDescription(GetLastError())+"\' when entering with "+DoubleToStr(lots,3)+" @"+DoubleToStr(prc,Digits)); Sleep(RETRYDELAY); } // end for (i=0; i= 0; ix--) { OrderSelect(ix, SELECT_BY_POS, MODE_TRADES); // look for one of the EAs trades if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderComment() == comment) { // if the trade has neither stop loss or take profit attempt to assign one if (OrderStopLoss() <= 0 && OrderTakeProfit() <= 0) if (!AssignSLTP(OrderTicket(), dir, stop, take)) result = false; // record whether AssignSLTP ever fails } } // end for (int ix = OrdersTotal()-1; ix >= 0; ix--) // return result of our attempt return (result); } string ConvertBoolToStr(bool value) { if (value) { return("True"); } else { return("False"); } } double CheckLots(double lots) { double lot, lotmin, lotmax, lotstep, margin; lotmin = MarketInfo(Symbol(), MODE_MINLOT); lotmax = MarketInfo(Symbol(), MODE_MAXLOT); lotstep = MarketInfo(Symbol(), MODE_LOTSTEP); margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED); if (lots*margin > AccountFreeMargin()) lots = AccountFreeMargin() / margin; lot = MathFloor(lots/lotstep + 0.5) * lotstep; if (lot < lotmin) lot = lotmin; if (lot > lotmax) lot = lotmax; return (lot); } void Screenshot(string moment_name) { if ( WriteScreenshots ) WindowScreenShot(WindowExpertName()+"_"+Symbol()+"_M"+Period()+"_"+ Year()+"-"+two_digits(Month())+"-"+two_digits(Day())+"_"+ two_digits(Hour())+"-"+two_digits(Minute())+"-"+two_digits(Seconds())+"_"+ moment_name+".gif", 1024, 768); } string two_digits(int i) { if (i < 10) return ("0"+i); else return (""+i); } bool Exit(int ticket, int dir, double volume, color clr, int t = 0) { int i, j, cmd; double prc, sl, tp, lots; string cmt; bool closed; Print("Exit("+dir+","+DoubleToStr(volume,3)+","+t+")"); for (i=0; i= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderType() == OP_BUY && ( direction == LONG || direction == ALL) ) { Exit(OrderTicket(), LONG, OrderLots(), Blue); } if (OrderType() == OP_SELL && ( direction == SHORT || direction == ALL) ) { Exit( OrderTicket(), SHORT, OrderLots(), Red); } } } } bool CheckTime(string start, string end) { string today = TimeToStr( iTime(Symbol(),PERIOD_D1, 0 ), TIME_DATE ) + " "; datetime startTime = StrToTime( today + start); datetime endTime = StrToTime( today + end); if(startTime <= endTime) { if(TimeCurrent() > startTime && TimeCurrent() < endTime) { return(true); } } if( startTime >= endTime ) { if( TimeCurrent() > startTime ) { return(true); } if( TimeCurrent() < endTime ) { return(true); } } if( startTime == endTime) { Comment("***** The Start Time cannot equal the End Time ******* "); } return(false); } bool TrailStop(int magic, double trailStart, double trailAmount) { double profitPips, increments, sl; double chgFromOpen; for(int i = 0; i < OrdersTotal(); i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == magic && OrderSymbol() == Symbol()) { RefreshRates(); if( OrderType() == OP_BUY ) { chgFromOpen = NormalizeDouble(Bid - OrderOpenPrice(), Digits); // move to break even if(chgFromOpen >= trailStart && chgFromOpen > (minSLTPdstnc * Point) && NormalizeDouble(OrderStopLoss(),Digits) < NormalizeDouble(OrderOpenPrice(), Digits) && trailStart != 0 ) { Print("Moving stop to breakeven on order " + OrderTicket() + ". Bid is " + DoubleToStr( Bid, Digits ) + ", Trail start is " + DoubleToStr( trailStart, Digits ) ); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Blue) ); } profitPips = Bid - ( trailStart + OrderOpenPrice() ) ; if( trailAmount != 0) increments = MathFloor( profitPips / trailAmount ); else increments = 0; if ( increments >= 1 && Bid >= OrderOpenPrice() + trailStart + ( increments * trailAmount ) ) { sl = NormalizeDouble( OrderOpenPrice() + ( (increments-1) * trailAmount ), Digits); display = "\n\nRequested stop loss: " + DoubleToStr( sl, Digits); if( sl > NormalizeDouble(OrderStopLoss(), Digits) ) { if( OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, Blue ) ){ Print("Trailng stop updated. Total increments: " + DoubleToStr(increments, Digits) ); return(true); } } } } if( OrderType() == OP_SELL ) { chgFromOpen = NormalizeDouble(OrderOpenPrice() - Ask, Digits); // move to break even if( chgFromOpen >= trailStart && chgFromOpen > (minSLTPdstnc * Point) && NormalizeDouble(OrderStopLoss(),Digits) > NormalizeDouble(OrderOpenPrice(), Digits) && trailStart != 0 ) { Print("Moving stop to breakeven on order " + OrderTicket() + ". Ask is " + DoubleToStr( Ask, Digits ) + ", Trail start is " + DoubleToStr( trailStart, Digits ) ); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red) ); } profitPips = ( OrderOpenPrice()- trailStart ) - Ask ; if( trailAmount != 0) { increments = MathFloor( profitPips / trailAmount ); } else { increments = 0; } if ( increments >= 1 && Ask <= OrderOpenPrice() - trailStart - ( increments * trailAmount ) ) { sl = NormalizeDouble(OrderOpenPrice() - ( (increments-1) * trailAmount ), Digits); if( sl < NormalizeDouble(OrderStopLoss(), Digits) ) { if( OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, Red) ) { Print("Trailng stop updated. Total increments: " + DoubleToStr(increments, Digits) ); return(true); } } } } if( IsStopped() ) { break; } } } return( false ); }