Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Есть вопросы автору статьи? Обсуди их на форуме!
kofesutra
506
kofesutra 2016.11.21 07:32 

Здравствуйте!

У меня на счету используется хеджинговая система учёта позиций.

Сейчас мне нужно сделать частичное закрытие позиции, если я открываю противоположную меньшим лотом, то (естественно) получаю две разнонаправленные позиции. Что мне не нужно.

В CTrade в PositionClose нельзя задать частичный лот, можно только закрыть позу целиком.

Зато есть PositionCloseBy.

Как разумнее организовать частичное закрытие?

1. Закрыть позу целиком и тут же открыть меньшим лотом

или

2. Открыть встречную позицию, получить тикеты двух разнонаправленных позиций и применить  PositionCloseBy.

Или я неправильно понимаю логику использования PositionCloseBy?

Vladimir Karputov
Модератор
33061
Vladimir Karputov 2016.11.21 07:39  
kofesutra:

Здравствуйте!

У меня на счету используется хеджинговая система учёта позиций.

Сейчас мне нужно сделать частичное закрытие позиции, если я открываю противоположную меньшим лотом, то (естественно) получаю две разнонаправленные позиции. Что мне не нужно.

В CTrade в PositionClose нельзя задать частичный лот, можно только закрыть позу целиком.

Зато есть PositionCloseBy.

Как разумнее организовать частичное закрытие?

1. Закрыть позу целиком и тут же открыть меньшим лотом

или

2. Открыть встречную позицию, получить тикеты двух разнонаправленных позиций и применить  PositionCloseBy.

Или я неправильно понимаю логику использования PositionCloseBy?

Частичное закрытие реализовал через наследование - создал свой класс:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vladimir Karputov, 2016.11.02 19:48

Пока решение такое - свой класс с одним методом, производный от класса стандартной библиотеки CTrade:

//+------------------------------------------------------------------+
//|                                              CPartialClosing.mqh |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CPartialClosing : public CTrade
  {
private:

public:
                     CPartialClosing();
                    ~CPartialClosing();
   bool              PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX,const double partial_volume=0);
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CPartialClosing::CPartialClosing()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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));
  }
//+------------------------------------------------------------------+

В методе PositionClose(const ulong ticket,const ulong deviation,const double partial_volume=0) третий параметр по-умолчанию равен нулю. При обычном привычном программировании приказ на закрытие будет выглядеть так:

      m_trade_partial.PositionClose(ticket_position);

то есть третий параметр даже не мешает.

А вот как будет выглядеть вызов с указанием объёма частичного закрытия:

         m_trade_partial.PositionClose(ticket_position,-1,half_volume);

fxsaber
3162
fxsaber 2016.11.21 08:11  
В пятницу будет билд, где СБ серьезно подрихтуют.
kofesutra
506
kofesutra 2016.11.21 09:05  

Vladimir Karputovспасибо, помедитирую на Ваш код :)

fxsaber, спасибо, нет ли анонса изменений? 

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий