You mean like this?
void deletePending() { for(int i=PositionsTotal()-1; i>=0; i--) { long magica=PositionGetInteger(POSITION_MAGIC); ulong ticket=PositionGetTicket(i); if(OrderSelect(ticket)==true) { if(OrdersTotal()>0 && magica==magic1) { Print("Deleting pending orders for ", magica); ulong OrderTicket=OrderGetTicket(i); trade.OrderDelete(OrderTicket); } } } }
Delete Pending Orders:
//+------------------------------------------------------------------+ //| Delete all pending orders | //+------------------------------------------------------------------+ void DeleteAllPendingOrders(void) { for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of current orders if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==InpMagic) if(!m_trade.OrderDelete(m_order.Ticket())) if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","CTrade.OrderDelete ",m_order.Ticket()) }
Super thanks! Will try that out!
Had to work the code a bit. Got quite a lot of errors when compiling.
Now it works like a charm! Thanks again!
void deletePending() { //--- variables for returning values from order properties ulong ticket; double open_price; double initial_volume; datetime time_setup; string symbol; string type; long order_magic; long positionID; uint total=OrdersTotal(); //--- go through orders in a loop for(uint i=0;i<total;i++) { //--- return order ticket by its position in the list if((ticket=OrderGetTicket(i))>0) { //--- return order properties open_price =OrderGetDouble(ORDER_PRICE_OPEN); time_setup =(datetime)OrderGetInteger(ORDER_TIME_SETUP); symbol =OrderGetString(ORDER_SYMBOL); order_magic =OrderGetInteger(ORDER_MAGIC); positionID =OrderGetInteger(ORDER_POSITION_ID); initial_volume=OrderGetDouble(ORDER_VOLUME_INITIAL); type =EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE))); if(symbol==_Symbol && order_magic==magic1) { Print("Deleting pending orders for ", order_magic); ulong OrderTicket=OrderGetTicket(i); if(!trade.OrderDelete(OrderTicket)) Print("Could not delete pending order for ", m_order.Magic()); } } } }
Still had some issues if it was more than 2 open orders.
If i count upwards, from 0, the first order was cancelled, but the second ones position was transfered to 0.
If I then counted backwards in that loop, only the first one was cancelled because I dont want to count to 0 in the loop, because that will be an endless loop.
I did like this instead, please tell if there is a better solution. But this works (but not optimal code I guess).
void deletePending() { //--- variables for returning values from order properties ulong ticket; double open_price; double initial_volume; datetime time_setup; string symbol; string type; long order_magic; long positionID; uint total=OrdersTotal(); //--- go through orders in a loop for(uint i=total; i>=0; i--) { if(OrdersTotal()==0) { break; } //--- return order ticket by its position in the list if((ticket=OrderGetTicket(i))>0) { //--- return order properties open_price =OrderGetDouble(ORDER_PRICE_OPEN); time_setup =(datetime)OrderGetInteger(ORDER_TIME_SETUP); symbol =OrderGetString(ORDER_SYMBOL); order_magic =OrderGetInteger(ORDER_MAGIC); positionID =OrderGetInteger(ORDER_POSITION_ID); initial_volume=OrderGetDouble(ORDER_VOLUME_INITIAL); type =EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE))); if(symbol==_Symbol && order_magic==magic1) { Print("Deleting pending orders for ", order_magic, " ",i, " ", ticket); ulong OrderTicket=OrderGetTicket(i); if(!trade.OrderDelete(ticket)) Print("Could not delete pending order for ", m_order.Magic()); } } } }
Still had some issues if it was more than 2 open orders.
If i count upwards, from 0, the first order was cancelled, but the second ones position was transfered to 0.
If I then counted backwards in that loop, only the first one was cancelled because I dont want to count to 0 in the loop, because that will be an endless loop.
I did like this instead, please tell if there is a better solution. But this works (but not optimal code I guess).
Hi Jose,
I see you have declared m_order, instead of using OrderGetInteger(), it should be more efficient using m_order. isn't it?
irst one was cancelled becau
//--- go through orders in a loop for(uint i=total; i>=0; i--) { if(OrdersTotal()==0)
I changed your code to:
//--- go through orders in a loop (with minus 1) for(uint i=total-1; i>=0; i--) { if(OrdersTotal()==0)
@Jose Daniel Stromberg Martinez your code now working perfectly for me.
;)
This reply is over 2 years later , thanks lot.
regards,
void deletePending(long MagicNum) { //--- variables for returning values from order properties ulong ticket; double initial_volume; string symbol; string type; long magic_number; long positionID; uint total=OrdersTotal(); //--- go through orders in a loop //for(uint i=total-1; i>=0; i--) for(uint i=total-1; i>=0; i--) { if(OrdersTotal()==0) { break; } //--- return order ticket by its position in the list if((ticket=OrderGetTicket(i))>0) { //--- return order properties symbol =OrderGetString(ORDER_SYMBOL); magic_number =OrderGetInteger(ORDER_MAGIC); positionID =OrderGetInteger(ORDER_POSITION_ID); initial_volume=OrderGetDouble(ORDER_VOLUME_INITIAL); type =EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE))); if(symbol==_Symbol && magic_number==MagicNum) { Print("Deleting pending orders for magic number=", magic_number, " ",i, " ","ticket number id=", ticket); ulong OrderTicket=OrderGetTicket(i); if(!trade.OrderDelete(ticket)) Print("Could not delete pending order for order id: ",positionID ," ","symbol=", symbol," " ,"type=",type," ","Volume=",initial_volume," ", "magic number=",magic_number ); } } } }
Still had some issues if it was more than 2 open orders.
If i count upwards, from 0, the first order was cancelled, but the second ones position was transfered to 0.
If I then counted backwards in that loop, only the first one was cancelled because I dont want to count to 0 in the loop, because that will be an endless loop.
I did like this instead, please tell if there is a better solution. But this works (but not optimal code I guess).
You must count to 0, because 0 is the index of the first ticket of 'Open Pending Orders'.
At i=0 the pending order will have the lowest ticket number id as it was opened before all other orders.
If you see yellow highlighted ticket where i=0 was deleted last, with ticket number id=120.
There were 4 'open pending order' tickets in total that needed deleting. i=3, i=2, i=1, i=0.
![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
I am trying to delete pending orders when I open a position on my chart.
The problem is that if another strategy (same EA, different magic) on same symbol has an open order, the pending order will be deleted instantly.
I am probably missing something, but cant find what.
What I can understand, it is my other strategy that are killing the pending orders that are open with main strategy.
First I check if I have open orders for this EA. Here I understand the code will run for deletePending on that other strategy. I guess that is OK, but best thing is to not do that ofcourse.
But, deletePending sould take magic into play, but it doesnt seem to do that. It is deleting pending orders with magic that doesnt belong I guess.
Any suggestion on how to fix this?
Code:
This is under OnTick()
This is checkOpen()
And this is deleting pending orders