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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user