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.
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
);
}
}
}
//+------------------------------------------------------------------+
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
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
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);
}
CTrade.ClosePosition(symbol), symbol = PositionGetSymbol(i), 0<=i<PosTotal()
– Daniel Kniaz