//+------------------------------------------------------------------+ //| Simple S&R.mq4 | //| Copyright © 2008, LEGRUPO | //| http://www.legrupo.com | //| Version: 1.1 | //| History: | //| 1.0 => Release version to the public | //| 1.1 => fixes on this releases: | //| 1) StopLoss bug fixed; | //| 2) Now the EA close the open and pending orders on the | //| end of the day, you just need to see when day ends | //| on your broker. InterbankFX is GMT, so it is 0 on them | //| 3) You don't need to manage the MagicNumber anymore | //+------------------------------------------------------------------+ #include <WinUser32.mqh> #include <stderror.mqh> #include <stdlib.mqh> #property copyright "Copyright © 2007, LEGRUPO Version 1.6" #property link "http://www.legrupo.com" int ticket = 0; double Price[2]; double buy_sl, sell_sl; int giSlippage; int ticket_r3, ticket_r2, ticket_r1, ticket_s3, ticket_s2, ticket_s1 = 0; int cmt_r3, cmt_r2, cmt_r1, cmt_s3, cmt_s2, cmt_s1 = 0; int order_type = -1; int ExpertID = 883377; extern double StopLoss = 5000.0; extern double LotSize = 1; extern bool useStopLoss = true; extern int Slippage = 1; extern int Time_when_day_ends = 0; extern string On_the_end_of_day = "What to do on the end of the day?"; extern bool CloseOpenOrders = false; extern bool ClosePendingOrders = true; extern color clOpenBuy = CLR_NONE; extern color clSellBuy = CLR_NONE; color ExitLongColor = CLR_NONE; color ExitShortColor = CLR_NONE; extern string BuyComment = "Simple S&R BUYnotp"; extern string SellComment = "Simple S&R SELLnotp"; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int MagicNumber = MakeMagicNumber(); double s1 = NormalizeDouble(ObjectGet("S1", OBJPROP_PRICE1), Digits); double s2 = NormalizeDouble(ObjectGet("S2", OBJPROP_PRICE1), Digits); double s3 = NormalizeDouble(ObjectGet("S3", OBJPROP_PRICE1), Digits); double r1 = NormalizeDouble(ObjectGet("R1", OBJPROP_PRICE1), Digits); double r2 = NormalizeDouble(ObjectGet("R2", OBJPROP_PRICE1), Digits); double r3 = NormalizeDouble(ObjectGet("R3", OBJPROP_PRICE1), Digits); double pivot = NormalizeDouble(ObjectGet("PIVIOT", OBJPROP_PRICE1), Digits); //Comment("Hour: ", Hour(), " - Time_when_day_ends: ",Time_when_day_ends); int iOrders=OrdersTotal()-1, i; if(Hour()==Time_when_day_ends) { Comment("End of the day, EA is relaxing and closing the trades :)"); if (CloseOpenOrders) { //Comment("Deleting open orders with MagicNumber: ",MagicNumber); for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderMagicNumber() == MagicNumber)) { if((OrderType()<=OP_SELL) && GetMarketInfo()) { if(!OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Alert(ErrorDescription(GetLastError())); } } } } if (ClosePendingOrders) { //Comment("Deleting pending orders with MagicNumber: ",MagicNumber); for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderMagicNumber() == MagicNumber)) { if(OrderType()>OP_SELL) { if(!OrderDelete(OrderTicket())) Alert(ErrorDescription(GetLastError())); } } } } return(0); } if (CountShorts(MagicNumber)!= 0 && CountLongs(MagicNumber)!= 0) { return(0); } if (Ask > r3) { order_type = OP_SELLSTOP; } else { order_type = OP_SELLLIMIT; } if (OrderSelect(ticket_r3, SELECT_BY_TICKET, MODE_TRADES) == false) { // ticket_r3 = OrderSend(Symbol(),order_type,LotSize,r3,Slippage,r3+StopLoss*Point,s1,SellComment,MagicNumber,0,clSellBuy); ticket_r3 = OrderSend(Symbol(),order_type,LotSize,r3,Slippage,r3+StopLoss*Point,0,SellComment,MagicNumber,0,clSellBuy); if (ticket_r3 < 0) { Alert("Open SELL order error: ", ErrorDescription(GetLastError())); } } if (OrderSelect(ticket_r3, SELECT_BY_TICKET, MODE_TRADES) == true) { cmt_r3=OrderCloseTime(); if(cmt_r3>0) { // checa se a ordem foi fechada ticket_r3 = 0; cmt_r3 = 0; } } //r2 if (Ask > r2) { order_type = OP_SELLSTOP; } else { order_type = OP_SELLLIMIT; } if (OrderSelect(ticket_r2, SELECT_BY_TICKET, MODE_TRADES) == false) { // ticket_r2 = OrderSend(Symbol(),order_type,LotSize,r2,Slippage,r3+StopLoss*Point,s1,SellComment,MagicNumber,0,clSellBuy); ticket_r2 = OrderSend(Symbol(),order_type,LotSize,r2,Slippage,r3+StopLoss*Point,0,SellComment,MagicNumber,0,clSellBuy); if (ticket_r2 < 0) { Alert("Open SELL order error: ", ErrorDescription(GetLastError())); } } if (OrderSelect(ticket_r2, SELECT_BY_TICKET, MODE_TRADES) == true) { cmt_r2=OrderCloseTime(); if(cmt_r2>0) { // checa se a ordem foi fechada ticket_r2 = 0; cmt_r2 = 0; } } //r1 if (Ask > r1) { order_type = OP_SELLSTOP; } else { order_type = OP_SELLLIMIT; } if (OrderSelect(ticket_r1, SELECT_BY_TICKET, MODE_TRADES) == false) { // ticket_r1 = OrderSend(Symbol(),order_type,LotSize,r1,Slippage,r3+StopLoss*Point,s1,SellComment,MagicNumber,0,clSellBuy); ticket_r1 = OrderSend(Symbol(),order_type,LotSize,r1,Slippage,r3+StopLoss*Point,0,SellComment,MagicNumber,0,clSellBuy); if (ticket_r1 < 0) { Alert("Open SELL order error: ", ErrorDescription(GetLastError())); } } if (OrderSelect(ticket_r1, SELECT_BY_TICKET, MODE_TRADES) == true) { cmt_r1=OrderCloseTime(); if(cmt_r1>0) { // checa se a ordem foi fechada ticket_r1 = 0; cmt_r1 = 0; } } //s3 if (Ask > s3) { order_type = OP_BUYLIMIT; } else { order_type = OP_BUYSTOP; } if (OrderSelect(ticket_s3, SELECT_BY_TICKET, MODE_TRADES) == false) { // ticket_s3 = OrderSend(Symbol(),order_type,LotSize,s3,Slippage,s3-StopLoss*Point,r1,BuyComment,MagicNumber,0,clSellBuy); ticket_s3 = OrderSend(Symbol(),order_type,LotSize,s3,Slippage,s3-StopLoss*Point,0,BuyComment,MagicNumber,0,clSellBuy); if (ticket_s3 < 0) { Alert("Open BUY order error: ", ErrorDescription(GetLastError())); } } if (OrderSelect(ticket_s3, SELECT_BY_TICKET, MODE_TRADES) == true) { cmt_s3=OrderCloseTime(); if(cmt_s3>0) { // checa se a ordem foi fechada ticket_s3 = 0; cmt_s3 = 0; } } //s2 if (Ask > s2) { order_type = OP_BUYLIMIT; } else { order_type = OP_BUYSTOP; } if (OrderSelect(ticket_s2, SELECT_BY_TICKET, MODE_TRADES) == false) { // ticket_s2 = OrderSend(Symbol(),order_type,LotSize,s2,Slippage,s3-StopLoss*Point,r1,BuyComment,MagicNumber,0,clSellBuy); ticket_s2 = OrderSend(Symbol(),order_type,LotSize,s2,Slippage,s3-StopLoss*Point,0,BuyComment,MagicNumber,0,clSellBuy); if (ticket_s2 < 0) { Alert("Open BUY order error: ", ErrorDescription(GetLastError())); } } if (OrderSelect(ticket_s2, SELECT_BY_TICKET, MODE_TRADES) == true) { cmt_s2=OrderCloseTime(); if(cmt_s2>0) { // checa se a ordem foi fechada ticket_s2 = 0; cmt_s2 = 0; } } //s1 if (Ask > s1) { order_type = OP_BUYLIMIT; } else { order_type = OP_BUYSTOP; } if (OrderSelect(ticket_s1, SELECT_BY_TICKET, MODE_TRADES) == false) { // ticket_s1 = OrderSend(Symbol(),order_type,LotSize,s1,Slippage,s3-StopLoss*Point,r1,BuyComment,MagicNumber,0,clSellBuy); ticket_s1 = OrderSend(Symbol(),order_type,LotSize,s1,Slippage,s3-StopLoss*Point,0,BuyComment,MagicNumber,0,clSellBuy); if (ticket_s1 < 0) { Alert("Open BUY order error: ", ErrorDescription(GetLastError())); } } if (OrderSelect(ticket_s1, SELECT_BY_TICKET, MODE_TRADES) == true) { cmt_s1=OrderCloseTime(); if(cmt_s1>0) { // checa se a ordem foi fechada ticket_s1 = 0; cmt_s1 = 0; } } Comment("S1: ",s1,"\nS2: ",s2,"\nS3: ",s3,"\nPivot: ",pivot,"\nR1: ",r1,"\nR2: ",r2,"\nR3: ",r3); //---- return(0); } //+------------------------------------------------------------------+ //| Calculate concurrent Long position | //+------------------------------------------------------------------+ int CountLongs(int MagicNumber) { int count=0; int trade; int trades=OrdersTotal(); for(trade=0;trade<trades;trade++) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if( OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber ) continue; if(OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) count++; }//for return(count); } //+------------------------------------------------------------------+ //| Calculate concurrent short position | //+------------------------------------------------------------------+ int CountShorts(int MagicNumber) { int count=0; int trade; int trades=OrdersTotal(); for(trade=0;trade<trades;trade++) { OrderSelect(trade,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber ) continue; if(OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT) count++; }//for return(count); } //+------------------------------------------------------------------+ //| Function..: GetMarketInfo | //| Returns...: bool Success. | //+------------------------------------------------------------------+ bool GetMarketInfo() { RefreshRates(); Price[0]=MarketInfo(OrderSymbol(),MODE_ASK); Price[1]=MarketInfo(OrderSymbol(),MODE_BID); double dPoint=MarketInfo(OrderSymbol(),MODE_POINT); if(dPoint==0) return(false); giSlippage=(Price[0]-Price[1])/dPoint; return(Price[0]>0.0 && Price[1]>0.0); } //+------------------------------------------------------------------+ //| Make Magic Number | //+------------------------------------------------------------------+ int MakeMagicNumber() { int SymbolCode = 0; int PeriodCode = 0; int MagicNumber = 0; //---- Symbol Code if( Symbol() == "AUDCAD" || Symbol() == "AUDCADm" ) { SymbolCode = 1000; } else if( Symbol() == "AUDJPY" || Symbol() == "AUDJPYm" ) { SymbolCode = 2000; } else if( Symbol() == "AUDNZD" || Symbol() == "AUDNZDm" ) { SymbolCode = 3000; } else if( Symbol() == "AUDUSD" || Symbol() == "AUDUSDm" ) { SymbolCode = 4000; } else if( Symbol() == "CHFJPY" || Symbol() == "CHFJPYm" ) { SymbolCode = 5000; } else if( Symbol() == "EURAUD" || Symbol() == "EURAUDm" ) { SymbolCode = 6000; } else if( Symbol() == "EURCAD" || Symbol() == "EURCADm" ) { SymbolCode = 7000; } else if( Symbol() == "EURCHF" || Symbol() == "EURCHFm" ) { SymbolCode = 8000; } else if( Symbol() == "EURGBP" || Symbol() == "EURGBPm" ) { SymbolCode = 9000; } else if( Symbol() == "EURJPY" || Symbol() == "EURJPYm" ) { SymbolCode = 1000; } else if( Symbol() == "EURUSD" || Symbol() == "EURUSDm" ) { SymbolCode = 1100; } else if( Symbol() == "GBPCHF" || Symbol() == "GBPCHFm" ) { SymbolCode = 1200; } else if( Symbol() == "GBPJPY" || Symbol() == "GBPJPYm" ) { SymbolCode = 1300; } else if( Symbol() == "GBPUSD" || Symbol() == "GBPUSDm" ) { SymbolCode = 1400; } else if( Symbol() == "NZDJPY" || Symbol() == "NZDJPYm" ) { SymbolCode = 1500; } else if( Symbol() == "NZDUSD" || Symbol() == "NZDUSDm" ) { SymbolCode = 1600; } else if( Symbol() == "USDCAD" || Symbol() == "USDCADm" ) { SymbolCode = 1700; } else if( Symbol() == "USDCHF" || Symbol() == "USDCHFm" ) { SymbolCode = 1800; } else if( Symbol() == "USDJPY" || Symbol() == "USDJPYm" ) { SymbolCode = 1900; } //---- Calculate MagicNumber MagicNumber = ExpertID+SymbolCode; return(MagicNumber); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It automatically opens orders when conditions are reached
Other Features:
It issuies visual alerts to the screen