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

 

На Hedging счёте есть всего одна открытая позиция Buy 0.03. Стоит задача частичного закрытия. Аналог таких действий:

Шаг 1 

 

далее выбираю немедленное исполнение, задаю объём (это и будет частичное закрытие) и выбираю (шаг 4) Закрыть 

Шаги 2, 3, 4 

 

В итоге остаётся позиция Buy 0.02 а в журнале терминала ВСЕГО ЧЕТЫРЕ СТРОКИ:

2016.11.02 17:47:18.264 Trades  '3218537': instant sell 0.01 EURUSD at 1.11113, close #107042954 buy 0.02 EURUSD 1.11131 (deviation: 10)
2016.11.02 17:47:18.514 Trades  '3218537': accepted instant sell 0.01 EURUSD at 1.11113, close #107042954 buy 0.02 EURUSD 1.11131 (deviation: 10)
2016.11.02 17:47:18.514 Trades  '3218537': deal #91947165 sell 0.01 EURUSD at 1.11113 done (based on order #107043083)
2016.11.02 17:47:18.514 Trades  '3218537': order #107043083 sell 0.01 / 0.01 EURUSD at 1.11113 done in 251.226 ms
 
А теперь вопрос: как такое проделать при помощи MQL5 (чтобы в журнале было не более четырёх строк)?
 

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

В режиме хэджа TRADE_ACTION_CLOSE

fxsaber, 2016.07.18 11:12

Как появилась возможность - заглянул.

Ответ оказался в одной строчке

Request.position = ticket;
 
fxsaber:
Неа. У меня вопрос о частичном закрытии.
 
Vladimir Karputov:
Неа. У меня вопрос о частичном закрытии.
Это и есть частичное закрытие, когда объем закрытия при запросе указывается меньше, чем объем позиции.
 
fxsaber:
Это и есть частичное закрытие, когда объем закрытия при запросе указывается меньше, чем объем позиции.
Request.position = ticket;
Это совсем не объём.
 

Я пока протестировал так (но это плохой путь, библиотеку править нельзя):

bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- 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   =ВОТ ЗДЕСЬ УКАЗАТЬ МЕНЬШИЙ ОБЪЁМ//PositionGetDouble(POSITION_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));
  }
 
Vladimir Karputov:
Request.position = ticket;
Это совсем не объём.

Это обязательное условие, чтобы осуществить частичное закрытие.

 

Результат работы скрипта

#include <MT4Orders.mqh>

void OnStart()
{
  const int Ticket = OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);

  if (Ticket > 0)
    OrderClose(Ticket, 0.25, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0);  
}
2016.11.02 18:11:47.573 Trades  '': order #107054920 sell 0.25 / 0.25 EURUSD at 1.11172 done in 134.334 ms
2016.11.02 18:11:47.573 Trades  '': deal #91959133 sell 0.25 EURUSD at 1.11172 done (based on order #107054920)
2016.11.02 18:11:47.572 Trades  '': accepted instant sell 0.25 EURUSD at 1.11172, close #107054919 buy 0.50 EURUSD 1.11181
2016.11.02 18:11:47.439 Trades  '': instant sell 0.25 EURUSD at 1.11172, close #107054919 buy 0.50 EURUSD 1.11181

2016.11.02 18:11:47.436 Trades  '': order #107054919 buy 0.50 / 0.50 EURUSD at 1.11181 done in 144.313 ms
2016.11.02 18:11:47.434 Trades  '': deal #91959132 buy 0.50 EURUSD at 1.11181 done (based on order #107054919)
2016.11.02 18:11:47.432 Trades  '': accepted instant buy 0.50 EURUSD at 1.11181
2016.11.02 18:11:47.292 Trades  '': instant buy 0.50 EURUSD at 1.11181
Те самые четыре строчки.
 
fxsaber:

Это обязательное условие, чтобы осуществить частичное закрытие.

 

Результат работы скрипта

#include <MT4Orders.mqh>

void OnStart()
{
  const int Ticket = OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);

  if (Ticket > 0)
    OrderClose(Ticket, 0.25, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0);  
}
2016.11.02 18:11:47.573 Trades  '': order #107054920 sell 0.25 / 0.25 EURUSD at 1.11172 done in 134.334 ms
2016.11.02 18:11:47.573 Trades  '': deal #91959133 sell 0.25 EURUSD at 1.11172 done (based on order #107054920)
2016.11.02 18:11:47.572 Trades  '': accepted instant sell 0.25 EURUSD at 1.11172, close #107054919 buy 0.50 EURUSD 1.11181
2016.11.02 18:11:47.439 Trades  '': instant sell 0.25 EURUSD at 1.11172, close #107054919 buy 0.50 EURUSD 1.11181

2016.11.02 18:11:47.436 Trades  '': order #107054919 buy 0.50 / 0.50 EURUSD at 1.11181 done in 144.313 ms
2016.11.02 18:11:47.434 Trades  '': deal #91959132 buy 0.50 EURUSD at 1.11181 done (based on order #107054919)
2016.11.02 18:11:47.432 Trades  '': accepted instant buy 0.50 EURUSD at 1.11181
2016.11.02 18:11:47.292 Trades  '': instant buy 0.50 EURUSD at 1.11181
Те самые четыре строчки.

Вы случайно подфорумом не ошиблись? Стандарт MQL5:

OrderSend
Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.

bool  OrderSend(
   MqlTradeRequest&  request,      // структура запроса
   MqlTradeResult&   result        // структура ответа
   );

Спасибо, но Ваш старообрядный код никоим образом не отвечает на вопрос. Если есть решение по наследованию класса CTrade - то пожалуйста. А вот таскать фантомы из "четвёрки" пожалуйста не нужно.

 
Vladimir Karputov:

Вы случайно подфорумом не ошиблись? Стандарт MQL5:

OrderSend
Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.

bool  OrderSend(
   MqlTradeRequest&  request,      // структура запроса
   MqlTradeResult&   result        // структура ответа
   );

Спасибо, но Ваш старообрядный код никоим образом не отвечает на вопрос. Если есть решение по наследованию класса CTrade - то пожалуйста. А вот таскать фантомы из "четвёрки" пожалуйста не нужно.

А это не фантом, а чистейший MQL5-код!
 
fxsaber:
А это не фантом, а чистейший MQL5-код!

Пока код имеет вид:

  const int Ticket = OrderSend(_Symbol, OP_BUY, 0.5, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);


это будет "четвёрочный" вид. Всё таки вопрос про MQL5. Не нужно тащить хвосты старого терминала. 

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