QMT 里 passorder 返回成功,只代表委托发出去了,不代表成交。这是最容易误判的一点:日志里看到下单函数没报错,就以为单子成了,结果收盘一看持仓没变。
盘中要自己查,靠 get_trade_detail_data。
四个数据类型
get_trade_detail_data(账号, 账号类型, 数据类型) 的第三个参数决定你查什么:
- ORDER:委托状态、已成数量(判断"报出去没有、成了多少")
- DEAL:成交明细(逐笔成交价、量)
- POSITION:持仓
- ACCOUNT:资金
最常用的是 ORDER 和 DEAL:ORDER 看委托走到哪一步,DEAL 看实际成交了多少。
账号类型别写错
股票账号是 STOCK,期货是 FUTURE,两融是 CREDIT。写错类型查出来是空列表,而且不报错 —— 又是那种"看着像没数据、其实是参数错"的坑。
strategyName 要一致
下单时如果带了 strategyName,查询时要用同一个名字,否则会把自己和其他策略的单混在一起。同一个账号跑多个策略时,这个字段基本是必须的。
一个容易忽略的坑:别把状态塞进 ContextInfo
盘中逐 K 会不断回退,ContextInfo 里的字段会跟着回到上一根 K 线结束时的状态。想存"这个单已经报过了"这类跨 K 线的标记,用普通全局对象(比如模块级变量),不要塞进 ContextInfo。
# 全局对象存长期状态
state = {'ordered': set()}
def handlebar(C):
code = '600000.SH'
if code in state['ordered']:
return
# ... 下单逻辑
state['ordered'].add(code)
资料
查单的完整写法和字段说明:
https://www.kimiquant.cn/problems/qmt-order-callback
常用接口速查(get_trade_detail_data 的参数都在这里):
https://www.kimiquant.cn/tools/api
按报错关键词搜的问题库:
https://www.kimiquant.cn/problems
另外写策略代码时我常用 WorkBuddy 辅助,直接帮我写 QMT 策略、排查报错,比自己翻文档快不少,有兴趣可以试试:https://workbuddy.ai/invite?code=66L9RNCT
文中代码是示例,自行回测,不构成投资建议。 |