- What you prefer ?
- Cancelling BUYSTOP/SELLSTOP Orders
- Pending Order should cancel but does not,
CAN ANYONE HELP ME WITH THE CODE TO CANCEL PENDING ORDERS ONCE THERE ARE NO TRADES IN THE OPPOSITE DIRECTION OPEN?
![](https://c.mql5.com/3/234/Matrix-Morpheus.jpg)
thanks for your comment.
the EA I am working on is quite complex could I modify these functions to close opposite pending orders?
//+------------------------------------------------------------------+
//| exit sells breakout trades |
//+------------------------------------------------------------------+
void exitsells()
{
int total=OrdersTotal()-1;
for(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==magic)
if(OrderType()==OP_SELLSTOP)
{
int attempts=1;
while(attempts<=5)
{
int err=0;
bool result=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
if(result)break;
else
{
err=GetLastError();
Print("LastError = ",ErrorDescription(err));
if(err==4108) break;// ticket not valid. break out of while loop
switch(err)
{
case 135: //price change.
case 136: //off Quotes.
case 137: //Broker Busy
case 138: // Requote
case 146: // Trade Context Busy
Sleep(1000);
RefreshRates();//will do these things if any of these things are the case
default:break;//break out of switch
}//end of switch
}//else
attempts++;
if(attempts==6)
Print("Could not close trades after 5 attempts.",ErrorDescription(err));
}//end of while loop
}//op sell
}//orderselect
else Print("When selecting a trade, error ",GetLastError()," occurred");//order select return get last error
}//for
}
//+------------------------------------------------------------------+
//| exit buys breakout trade |
//+------------------------------------------------------------------+
void exitbuys()
{
int total= OrdersTotal()-1;
for(int i=total; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==magic)
if(OrderType()==OP_BUYSTOP)
{
int attempts=1;
while(attempts<=5)
{
int err=0;
bool result=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);
if(result)break;
else
{
err=GetLastError();
Print("LastError = ",ErrorDescription(err));
if(err==4108) break;// ticket not valid. break out of while loop
switch(err)
{
case 135: //price change.
case 136: //off Quotes.
case 137: //Broker Busy
case 138: // Requote
case 146: // Trade Context Busy
Sleep(1000);
RefreshRates();//will do these things if any of these things are the case
default:break;//break out of switch
}//end of switch
}//else
attempts++;
if(attempts==6)
Print("Could not close trades after 5 attempts.",ErrorDescription(err));
}//end of while loop
}//op buy
}//orderselect
else Print("When selecting a trade, error ",GetLastError()," occurred");//order select return get last error
}//for
}
What about something like this?
bool exit(int direction) { RefreshRates(); for(int i=0; OrderSelect(i, SELECT_BY_POS); i++) if(OrderType() == direction) if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100, clrRed)) return exit(direction); else return false; for(int i=0; OrderSelect(i, SELECT_BY_POS); i++){ int type = OrderType(); if((direction == OP_BUY && (type == OP_SELLLIMIT || type == OP_SELLSTOP)) || (direction == OP_SELL && (type == OP_BUYLIMIT || type == OP_BUYSTOP)) ){ if(OrderDelete(OrderTicket(), clrRed)) return exit(direction); else return false; } } return true; }
What about something like this?
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { for(int i=100;i>0;i--) { Comment(i); } CheckForSignal(); if(UseTrailingStop)AdjustTrail(); if(UseMoveToBE)MovetoBreakeven(); } //+------------------------------------------------------------------+ //| TRIGGER FUNCTION pull back STRATEGY | //+------------------------------------------------------------------+ void CheckForSignal() { static datetime candletime=0; if(candletime!=Time[0]) { double currenttrendMa30=iMA(NULL,0,50,0,1,0,1); double trendMa200=iMA(NULL,0,200,0,1,0,1); double currentMACD=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); double previouspreviousMACD=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,3); double previousMACD=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2); double currentupper = iBands(NULL,0,20,2,0,0,1,0); double currentlower = iBands(NULL,0,20,2,0,0,2,0); //SELL signal if(currentMACD < previousMACD && previousMACD > previouspreviousMACD && currentMACD > Threshold*pips) if(TotalOpenSellOrders()) { if(Bid - HighestSellPosition() >= TradeSpacing*pips) EnterTrade(OP_SELL); } else EnterTrade(OP_SELL); if(TotalPendingBuyOrders()<1) { EnterTrade2(OP_BUYSTOP); exit(OP_SELLSTOP) ; } //BUY signal if(currentMACD > previousMACD && previousMACD < previouspreviousMACD && currentMACD < -Threshold*pips) if(TotalOpenBuyOrders()) { if(LowestBuyPosition()-Ask >= TradeSpacing*pips) EnterTrade(OP_BUY); } else EnterTrade(OP_BUY); if(TotalPendingSellOrders()<1) { EnterTrade2(OP_SELLSTOP);exit(OP_BUYSTOP); } candletime=Time[0]; } } //+------------------------------------------------------------------+ //| TRADE PLACING FUNCTION | //+------------------------------------------------------------------+ void EnterTrade(int type){ int err=0; double price=Bid, sl=0, tp=0, lotsize = 0; { if(TotalOpenBuyOrders()==3) lotsize = (TotalOpenBuyOrders()+SmartinggaleAmount)*Lotsize; else lotsize = (TotalOpenSellOrders()+SmartinggaleAmount)* Lotsize; } if(type == OP_BUY) { if (TotalOpenSellOrders()==3) lotsize = (TotalOpenSellOrders()+SmartinggaleAmount)*Lotsize; else lotsize = (TotalOpenBuyOrders()+SmartinggaleAmount)*Lotsize; } { price =Ask; } //---- int ticket = OrderSend(Symbol(),type,lotsize,price,30,0,0,"EaTemplate",magic,0,Magenta); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET)) { if(OrderType() == OP_SELL) { sl = OrderOpenPrice()+(StopLoss*pips); if(StopLoss==0)sl=0; tp = BreakevenOfSells()-(TakeProfit*pips); } else if(OrderType()==OP_BUY) { sl = OrderOpenPrice()-(StopLoss*pips); if(StopLoss==0)sl=0; tp = BreakevenOfBuys()+(TakeProfit*pips); } //---Modify This Order if(!OrderModify(ticket,price,sl,tp,0,Magenta)) { err = GetLastError(); Print("Encountered an error during modification!"+(string)err+" "+ErrorDescription(err) ); } //---Modify The Other Orders that are Open. if(TotalOpenOrders() > 1) { for(int i=0;i<OrdersTotal()-1;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==magic) if(OrderType()==type) if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0,clrMagenta)) { err = GetLastError(); Print("Encountered an error during modification!"+(string)err+" "+ErrorDescription(err) ); } } } } else {//in case it fails to select the order for some reason Print(__FUNCTION__,"Failed to Select Order ",ticket); err = GetLastError(); Print("Encountered an error while seleting order "+(string)ticket+" error number "+(string)err+" "+ErrorDescription(err) ); } } else {//in case it fails to place the order and send us back a ticket number. err = GetLastError(); Print("Encountered an error during order placement!"+(string)err+" "+ErrorDescription(err) ); if(err==ERR_TRADE_NOT_ALLOWED)MessageBox("You can not place a trade because \"Allow Live Trading\" is not checked in your options. Please check the \"Allow Live Trading\" Box!","Check Your Settings!"); } } //+------------------------------------------------------------------+ //| TRADE2 PLACING FUNCTION | //+------------------------------------------------------------------+ void EnterTrade2(int type){ int err=0; double price=Bid-25*pips, sl=0, tp=0, lotsize = (TotalOpenBuyOrders()+1) * Lotsize; if(type == OP_BUYSTOP) { lotsize = (TotalOpenSellOrders()+1) * Lotsize; price =Ask+25*pips; } //---- int ticket = OrderSend(Symbol(),type,lotsize,price,30,0,0,"trapper Trade",magic,0,Magenta); if(ticket>0){ if(OrderSelect(ticket,SELECT_BY_TICKET)){ sl = OrderOpenPrice()+(StopLoss2*pips); if(StopLoss2==0)sl=0; tp = OrderOpenPrice()-(TakeProfit2*pips); if(OrderType()==OP_BUYSTOP){ sl = OrderOpenPrice()-(StopLoss2*pips); if(StopLoss2==0)sl=0; tp = OrderOpenPrice()+(TakeProfit2*pips); } if(!OrderModify(ticket,price,sl,tp,0,Magenta)) { err = GetLastError(); Print("Encountered an error during modification!"+(string)err+" "+ErrorDescription(err) ); } } else{//in case it fails to select the order for some reason Print("Failed to Select Order ",ticket); err = GetLastError(); Print("Encountered an error while seleting order "+(string)ticket+" error number "+(string)err+" "+ErrorDescription(err) ); } } else{//in case it fails to place the order and send us back a ticket number. err = GetLastError(); Print("Encountered an error during order placement!"+(string)err+" "+ErrorDescription(err) ); if(err==ERR_TRADE_NOT_ALLOWED)MessageBox("You can not place a trade because \"Allow Live Trading\" is not checked in your options. Please check the \"Allow Live Trading\" Box!","Check Your Settings!"); } } //+------------------------------------------------------------------+ //| delete pending order function | //+------------------------------------------------------------------+ bool exit(int direction) { RefreshRates(); for(int i=0; OrderSelect(i, SELECT_BY_POS); i++) if(OrderType() == direction) if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100, clrRed)) return exit(direction); else return false; for(int i=0; OrderSelect(i, SELECT_BY_POS); i++){ int type = OrderType(); if((direction == OP_BUY && (type == OP_SELLLIMIT || type == OP_SELLSTOP)) || (direction == OP_SELL && (type == OP_BUYLIMIT || type == OP_BUYSTOP)) ){ if(OrderDelete(OrderTicket(), clrRed)) return exit(direction); else return false; } } return true; }
Thanks for you suggestions. here is the EA I am still having trouble closing the Pending orders once one in the opposit direction is opened. the signal code seems to be ok the problem I think is with the exit(); function at the end of the EA. IT GIVES ERROR CODE 4108 in the journal ERR_INVALID_TICKET
![MQL5 - Language of trade strategies built-in the MetaTrader 5 client terminal](https://c.mql5.com/i/registerlandings/logo-2.png)
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use