fix(trader): cancel_order 补 symbol/exchange

vnpy 4.4.0 的 CancelRequest 必填 (orderid,symbol,exchange),原代码只传
orderid → TypeError → 撤单从不工作。改为从 _exec.orders 缓存查 OrderData
拿 symbol/exchange 一起传。E2E 实证 {ok:True} 无 TypeError(盘后 miniQMT
非交易时段不实际撤单,是另一回事)。
This commit is contained in:
2026-07-15 21:28:19 +08:00
parent 70d72f35bb
commit dfa72e1440
+8 -3
View File
@@ -164,9 +164,14 @@ class QmtGatewayClient:
try:
from vnpy.trader.object import CancelRequest
oid = str(order_id)
if oid.startswith("QMT."): # vt_orderid(QMT.184246#1)→ remark(184246#1)
oid = oid[4:] # vnpy_qmt td.orders 按 remark 建 key
self._exec.gateway.cancel_order(CancelRequest(orderid=oid))
vt = oid if oid.startswith("QMT.") else f"QMT.{oid}"
o = self._exec.orders.get(vt)
if o is None:
return {"ok": False, "error": f"order {oid} 不在缓存(gateway 未收到该单事件)"}
remark = vt[4:] # vt_orderid(QMT.184246#1)→ remark(184246#1)vnpy_qmt 按 remark 建 key
# vnpy 4.4.0 的 CancelRequest 必填 (orderid, symbol, exchange),缺 symbol/exchange 会 TypeError
self._exec.gateway.cancel_order(
CancelRequest(orderid=remark, symbol=o.symbol, exchange=o.exchange))
return {"ok": True, "order_id": order_id}
except Exception as e: # noqa: BLE001
logger.warning("QmtGatewayClient.cancel_order 失败 %s: %s", order_id, e)