Hedging. Частичное закрытие. - страница 3

 

Не понял насчет кол-ва строк в логах.. зачем именно 4, но я закрываю вот так, готовый пример - открывает позу и частично закрывает. Остается 0.25 лотов от начальных 0.5. И не надо библиотеку править. Оформить это все в методы и думаю норм.

//+------------------------------------------------------------------+
//|                                                 PosPartClose.mq5 |
//|                        Copyright 2015, MA. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#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);
        }
        
  
 

Вопрос о четырёх строках был не случайным. Я на MQL5 пишу опираясь на стандартную библиотеку, и вот когда стала задача частично закрыть позицию на hedge счёте, сначала пришло решение "влоб": открыть противоположную позицию половинным объёмом, потом закрыть используя CTrade::PositionCloseBy.

Конечно при таком подходе получалось далеко не четыре строчки в журнале :). Потом немного подумав переиначил задачу.

В итоге появился такой класс:

//+------------------------------------------------------------------+
//|                                              CPartialClosing.mqh |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| Class CPartialClosing.                                           |
//| Appointment: Class trade operations - Partial closing.           |
//|              Derives from class CTrade.                          |
//+------------------------------------------------------------------+
class CPartialClosing : public CTrade
  {
public:
                     CPartialClosing();
                    ~CPartialClosing();
   bool              PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX,const double partial_volume=0);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPartialClosing::CPartialClosing()
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPartialClosing::~CPartialClosing()
  {
  }
//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CPartialClosing::PositionClose(const ulong ticket,const ulong deviation,const double partial_volume=0)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =(partial_volume==0) ? PositionGetDouble(POSITION_VOLUME) : partial_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   PrintFormat("PositionClose #%I64d %s %.2f",ticket,EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),m_request.volume);
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+

Таким образом, если нужно частичное закрытие, подключаю этом класс вместо CTrade.

 
Vladimir Karputov:

Вопрос о четырёх строках был не случайным. Я на MQL5 пишу опираясь на стандартную библиотеку, и вот когда стала задача частично закрыть позицию на hedge счёте, сначала пришло решение "влоб": открыть противоположную позицию половинным объёмом, потом закрыть используя CTrade::PositionCloseBy.

Конечно при таком подходе получалось далеко не четыре строчки в журнале :). Потом немного подумав переиначил задачу.

А ну да, надо не позицией закрывать а встречным ордером, я таким же путем пришел к этому )
 

В билде 1545, в торговом классе CTrade появился новый метод - PositionClosePartial:

PositionClosePartial

PositionClosePartial Закрывает часть позиции по указанному символу при 'хеджинговом' учете. bool  PositionClosePartial ( const string   symbol,  // символ const double   volume,  // объем ulong   deviation=ULONG_MAX   // отклонение ) Закрывает часть позиции с указанным тикетом при 'хеджинговом' учете. bool  PositionClosePartial ( const ulong   ticket,  // тикет позиции const double   volume,  // объем ulong   deviation=ULONG_MAX   // отклонение ) Параметры symbol [in] Наименование торгового инструмента, по которому предполагается закрыть часть позиции. Если для частичного закрытия позиции указан символ (не тикет), то будет выбрана первая найденная позиция по данному символу, имеющая заданный MagicNumber ( идентификатор эксперта ). Поэтому в ряде случаев лучше использовать вариант PositionClosePartial() с указанием тикета позиции. volume [in] Объем, на который нужно уменьшить позицию. Если значение больше, чем объём частично закрываемой позиции, то произойдет полное закрытие позиции...

Документация | 2017.02.10 09:52

Причина обращения: