Download MetaTrader 5

How to close a position programatically in Hedging mode

To add comments, please log in or register
Miroslav Popov
395
Miroslav Popov  

Let's open a position in a Hedge account with a given Magic_Number on the current _Symbol.

void SendOrder(int command,double lots,double stopLoss,double takeProfit)
  {
   ResetLastError();
   MqlTick             tick;    SymbolInfoTick(_Symbol,tick);
   MqlTradeRequest     request; ZeroMemory(request);
   MqlTradeResult      result;  ZeroMemory(result);
   MqlTradeCheckResult check;   ZeroMemory(check);

   request.action       = TRADE_ACTION_DEAL;
   request.symbol       = _Symbol;
   request.volume       = Entry_Amount;
   request.type         = command==OP_BUY ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   request.price        = command==OP_BUY ? tick.ask : tick.bid;
   request.type_filling = orderFillingType;
   request.deviation    = 10;
   request.sl           = stopLoss;
   request.tp           = takeProfit;
   request.magic        = Magic_Number;

   bool isOrderCheck = OrderCheck(request,check);
   bool isOrderSend  = false;

   if(isOrderCheck)
      isOrderSend=OrderSend(request,result);
  }

 

Open Long 0.1 lots.

SendOrder(OP_BUY, 0.1, 0, 0);

  

How to find this position and close it?

I assume I have to first open an opposite one: 

SendOrder(OP_SELL, 0.1, 0, 0);

 Ok. Now I have one long and one short positions with the same magic number.

How to execute CloseBy ?

Stanislav Korotky
21105
Stanislav Korotky  
Send an order in reverse direction using position id obtained after the first order execution. Here is some code.
Nguyen Nga
10327
Nguyen Nga  

All function in Include\Trade\Trade.mqh

i think it is easy for coding.

Miroslav Popov
395
Miroslav Popov  

Thank you.

I tried the Stanislav's recommendation and it works so far.

It was necessary simply to find the position ticket and to set it in the opposite order's request.

 

Find ticket:

   int posTotal=PositionsTotal();
   for(int posIndex=0;posIndex<posTotal;posIndex++)
     {
      ulong ticket=PositionGetTicket(posIndex);
      if(PositionSelectByTicket(ticket) &&
         PositionGetString(POSITION_SYMBOL)==_Symbol &&
         PositionGetInteger(POSITION_MAGIC)==Magic_Number)
        {
         posType   = PositionGetInteger(POSITION_TYPE);
         posLots   = PositionGetDouble(POSITION_VOLUME);
         posTicket = ticket;
         break;
        }
     }

  Set ticket in request:

 

         request.position     = ticket;
vinyoliver
29
vinyoliver  
Miroslav Popov:

Thank you.

I tried the Stanislav's recommendation and it works so far.

It was necessary simply to find the position ticket and to set it in the opposite order's request.

 

Find ticket:

  Set ticket in request:

 


Hello Miroslav,

I'm having a hard time trying to close an open position. Can you please post your entire code that closes the opened position? I guess it would help lots of us


Thanks a lot.

To add comments, please log in or register