3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 miniQMT (xtquant) 实盘交易中,调用 xt_trader.order_stock 成功返回了 order_id,但客户端没有委托记录且没有触发任何 callback 回报,通常是由以下几个常见原因导致的。请按照以下步骤逐一排查:
这是最常见的原因。order_stock 接收的 account 参数必须与你当前 miniQMT 客户端登录的资金账号完全一致。
account_id(例如 StockAccount('123456'))是否与 miniQMT 客户端右上角显示的资金账号一致。order_id(因为 order_id 是本地生成的序列号),但由于找不到对应的登录账号,该订单实际上并没有被发送到柜台,因此客户端看不到,也不会有任何状态回报。虽然你调用的是同步下单接口,但订单的状态变化(如已报、部成、已成、废单等)是通过异步回调推送的。
xt_trader.register_callback(MyXtQuantTraderCallback()) 注册回调类。xt_trader.start()。start() 方法会启动后台线程来接收 miniQMT 客户端推送的回报数据。如果没有调用 start(),你将永远收不到 callback。xt_trader.run_forever() 或 time.sleep() 保持主线程存活。如果 miniQMT 客户端本身与券商柜台断开连接,订单发送会失败。
有时候订单参数(如价格超出涨跌停、数量不符合规范、代码错误等)触发了本地风控,订单直接被废弃,未能到达柜台。
xtquant.log 日志文件(通常位于你的 Python 脚本同级目录或 miniQMT 安装目录下)。日志中会详细记录订单发送失败的具体原因(如 error_msg)。on_order_error 回调(前提是回调已正确注册并启动)。请确认你连接的 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 中的报错信息,通常能直接定位到原因。