//+------------------------------------------------------------------+ //| RSI Line Cross.mq4 | //| Copyright © 2010 Boston Technologies | //| http://www.bostontechnologies.com | //+------------------------------------------------------------------+ #define DECIMAL_CONVERSION 10 #define COMMENT_DIGITS 2 // defines for evaluating entry conditions #define INITIAL_CROSS_BAR 2 #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 "Boston Technologies" #property link "www.bostontechnologies.com" extern double Lots = 0.1; extern int RSI.Period.Fast = 9; extern int RSI.Period.Slow = 21; extern int RSI.AppliedPrice = 0; extern int Stop = 50; extern int TakeProfit = 100; extern int TrailStart = 50; extern int TrailAmount = 10; extern string StartTime = "00:00"; extern string EndTime = "23:59"; extern int MagicNumber = 99999; extern bool WriteScreenshots = true; datetime lastTradeTime, lastTradeLevel2; int Slippage = 2; int handle; string display = ""; double trailStart, trailAmount; int init() { if (Digits == 3 || Digits == 5) { Stop *= DECIMAL_CONVERSION; TakeProfit *= DECIMAL_CONVERSION; TrailStart *= DECIMAL_CONVERSION; TrailAmount *= DECIMAL_CONVERSION; } trailStart = TrailStart * Point; trailAmount = TrailAmount * Point; lastTradeTime = Time[1]; Print("Broker: " + AccountCompany()); return(0); } int deinit() { return(0); } int start() { display = ""; TrailStop( MagicNumber, ORDER_COMMENT, trailStart, trailAmount); double fastRSI.Now = iRSI( Symbol(), Period(), RSI.Period.Fast, RSI.AppliedPrice, LAST_BAR); double fastRSI.Then = iRSI( Symbol(), Period(), RSI.Period.Fast, RSI.AppliedPrice, LAST_BAR + 1); double slowRSI.Now = iRSI( Symbol(), Period(), RSI.Period.Slow, RSI.AppliedPrice, LAST_BAR); double slowRSI.Then = iRSI( Symbol(), Period(), RSI.Period.Slow, RSI.AppliedPrice, LAST_BAR + 1); bool permission = NoOpenPositionsExist( ORDER_COMMENT ) && lastTradeTime != Time[ THIS_BAR ] && CheckTime( StartTime, EndTime); if( fastRSI.Now > slowRSI.Now && fastRSI.Then < slowRSI.Then ) { ExitAll( SHORT ); if( permission ) { if( DoTrade( LONG, Lots, Stop, TakeProfit, ORDER_COMMENT ) ) { lastTradeTime = Time[ THIS_BAR ]; } } } if( fastRSI.Now < slowRSI.Now && fastRSI.Then > slowRSI.Then ) { ExitAll( LONG ); if( permission ) { if( DoTrade( SHORT, Lots, Stop, TakeProfit, ORDER_COMMENT ) ) { lastTradeTime = Time[ THIS_BAR ]; } } } Comment(display); return(0); } 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); } 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; 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"); OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES); for (i=0; i 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 NoOpenPositionsExist(string theComment) { int total = OrdersTotal(); for(int i = 0; i < total; i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderComment() == theComment) { return (false); } } return (true); } 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 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, string theComment, double trailStart, double trailAmount) { double profitPips, increments, sl; for(int i = 0; i < OrdersTotal(); i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() != magic && OrderSymbol() != Symbol() && OrderComment() != theComment) { continue; } if( OrderType() == OP_BUY ) { // move to break even if( Bid - OrderOpenPrice() >= trailStart && OrderStopLoss() < OrderOpenPrice() ) { Print("Moving stop to breakeven. Bid is " + DoubleToStr( Bid, Digits )); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Blue) ); } profitPips = Bid - ( trailStart + OrderOpenPrice() ) ; increments = MathFloor( profitPips / trailAmount ); if ( increments >= 1 && Bid >= OrderStopLoss() + trailStart + ( increments * trailAmount ) ) { sl = OrderOpenPrice() + ( increments * trailAmount ); if( sl > OrderStopLoss() && OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, Blue) ) { Print("Trailng stop updated. Total increments: " + DoubleToStr(increments, Digits) ); return(true); } } } if( OrderType() == OP_SELL ) { // move to break even if( OrderOpenPrice() - Ask >= trailStart && OrderStopLoss() > OrderOpenPrice() ) { Print("Moving stop to breakeven. Ask is " + DoubleToStr( Ask, Digits )); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red) ); } profitPips = ( OrderOpenPrice()- trailStart ) - Ask ; increments = MathFloor( profitPips / trailAmount ); if ( increments >= 1 && Ask <= OrderStopLoss() - trailStart - ( increments * trailAmount ) ) { sl = OrderOpenPrice() - ( increments * trailAmount ); if( sl < OrderStopLoss() && OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, Red) ) { Print("Trailng stop updated. Total increments: " + DoubleToStr(increments, Digits) ); return(true); } } } } return( false ); }