Скачать MetaTrader 5

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

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

На 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
Vladimir Karputov
Модератор
50106
Vladimir Karputov  
А теперь вопрос: как такое проделать при помощи MQL5 (чтобы в журнале было не более четырёх строк)?
fxsaber
5402
fxsaber  

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

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

fxsaber, 2016.07.18 11:12

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

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

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

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

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));
  }
fxsaber
5402
fxsaber  
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
Те самые четыре строчки.
Vladimir Karputov
Модератор
50106
Vladimir Karputov  
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 - то пожалуйста. А вот таскать фантомы из "четвёрки" пожалуйста не нужно.

fxsaber
5402
fxsaber  
Vladimir Karputov:

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

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

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

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

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

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

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


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

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