Download MetaTrader 5

Closing all orders

To add comments, please log in or register
cryptex23
268
cryptex23  
  vol=MathFloor(AccountEquity())/10000;
  {
  for( int count=0;count<OrdersTotal();count++)
  {
  OrderSelect(count,SELECT_BY_POS,MODE_TRADES);

  if (OrderType()==1)
  {
  vask=MarketInfo(OrderSymbol(),MODE_ASK);
  OrderClose(OrderTicket(),vol,vask,clrAliceBlue);
  Print("OrderClose error", GetLastError());
  }
  else if(OrderType()==0)
  {
  vbid=MarketInfo(OrderSymbol(),MODE_BID);
  OrderClose(OrderTicket(),vol,vbid,clrAliceBlue);
  Print("OrderClose error", GetLastError());  
  }
  }
  }
Hello All, I am trying to close all open orders one after the other. When I run the above I inevitably end up getting some or the other error. Can someone point out the potential fallacies? 
honest_knave
Moderator
2333
honest_knave  

You need to count down not up.

  for( int count=0;count<OrdersTotal();count++)

 

See here for an explanation of why.

bluestacks
58
bluestacks  
for(int x=OrdersTotal();x>=0;x--)
{
    if(OrderSelect(x,SELECT_BY_POS)==true)
    {
         if(OrderType()==OP_BUY){ cprice=MarketInfo(OrderSymbol(),MODE_BID);} 
         else if(OrderType()==OP_SELL){ cprice=MarketInfo(OrderSymbol(),MODE_ASK);} 
         
         if(!OrderClose(OrderTicket(),OrderLots(),cprice,clrNone))
         {
              PrintFormat("Error closing order #%d. %s",OrderTicket(),ErrorDescription(GetLastError()));
         }
    }
}
honest_knave
Moderator
2333
honest_knave  
blue_stacks:


Rather than figuring out the close price, you can just use OrderClosePrice()

Donald Gibson
495
Donald Gibson  
cryptex:
Hello All, I am trying to close all open orders one after the other. When I run the above I inevitably end up getting some or the other error. Can someone point out the potential fallacies? 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
//-------------------------------------------------------------------------------------------------
   int CloseLong=0,CloseShort=0;
//-------------------------------------------------------------------------------------------------
//Long
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==EA_MagicNumber)
            if(OrderComment()==EA_Comment)
               if(OrderSymbol()==Symbol())
                 {
                  if(OrderType()==OP_BUY)
                    {
                     Print("-------------------------------------------------------------------------------------------------");
                     CloseLong=OrderClose(OrderTicket(),OrderLots(),Bid,EA_Slippage,EA_ArrowColor);
                     //If a error has occurred - Print the error description
                     if(CloseLong==0)
                       {
                        Print("Long Order was not Closed..Error  : "+ErrorDescription(GetLastError()));
                       }
                     //If a error has not occurred - Print the trade information
                     if(CloseLong>0)
                       {
                        if(Bid<OrderOpenPrice())
                          {
                           Print("Loss...",DoubleToStr(OrderOpenPrice()-Bid,Digits),".pips");
                          }
                        if(Bid>OrderOpenPrice())
                          {
                           Print("Profit..",DoubleToStr(Bid-OrderOpenPrice(),Digits),".pips");
                          }
                        Print("Close Order Price...",DoubleToStr(Bid,Digits));
                        Print("Order Symbol...",Symbol());
                        Print("Long Order was closed successfully");
                        Print("-------------------------------------------------------------------------------------------------");
                        OrderCloseLine();
                       }
                    }
                  if(OrderType()==OP_SELL)
                    {
                     Print("-------------------------------------------------------------------------------------------------");
                     CloseShort=OrderClose(OrderTicket(),OrderLots(),Ask,EA_Slippage,EA_ArrowColor);
                     if(CloseShort==0)//If a error has occurred - Print the error description
                       {
                        Print("Short Order was not Closed..Error  : "+ErrorDescription(GetLastError()));
                       }
                     if(CloseShort>0)//If a error has not occurred - Print the trade information
                       {
                        if(Ask>OrderOpenPrice())
                          {
                           Print("Loss...",DoubleToStr(Ask-OrderOpenPrice(),Digits),".pips");
                          }
                        if(Ask<OrderOpenPrice())
                          {
                           Print("Profit..",DoubleToStr(OrderOpenPrice()-Ask,Digits),".pips");
                          }
                        Print("Close Order Price...",DoubleToStr(Ask,Digits));
                        Print("Order Symbol...",Symbol());
                        Print("Short Order was closed successfully");
                        Print("-------------------------------------------------------------------------------------------------");
                        OrderCloseLine();
                       }
                    }
                 }
  }
cryptex23
268
cryptex23  
Thank you for the valuable comments above. I have implemented them. My new piece looks something like this. However I am getting OrderCLose error 3. Which pertains to invalid trade parameters. Not sure how to resolve it.
  for( int count=OrdersTotal()-1;count>=0;count--)
  {
  OrderSelect(count,SELECT_BY_POS,MODE_TRADES);
  
  if (OrderType()==1)
  {
  vask=MarketInfo(OrderSymbol(),MODE_ASK);
  vol=OrderLots();
  OrderClose(OrderTicket(),vol,vask,clrAliceBlue);
  Print("OrderClose error", GetLastError());
  }
  else if(OrderType()==0)
  {
  vbid=MarketInfo(OrderSymbol(),MODE_BID);
  vol=OrderLots();
  OrderClose(OrderTicket(),vol,vbid,clrAliceBlue);
  Print("OrderClose error", GetLastError());  
  }
  }
Doerk Hilger
1189
Doerk Hilger  

If this is part of an EA, you should - please - take care that you only close the orders your EA opened and not all. Parts like these produce hassle to other EAs when they´re not properly coded. 

Same for ObjectsDeleteAll() ... an absolute no-go-function. Never use.

Doerk 

honest_knave
Moderator
2333
honest_knave  

You're passing a color for the slippage parameter. The 5th parameter should be color.

Also, you're adding extra code that you don't need (vask and vbid). Just use OrderClosePrice()

 

cryptex:
Thank you for the valuable comments above. I have implemented them. My new piece looks something like this. However I am getting OrderCLose error 3. Which pertains to invalid trade parameters. Not sure how to resolve it. 

for( int count=OrdersTotal()-1;count>=0;count--)
  {
  OrderSelect(count,SELECT_BY_POS,MODE_TRADES);
  
  if (OrderType()==1)
  {
  vask=MarketInfo(OrderSymbol(),MODE_ASK);
  vol=OrderLots();
  OrderClose(OrderTicket(),vol,vask,clrAliceBlue);
  Print("OrderClose error", GetLastError());
  }
  else if(OrderType()==0)
  {
  vbid=MarketInfo(OrderSymbol(),MODE_BID);
  vol=OrderLots();
  OrderClose(OrderTicket(),vol,vbid,clrAliceBlue);
  Print("OrderClose error", GetLastError());  
  }
  }

 

honest_knave
Moderator
2333
honest_knave  
Doerk:

Same for ObjectsDeleteAll() ... an absolute no-go-function. Never use.

In the past, yes it was troublesome. But now you can finally specify a tag (prefix) which is great. One less UDF in most of my code.

int  ObjectsDeleteAll( 
   long           chart_id,   // chart ID 
   const string     prefix,   // prefix in object name 
   int    sub_window=EMPTY,   // window index 
   int    object_type=EMPTY   // object type 
   );
cryptex23
268
cryptex23  
honest_knave:

You're passing a color for the slippage parameter. The 5th parameter should be color.

Also, you're adding extra code that you don't need (vask and vbid). Just use OrderClosePrice()

 

Thanks Knave. Thanks for pointing I was missing a parameter. It works like a charm now :D
To add comments, please log in or register