Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
В режиме хэджа 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. Не нужно тащить хвосты старого терминала.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
На 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