0
votes

Struggling in writing a CLOSE ALL TRADES code in MQL5 as part of my Expert Advisor.

Code or any idea about closing all trades in MQL5 will be very helpful.

As I am new to EA writing, please be little easy in writing.

4
what you tried, what was the problem, what are the log results? What should be a problem at all, select all trades one by one and flat the position, also please mention whether you use terminal that allows hedging or notDaniel Kniaz
i wrote a EA in MetaEditor......now i want to write a code which closes all trades in account when account loss is greater than 100$..........i know MQL4 code for closing all trades but i am struggling in MQL5 for samepiyush
what is the problem? do you want the full code or advise? if advise - ask the question. general answer is CTrade.ClosePosition(symbol), symbol = PositionGetSymbol(i), 0<=i<PosTotal()Daniel Kniaz

4 Answers

2
votes

Welcome to the Wild Worlds of MQL4/5

You may get inspired by this raw example, as the MQL5 has changed the way, how the Terminal / Server interaction is controlled:

#define                                  ID_OWN_MAG_NUM 9999999         // ALWAYS:  use MagicNumber of the expert, to avoid MIX
//+----------------------
//| Closing all positions, MATCHING this ID_OWN_MAG_NUM ( avoid deleting others ...
//+----------------------
void OnStart()
{                                                                       // .DEF + .INIT the trade request and result of trade request
   MqlTradeRequest request;
   MqlTradeResult  result;

   int             total = PositionsTotal();                                        // .GET  number of open positions
   for (  int i = total - 1; i >= 0; i-- )                              // .ITER  over all open positions
   {                                                                    //        .GET  params of the order:
          ulong  position_ticket  = PositionGetTicket(       i );                               //  - ticket of the position
          string position_symbol  = PositionGetString(       POSITION_SYMBOL );                 //  - symbol 
          int    digits           = (int) SymbolInfoInteger( position_symbol,       
                                                             SYMBOL_DIGITS      
                                                             );                                 //  - number of decimal places
          ulong  magic            = PositionGetInteger(      POSITION_MAGIC );                  //  - MagicNumber of the position
          double volume           = PositionGetDouble(       POSITION_VOLUME );                 //  - volume of the position
          ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE) PositionGetInteger( POSITION_TYPE );   //  - type of the position

          PrintFormat( "Tkt[#%I64u] %s  %s  %.2f  %s MagNUM[%I64d]",    // .GUI:    print details about the position    
                       position_ticket,
                       position_symbol,
                       EnumToString(type),
                       volume,
                       DoubleToString( PositionGetDouble( POSITION_PRICE_OPEN ), digits ),
                       magic
                       );

          if (  magic == ID_OWN_MAG_NUM )                               // .IF MATCH:
          {     ZeroMemory( request );                                  //     .CLR data
                ZeroMemory( result  );                                  //     .CLR data
                                                                        //     .SET:
                request.action    = TRADE_ACTION_DEAL;                  //          - type of trade operation
                request.position  = position_ticket;                    //          - ticket of the position
                request.symbol    = position_symbol;                    //          - symbol 
                request.volume    = volume;                             //          - volume of the position
                request.deviation = 5;                                  //          - allowed deviation from the price
                request.magic     = EXPERT_MAGIC;                       //          - MagicNumber of the position

                if (  type == POSITION_TYPE_BUY )
                {     request.price = SymbolInfoDouble( position_symbol, SYMBOL_BID );
                      request.type  = ORDER_TYPE_SELL;
                      }
                else
                {
                      request.price = SymbolInfoDouble( position_symbol, SYMBOL_ASK );
                      request.type  = ORDER_TYPE_BUY;
                      }

                PrintFormat(       "WILL TRY: Close Tkt[#%I64d] %s %s",                      position_ticket,
                                                                                             position_symbol,
                                                                                             EnumToString( type )
                                                                                             );
                if ( !OrderSend( request,result ) )
                      PrintFormat( "INF:  OrderSend(Tkt[#%I64d], ... ) call ret'd error %d", position_ticket,
                                                                                             GetLastError()
                                                                                             );
                PrintFormat(       "INF:            Tkt[#%I64d] retcode=%u  deal=%I64u  order=%I64u", position_ticket,
                                                                                                      result.retcode,
                                                                                                      result.deal,
                                                                                                      result.order
                                                                                                      );
                }
          }
  }
//+------------------------------------------------------------------+
0
votes

This works for me - closes all market Buys and/or Sells positions for a symbol. Suggest test on demo netting and hedging accounts for validation and clarifications.

for(int i=PositionsTotal()-1; i>=0; i--)
    {
       ulong ticket=PositionGetTicket(i);
       trade.PositionClose(ticket);   
    }  

or

 if(abc == xyz)
  {
    CloseBuySellSymbol(0);
  }

void CloseBuySellSymbol()
 {
     for(int i=PositionsTotal()-1; i>=0; i--)
    {
       ulong ticket=PositionGetTicket(i);
       trade.PositionClose(ticket);   
    }  
 }

if run in void OnTick() execution is subject to tick delay
if used in void OnChartEvent() execution is instantaneous

0
votes

Trading is done by sending orders to open positions using the OrderSend() function, as well as to place, modify or delete pending orders. Each trade order refers to the type of the requested operation.

 #define EXPERT_MAGIC 123456   // MagicNumber of the expert
//+------------------------------------------------------------------+
//| Closing all positions                                            |
//+------------------------------------------------------------------+
void OnStart()



{
//--- declare and initialize the trade request and result of trade request
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // number of open positions   
//--- iterate over all open positions
   for(int i=total-1; i>=0; i--)
     {
      //--- parameters of the order
      ulong  position_ticket=PositionGetTicket(i);                                      // ticket of the position
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // symbol 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // number of decimal places
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // MagicNumber of the position
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // volume of the position
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // type of the position
      //--- output information about the position
      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  magic);
      //--- if the MagicNumber matches
      if(magic==EXPERT_MAGIC)
        {
         //--- zeroing the request and result values
         ZeroMemory(request);
         ZeroMemory(result);
         //--- setting the operation parameters
         request.action   =TRADE_ACTION_DEAL;        // type of trade operation
         request.position =position_ticket;          // ticket of the position
         request.symbol   =position_symbol;          // symbol 
         request.volume   =volume;                   // volume of the position
         request.deviation=5;                        // allowed deviation from the price
         request.magic    =EXPERT_MAGIC;             // MagicNumber of the position
         //--- set the price and order type depending on the position type
         if(type==POSITION_TYPE_BUY)
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
            request.type =ORDER_TYPE_SELL;
           }
         else
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
            request.type =ORDER_TYPE_BUY;
           }
         //--- output information about the closure
         PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- send the request
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // if unable to send the request, output the error code
         //--- information about the operation   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //---
        }
     }
  }
//+------------------------------------------------------------------+

More examples at MQL5 documentation: https://www.mql5.com/en/docs/constants/tradingconstants/enum_trade_request_actions

0
votes

Simpler than that:

 //positions
 for(int i=PositionsTotal()-1;i>=0;i--)
 {
   ulong positionticket = PositionGetTicket(i);
   trade.PositionClose(positionticket,-1);
   Print("eliminando posición "+positionticket);
  
 } 
 //orders
 for(int i=OrdersTotal()-1;i>=0;i--)
 {
   ulong orderticket = OrderGetTicket(i);
   trade.OrderDelete(orderticket);
   Print("eliminando operation "+orderticket); 
 }