🚀 AI 一键生成 qmt 策略代码

miniQMT实盘下单成功返回order_id,但客户端无记录且无回调怎么办?

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

miniqmt实盘同步委托返回order_id,但无回报callback,且客户端上也没有委托记录

mini 实盘,同步下单 order_id = xt_trader.orer_stock(。。。),接收到了返回值 order_id,1090565767,1090609586,但是为啥 miniqmt 上看不到委托单,且没有回报委托状态。订单回报或者委托错误回报都没有

解决方案

在 miniQMT (xtquant) 实盘交易中,调用 xt_trader.order_stock 成功返回了 order_id,但客户端没有委托记录且没有触发任何 callback 回报,通常是由以下几个常见原因导致的。请按照以下步骤逐一排查:

1. 资金账号 (Account ID) 不匹配

这是最常见的原因。order_stock 接收的 account 参数必须与你当前 miniQMT 客户端登录的资金账号完全一致

  • 排查方法:检查代码中传入的 account_id(例如 StockAccount('123456'))是否与 miniQMT 客户端右上角显示的资金账号一致。
  • 注意:如果账号不匹配,API 依然会在本地生成一个 order_id(因为 order_id 是本地生成的序列号),但由于找不到对应的登录账号,该订单实际上并没有被发送到柜台,因此客户端看不到,也不会有任何状态回报。

2. 回调函数未正确注册或未启动接收线程

虽然你调用的是同步下单接口,但订单的状态变化(如已报、部成、已成、废单等)是通过异步回调推送的。

  • 排查方法
    1. 确认是否调用了 xt_trader.register_callback(MyXtQuantTraderCallback()) 注册回调类。
    2. 确认是否调用了 xt_trader.start()start() 方法会启动后台线程来接收 miniQMT 客户端推送的回报数据。如果没有调用 start(),你将永远收不到 callback。
    3. 确认主线程没有立即退出。如果脚本在下单后直接结束运行,后台回调线程也会随之销毁。可以在代码末尾加上 xt_trader.run_forever()time.sleep() 保持主线程存活。

3. 客户端连接状态异常

如果 miniQMT 客户端本身与券商柜台断开连接,订单发送会失败。

  • 排查方法:检查 miniQMT 客户端右下角的连接状态,确保“交易”和“行情”均处于绿色已连接状态。

4. 订单被风控拦截(本地或服务端)

有时候订单参数(如价格超出涨跌停、数量不符合规范、代码错误等)触发了本地风控,订单直接被废弃,未能到达柜台。

  • 排查方法
    • 检查 xtquant.log 日志文件(通常位于你的 Python 脚本同级目录或 miniQMT 安装目录下)。日志中会详细记录订单发送失败的具体原因(如 error_msg)。
    • 检查是否触发了 on_order_error 回调(前提是回调已正确注册并启动)。

5. 运行环境隔离(模拟 vs 实盘)

请确认你连接的 miniQMT 客户端是实盘客户端还是模拟客户端。如果代码中连接的路径 (path) 指向了模拟客户端的安装目录,而你查看的是实盘客户端的界面,自然会看不到委托记录。

总结排查代码示例

请对比你的代码,确保包含以下关键结构:

from xtquant import xttrader
from xtquant.xttrader import XtQuantTraderCallback
import time

class MyCallback(XtQuantTraderCallback):
    def on_order_stock_async_response(self, response):
        print(f"异步下单回报: {response}")
    def on_order_error(self, error):
        print(f"委托错误回报: {error.error_msg}")
    def on_stock_order(self, order):
        print(f"委托状态变化: {order.order_sysid}, 状态: {order.order_status}")

# 1. 初始化 trader
path = r'D:\国信证券miniQMT\userdata_mini' # 确保路径正确
session_id = int(time.time())
xt_trader = xttrader.XtQuantTrader(path, session_id)

# 2. 注册回调
xt_trader.register_callback(MyCallback())

# 3. 启动后台接收线程 (关键!)
xt_trader.start()

# 4. 连接并订阅账号
acc = xttrader.StockAccount('你的实盘资金账号') # 确保账号完全匹配
connect_result = xt_trader.connect()
if connect_result == 0:
    xt_trader.subscribe(acc)
    
    # 5. 下单
    order_id = xt_trader.order_stock(acc, '000001.SZ', xttrader.xtconstant.STOCK_BUY, 100, xttrader.xtconstant.FIX_PRICE, 10.0, 'test', 'test')
    print(f"下单返回 order_id: {order_id}")

# 6. 阻塞主线程,等待回调 (关键!)
xt_trader.run_forever()

如果按照上述步骤检查后问题依然存在,建议重点查看 xtquant.log 中的报错信息,通常能直接定位到原因。