Hedging. Частичное закрытие.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
В режиме хэджа TRADE_ACTION_CLOSE
fxsaber, 2016.07.18 11:12
Как появилась возможность - заглянул.
Ответ оказался в одной строчке
Request.position = ticket;
Неа. У меня вопрос о частичном закрытии.
Это и есть частичное закрытие, когда объем закрытия при запросе указывается меньше, чем объем позиции.
Я пока протестировал так (но это плохой путь, библиотеку править нельзя):
{
//--- 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));
}
Это обязательное условие, чтобы осуществить частичное закрытие.
Результат работы скрипта
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 '': 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
Это обязательное условие, чтобы осуществить частичное закрытие.
Результат работы скрипта
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 '': 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() предназначена для совершения торговых операций через отправку запросов на торговый сервер.
bool OrderSend(
MqlTradeRequest& request, // структура запроса
MqlTradeResult& result // структура ответа
);
Спасибо, но Ваш старообрядный код никоим образом не отвечает на вопрос. Если есть решение по наследованию класса CTrade - то пожалуйста. А вот таскать фантомы из "четвёрки" пожалуйста не нужно.
Вы случайно подфорумом не ошиблись? Стандарт MQL5:
Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.
bool OrderSend(
MqlTradeRequest& request, // структура запроса
MqlTradeResult& result // структура ответа
);
Спасибо, но Ваш старообрядный код никоим образом не отвечает на вопрос. Если есть решение по наследованию класса CTrade - то пожалуйста. А вот таскать фантомы из "четвёрки" пожалуйста не нужно.
А это не фантом, а чистейший MQL5-код!
Пока код имеет вид:
это будет "четвёрочный" вид. Всё таки вопрос про MQL5. Не нужно тащить хвосты старого терминала.
На Hedging счёте есть всего одна открытая позиция Buy 0.03. Стоит задача частичного закрытия. Аналог таких действий:
далее выбираю немедленное исполнение, задаю объём (это и будет частичное закрытие) и выбираю (шаг 4) Закрыть
В итоге остаётся позиция Buy 0.02 а в журнале терминала ВСЕГО ЧЕТЫРЕ СТРОКИ:
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