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
相关产品推荐
相关产品推荐

