Попробуйте без обертки CTrade написать на MQL5 закрытие открытой позиции.
К сожалению, сейчас нет доступа к десктопному MT5, чтобы попытаться конструктивнее показать Вам, о чем изначально идет речь.
Я Вас уже поблагодарил за желание помочь. Больше не надо, спасибо. Если разработчики или фрилансеры ответят - будет хорошо.
Берёте эту самую обёртку и смотрите, как там всё сделано.
Если не нужна обёртка, так просто скопируйте к себе этот код.
bool CTrade::PositionClose(constulong ticket,constulong deviation)
{
//--- check stoppedif(IsStopped(__FUNCTION__))
return(false);
//--- check position existenceif(!PositionSelectByTicket(ticket))
return(false);
string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
ClearStructures();
//--- checkif((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 positionPrintFormat("PositionClose #%I64d %s %.2f",ticket,EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),m_request.volume);
return(OrderSend(m_request,m_result));
}
Что тут непонятного. Если у Вас счёт с хеджингом, то закрывать надо не просто позицию (так как может быть открыто много позиций по одному и тому же символу), а позицию по конкретному тикету.
Если же Вы хотите закрыть все позиции по данному символу используйте этот исходный код в цикле
bool CTrade::PositionClose(conststring symbol,constulong deviation)
{
bool partial_close=false;
int retry_count =10;
uint retcode =TRADE_RETCODE_REJECT;
//--- check stoppedif(IsStopped(__FUNCTION__))
return(false);
//--- clean
ClearStructures();
do
{
//--- checkif(SelectPosition(symbol))
{
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);
}
}
else
{
//--- position not found
m_result.retcode=retcode;
return(false);
}
//--- setting request
m_request.action =TRADE_ACTION_DEAL;
m_request.symbol =symbol;
m_request.volume =PositionGetDouble(POSITION_VOLUME);
m_request.magic =m_magic;
m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- hedging? just send orderif(IsHedging())
{
m_request.position=PositionGetInteger(POSITION_TICKET);
return(OrderSend(m_request,m_result));
}//--- check fillingif(!FillingCheck(symbol))
return(false);
//--- check volumedouble max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
if(m_request.volume>max_volume)
{
m_request.volume=max_volume;
partial_close=true;
}
else
partial_close=false;
//--- order sendif(!OrderSend(m_request,m_result))
{
if(--retry_count!=0) continue;
if(retcode==TRADE_RETCODE_DONE_PARTIAL)
m_result.retcode=retcode;
return(false);
}
//--- WARNING. If position volume exceeds the maximum volume allowed for deal,//--- and when the asynchronous trade mode is on, for safety reasons, position is closed not completely,//--- but partially. It is decreased by the maximum volume allowed for deal.if(m_async_mode)
break;
retcode=TRADE_RETCODE_DONE_PARTIAL;
if(partial_close)
Sleep(1000);
}
while(partial_close);
//--- succeedreturn(true);
}
Можно ведь просто заглянуть в уже приготовленные исходники. Что Вам и посоветовал Владимир Карпутов. Но Вам ведь нужно вип-обслуживание?
То что вы написали хоть и есть в справочнике, но блин... до этого ещё дойти нужно. Неужели разрабам сложно было прямым текстом написать, что при request.action = TRADE_ACTION_DEAL добавите request.position = position (тикет позиции) и позиция будет удалена.
Спасибо!
зы: выдержка у Вас на 5+, как не с агрелись на "помощников" хз...
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Попробуйте без обертки CTrade написать на MQL5 закрытие открытой позиции.
К сожалению, сейчас нет доступа к десктопному MT5, чтобы попытаться конструктивнее показать Вам, о чем изначально идет речь.
Я Вас уже поблагодарил за желание помочь. Больше не надо, спасибо. Если разработчики или фрилансеры ответят - будет хорошо.
Берёте эту самую обёртку и смотрите, как там всё сделано.
Если не нужна обёртка, так просто скопируйте к себе этот код.
Что тут непонятного. Если у Вас счёт с хеджингом, то закрывать надо не просто позицию (так как может быть открыто много позиций по одному и тому же символу), а позицию по конкретному тикету.
Если же Вы хотите закрыть все позиции по данному символу используйте этот исходный код в цикле
Можно ведь просто заглянуть в уже приготовленные исходники. Что Вам и посоветовал Владимир Карпутов. Но Вам ведь нужно вип-обслуживание?
Можно ведь просто заглянуть в уже приготовленные исходники.
Как появилась возможность - заглянул.
Ответ оказался в одной строчке
Но Вам ведь нужно вип-обслуживание?
Риторический же вопрос. Спасибо.
Как появилась возможность - заглянул.
Ответ оказался в одной строчке
Риторический же вопрос. Спасибо.
То что вы написали хоть и есть в справочнике, но блин... до этого ещё дойти нужно. Неужели разрабам сложно было прямым текстом написать, что при request.action = TRADE_ACTION_DEAL добавите request.position = position (тикет позиции) и позиция будет удалена.
Спасибо!
зы: выдержка у Вас на 5+, как не с агрелись на "помощников" хз...