OrderDelete() Error 4108

 
//+----------------------------------------------------------------------+
//| Delete Order function - If price closes above or below applicable MA |
//+----------------------------------------------------------------------+
void DeleteOrder()
  {

   for(int i=OrdersTotal()-1; i>=0; i--) 
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;   
        if( OrderMagicNumber() == MagicNumber1 || OrderMagicNumber()== MagicNumber2 ||
            OrderMagicNumber()== MagicNumber3 || OrderMagicNumber()== MagicNumber4 )
        if(OrderSymbol() == Symbol()) 
         if(OrderType() > OP_SELL)
          {  
          if(!OrderDelete(OrderTicket(),Magenta)){ // <-- try to close the order
            Print("Order Delete failed, order number: ",OrderTicket()," Error: ",GetLastError(), " On: ", OrderSymbol()); 
            }
            else{
            Print("Pending Order was deleted: ", OrderTicket(), " On: ", OrderSymbol());
            }
          }
      } //  end of For loop
  }
Trying to close 4 orders on one given pair. It fails to close due to "Invalid Ticket 4108 error" and also returns the wrong OrderSymbol() for the pair it's working on?
 
UPDATE: do I need a unique magicnumber per OrderSend??? Or should I just be using the same MagicNumber1 per EA and pair?
 
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;   

?


You have a missing { } too.


You don't need to use too many IF, just simplify into one condition.

if( (OrderMagicNumber() == MagicNumber1 || OrderMagicNumber()== MagicNumber2 ||
            OrderMagicNumber()== MagicNumber3 || OrderMagicNumber()== MagicNumber4 ) &&
        (OrderSymbol() == Symbol()) && (OrderType() > OP_SELL) )

Something like that.

 
//+----------------------------------------------------------------------+
//| Delete Order function - If price closes above or below applicable MA |
//+----------------------------------------------------------------------+
void DeleteOrder()
{

   for(int i=OrdersTotal()-1; i>=0; i--) // OrderTicket() used to be OrdersTotal() 
   {
      if(!OrderSelect(i,SELECT_BY_POS, MODE_TRADES) == true) continue;
      { 
        if( OrderMagicNumber() == MagicNumber1 && OrderSymbol() == Symbol() 
            && OrderType() > OP_SELL)
          {  
          if(!OrderDelete(OrderTicket(),Magenta)){ // <-- try to close the order
            Print("Order Delete failed, order number: ",OrderTicket()," Error: ",GetLastError(), " On: ", OrderSymbol()); 
            }
            else{
            Print("Pending Order was deleted: ", OrderTicket(), " On: ", OrderSymbol());
            }
          }
      }     
    } //  end of For loop
}

  
Are you suggesting like this?

Likewise, do I actually need a unique magic number for each individual order when I have an EA for each pair? As in, do I need MagicNumber1, MagicNumber 2 and so forth when all the trades (4 of them) will be managed all under this specific EA?
 
&& OrderType() > OP_SELL

OrderDelete(

 You can't use OrderDelete with an OP_BUY or OP_SELL

You have to use OrderClose 

 

Nah. He is correct.

OrderType() > OP_SELL

Means any ordertype bigger than op_buy & op_sell.

 
deysmacro:

Nah. He is correct.

Means any ordertype bigger than op_buy & op_sell.

Oops, yes

I misread that. 

Reason: