Здравствуйте!
У меня на счету используется хеджинговая система учёта позиций.
Сейчас мне нужно сделать частичное закрытие позиции, если я открываю противоположную меньшим лотом, то (естественно) получаю две разнонаправленные позиции. Что мне не нужно.
В CTrade в PositionClose нельзя задать частичный лот, можно только закрыть позу целиком.
Зато есть PositionCloseBy.
Как разумнее организовать частичное закрытие?
1. Закрыть позу целиком и тут же открыть меньшим лотом
или
2. Открыть встречную позицию, получить тикеты двух разнонаправленных позиций и применить PositionCloseBy.
Или я неправильно понимаю логику использования PositionCloseBy?
Частичное закрытие реализовал через наследование - создал свой класс:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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) третий параметр по-умолчанию равен нулю. При обычном привычном программировании приказ на закрытие будет выглядеть так:
то есть третий параметр даже не мешает.
А вот как будет выглядеть вызов с указанием объёма частичного закрытия:
Vladimir Karputov, спасибо, помедитирую на Ваш код :)
fxsaber, спасибо, нет ли анонса изменений?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте!
У меня на счету используется хеджинговая система учёта позиций.
Сейчас мне нужно сделать частичное закрытие позиции, если я открываю противоположную меньшим лотом, то (естественно) получаю две разнонаправленные позиции. Что мне не нужно.
В CTrade в PositionClose нельзя задать частичный лот, можно только закрыть позу целиком.
Зато есть PositionCloseBy.
Как разумнее организовать частичное закрытие?
1. Закрыть позу целиком и тут же открыть меньшим лотом
или
2. Открыть встречную позицию, получить тикеты двух разнонаправленных позиций и применить PositionCloseBy.
Или я неправильно понимаю логику использования PositionCloseBy?