问题描述
passorder下单函数,回测环境可以成功,在实盘无法成功。
解决方法:
检查“策略信号”、“策略日志”、“消息提示”这三个地方,消息提示里是否有报错(下图)
解决方案
QMT实盘下单无反应的常见原因与排查步骤
在QMT量化平台中,经常会遇到策略在回测环境下运行完美,但切换到实盘后,使用 passorder 下单却发现资金和仓位没有任何变化的情况。这通常是因为实盘环境的严格校验、账号配置或网络状态导致的。以下是标准的排查流程与解决方法:
1. 第一步:检查系统日志与消息提示(最直接有效)
正如您所提到的,排查实盘下单问题的第一步是查看系统底层的反馈。请依次检查以下三个面板:
- 策略信号:确认策略在实盘行情下是否真正触发了下单信号。
- 策略日志:查看代码运行过程中是否有 Python 语法报错或逻辑错误。
- 消息提示(核心):这是排查实盘问题的关键。如果委托发送失败,柜台或风控系统会在这里返回具体的报错信息。常见的报错包括:
资金不足:实盘可用资金不够。不在交易时间:测试时未在有效交易时段。废单:价格设置超出涨跌停限制,或报单参数不合法。风控拦截:触发了防自成交、单笔最大委托量等风控规则。
2. 第二步:检查实盘账号绑定与参数传递
回测时,QMT会使用虚拟账号,但实盘必须明确指定真实的资金账号。
- 是否在
init中绑定了账号?
确保在初始化函数中调用了set_account:def init(ContextInfo): # 必须替换为您的真实资金账号 ContextInfo.set_account('您的实盘账号') passorder中的accountid是否正确?
检查passorder函数的第三个参数accountid,确保传入的是正确的实盘账号字符串,或者直接使用ContextInfo.accID(前提是已正确 set_account)。
3. 第三步:检查报价类型(prType)与挂单状态
资金和仓位没变化,可能是因为委托已经发出,但处于“挂单”状态,尚未成交。
- 检查
passorder的prType(报价类型)参数。如果在实盘中使用了指定价(prType=11),且指定价格偏离当前盘口较远,订单会一直挂在交易所。 - 现象:此时可用资金会减少(被冻结),但持仓不会增加。请在QMT的“委托列表”中查看是否有未成交的挂单。
- 建议:实盘中为了保证成交率,可以考虑使用对手价(
prType=14)或最新价(prType=5)。
4. 第四步:确认策略运行模式
QMT的策略运行分为几种模式,请确保您开启了真正的实盘交易:
- 运行模式 vs 实盘模式:在策略编辑器中点击“运行”,默认只是模拟运行(只产生信号,不发真实委托)。
- 正确做法:需要将策略加入到**“模型交易”中,并将策略的运行模式切换为“实盘”**模式,这样
passorder才会向真实柜台发送委托指令。
5. 第五步:检查 quickTrade 参数
passorder 函数的 quickTrade 参数决定了下单的触发时机:
- 如果
quickTrade=0(默认),信号会在当前 K 线走完,下一根 K 线的第一个 tick 触发。如果实盘中 K 线还没走完,是不会马上下单的。 - 如果希望信号成立立即下单,可以尝试将
quickTrade设置为1或2(需谨慎评估逻辑)。
总结:遇到实盘下单无反应,首看“消息提示”找报错,次查“委托列表”看挂单,再查代码账号与模式配置。按照此流程,99%的实盘下单问题都能迎刃而解。