You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MT5关闭订单触发Invalid Request 10013错误的技术求助

解决MT5平仓时触发10013 Invalid Request错误的思路

核心原因:混淆了「已成交订单」与「挂单/持仓」的操作逻辑

MT5中:

  • TRADE_ACTION_DEAL 生成的是已成交订单,执行后会创建对应的持仓(Position),这类订单无法通过TRADE_ACTION_REMOVE删除(该动作仅针对未成交的挂单)
  • 你拿到的result.order是已成交订单的ticket,用它调用TRADE_ACTION_REMOVE或CTrade.OrderDelete()必然触发10013错误,因为这两个操作的目标是未成交挂单,而非已成交订单对应的持仓

正确的平仓方案

方案1:通过持仓ID平仓

先通过已成交订单的ticket关联到对应的持仓ID,再构造合规的平仓请求:

void CloseTradeOrder(ulong orderTicket)
{
    MqlTradeRequest request={};
    MqlTradeResult  result={};
    ZeroMemory(request);
    ZeroMemory(result);

    // 选中目标已成交订单
    if(OrderSelect(orderTicket, SELECT_BY_TICKET, MODE_TRADES))
    {
        // 获取该订单对应的持仓ID
        ulong positionId = OrderPositionID();
        // 确认持仓存在
        if(PositionSelectByTicket(positionId))
        {
            request.action = TRADE_ACTION_DEAL;
            request.position = positionId; // 指定要平仓的持仓ID
            request.symbol = Symbol();
            // 设置反向平仓类型:多单平空,空单平多
            request.type = (PositionType() == POSITION_TYPE_BUY) ? ORDER_TYPE_SELL : ORDER_TYPE_BUY;
            request.volume = PositionVolume(); // 平全部持仓量
            request.price = (request.type == ORDER_TYPE_SELL) ? SymbolInfoDouble(Symbol(), SYMBOL_BID) : SymbolInfoDouble(Symbol(), SYMBOL_ASK);

            if(!OrderSend(request, result))
            {
                Print("平仓失败,错误码: ", result.retcode, " 系统错误码: ", GetLastError());
            }
            else
            {
                Print("平仓成功,持仓ID: ", positionId);
                EventKillTimer();
            }
        }
        else
        {
            Print("未找到对应持仓,错误码: ", GetLastError());
        }
    }
    else
    {
        Print("无法选中订单,错误码: ", GetLastError());
    }
}

方案2:使用CTrade类的专属平仓方法

CTrade类的OrderDelete()是删除挂单的接口,平仓需要用PositionClose():

// 假设已通过result.order拿到已成交订单ticket
ulong orderTicket = result.order;
ulong positionId = 0;
if(OrderSelect(orderTicket, SELECT_BY_TICKET, MODE_TRADES))
{
    positionId = OrderPositionID();
    CTrade trade;
    if(!trade.PositionClose(positionId))
    {
        Print("CTrade平仓失败,错误码: ", GetLastError());
    }
    else
    {
        Print("CTrade平仓成功");
        EventKillTimer();
    }
}

额外排查点

  • 确认当前市场处于可交易时段(非休市、非结算时间)
  • 检查账户是否有足够保证金完成平仓操作
  • 部分经纪商要求平仓必须指定价格(用当前Bid/Ask价即可,如示例所示)
  • 确保订单ticket对应的持仓尚未被平仓

内容的提问来源于stack exchange,提问作者StackNet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:43:11