Частичное закрытие позиции на Hedge счете

 
Подскажите пожалуйста, как это нужно делать? стандартный класс cTrade не содержит такой возможности. В типах торговых операций есть TRADE_ACTION_CLOSE_BY, этот тип можно использовать для частичного закрытия выбранной позиции?
 
Ну как-же нету? Вот...
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / PositionCloseBy
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / PositionCloseBy
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTrade / PositionCloseBy - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:
Ну как-же нету? Вот...

так это надо сначала открыть противоположную позицию нужным объемом, а затем 2 позиции взаимно аннигилировать что-ли? ) А если объемы не совпадают, для частичного закрытия

ничо не понял как это должно работать 

 
Maxim Dmitrievsky:

так это надо сначала открыть противоположную позицию нужным объемом, а затем 2 позиции взаимно аннигилировать что-ли? ) А если объемы не совпадают, для частичного закрытия

ничо не понял как это должно работать 

Я не правильно понял вопрос.

Видимо действительно нету. Я тоже не нашёл.

Может допишут или исправят существующий класс. Делов-то...

 
Alexey Viktorov:

Я не правильно понял вопрос.

Видимо действительно нету. Я тоже не нашёл.

Может допишут или исправят существующий класс. Делов-то...

ну а вообще механика какая? получается, через OrderSend() нужно отправить TRADE_ACTION_DEAL нужного объема, только противоположную, предварительно в MqlTradeRequest подставить тикет нужной позиции?
 
Maxim Dmitrievsky:
ну а вообще механика какая? получается, через OrderSend() нужно отправить TRADE_ACTION_DEAL нужного объема, только противоположную, предварительно в MqlTradeRequest подставить тикет нужной позиции?
Разработчики не сделали частичное закрытие. Надо унаследоваться и написать самому. Только класс CTrade не правьте, при обновлении терминала все правки пропадут.
 
Alexey Volchanskiy:
Разработчики не сделали частичное закрытие. Надо унаследоваться и написать самому. Только класс CTrade не правьте, при обновлении терминала все правки пропадут.
ну это я понял, я про то что получается что мы посылаем противоположный ордер по тому же тикету, другим объемом, и она должна частично закрыться? в мт4 просто нет такого. вроде да, в сTrade так и сделано, только полным объемом, т.е. закрытие полностью. Наследоваться не надо, можно самому запрос составить.
 
Maxim Dmitrievsky:
ну это я понял, я про то что получается что мы посылаем противоположный ордер по тому же тикету, другим объемом, и она должна частично закрыться? в мт4 просто нет такого. вроде да, в сTrade так и сделано, только полным объемом, т.е. закрытие полностью. Наследоваться не надо, можно самому запрос составить.
надо попробовать, я сам на MT5 недавно перешел, не в курсе
 

Сделал проверку, вот так можно частично закрыть позу:

Открываем бай позу 0.5 частично закрываем встречным селл ордером 0.25 остается бай 0.25

#include <Trade\Trade.mqh>        
#include <Trade\PositionInfo.mqh> 
#include <Trade\AccountInfo.mqh>

CTrade            m_Trade;
CPositionInfo     m_Position;
CAccountInfo      m_Account;
MqlTradeRequest   m_request;
MqlTradeResult    m_result;
MqlTick fpprcurr;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CountPosBuy(_Symbol)==0 && CountPosSell(_Symbol)==0)
    {
     double priceBuy=fpprcurr.ask;
     m_Trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.5,priceBuy,0,0,NULL);
     
     ulong ticket;
     for(int pos=PositionsTotal(); pos>=0; pos--)
                    {
                     string symb=PositionGetSymbol(pos);
                     if(m_Position.Select(symb) && m_Position.Type()==POSITION_TYPE_BUY)
                       {
                        ticket=m_Position.Ticket();
                       }
                    }
     
     m_request.position=PositionGetInteger(POSITION_TICKET);
     m_request.order=ticket;
     m_request.type =ORDER_TYPE_SELL;
     m_request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
     m_request.action   =TRADE_ACTION_DEAL;
     m_request.symbol   =_Symbol;
     m_request.volume   =0.25;
     OrderSend(m_request,m_result);
    }
  }
//+------------------------------------------------------------------+

int CountPosBuy(string symbol)
  {
   int result=0;
   for(int k=0; k<PositionsTotal(); k++)
     {
      if(m_Position.Select(symbol)==true)
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY)
           {result++;}
         else
           {}
           }
        }
      return(result);
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   int CountPosSell(string symbol)
     {
      int result=0;
      for(int k=0; k<PositionsTotal(); k++)
        {
         if(m_Position.Select(symbol)==true)
           {
            if(m_Position.PositionType()==POSITION_TYPE_SELL)
              {result++;}
            else
              {}
              }
           }
         return(result);
        }
 
Maxim Dmitrievsky:

Сделал проверку, вот так можно частично закрыть позу:

Открываем бай позу 0.5 частично закрываем встречным селл ордером 0.25 остается бай 0.25

Поэтому пишу так
#include <MT4Orders.mqh>

void OnStart()
{
  OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);

  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() == OP_BUY) && (OrderSymbol() == _Symbol))  
      OrderClose(OrderTicket(), 0.25, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0);  
}
Причина обращения: