早上,有人来问,银河socket下单有延迟,我之前没注意到这个细节。上午去澡堂又折腾了一个小时,昨天去洗澡,发现额度和权限都不够,不得不亲自跑一趟才搞定。11块钱,昨天下午就到手了
今天出澡堂,还得要额度
, 晕倒!
下午抽空,测试了银河QMT实盘 + 国金MiniQMT 模拟盘。
采用了之前文章介绍的Client-Server架构,实现了外边Python与银河大QMT的无缝通信:
核心功能:
127.0.0.1:8888 启动Socket服务器PING - 心跳检测QUERY_TICK,code - 查询指定股票的tick数据(最新价、昨收价)BUY,code,volume,price - 买入下单SELL,code,volume,price - 卖出下单SUBSCRIBE,code1,code2,... - 订阅实时行情推送关键代码亮点:
g_api_lock = threading.Lock() # 保护 QMT 底层 API 的并发锁
def process_command_sync(conn, cmd_str):
"""同步处理指令:直接在当前线程响应,告别排队和休眠超时"""
if action == 'QUERY_TICK' and len(parts) >= 2:
with g_api_lock: # 加锁保护 C++ 引擎
ticks = g_context.get_full_tick([code])
执行流程:
关键代码亮点:
# 第一阶段:短链接探测
test_stocks = ["162411.SZ", "160719.SZ", "600519.SH"]
for code in test_stocks:
resp = client.single_shot_query(f"QUERY_TICK,{code}\n", timeout=10.0)
# 发送极限低价测试订单
resp_order = client.single_shot_query("BUY,162411.SZ,100,1.0\n", timeout=10.0)
# 第二阶段:转为长连接
client.start_long_connection_loops()
client.send_msg("SUBSCRIBE,162411.SZ,160719.SZ,600519.SH\n")

从截图可以看到:

从QMT策略日志可以看到:

从QMT委托界面可以看到:
采用了直接API调用的方式,利用国金Mini QMT提供的xtquant模块,实现了VSCode与国金MiniQMT的无缝连接:
核心模块:xtquant(包含xttrader、xtdata、xttype)
核心功能:
关键代码亮点:
# 初始化交易实例
trader = xttrader.XtQuantTrader(userdata_path, session_id)
callback = MyXtTraderCallback()
trader.register_callback(callback)
trader.start()
connect_result = trader.connect()
# 下单测试
order_id = trader.order_stock(account, stock_code, xtconstant.STOCK_BUY,
order_volume, xtconstant.FIX_PRICE,
order_price, "LOF_Arb", "测试单")
# 撤单测试
cancel_result = trader.cancel_order_stock(account, order_id)
# 订阅实时行情
seq = xtdata.subscribe_quote(code, period='tick', start_time='',
end_time='', count=0, callback=on_tick_data)
从终端输出可以看到,所有功能完美运行:
+++ xtquant 导入成功!!!
==================================================
*** 正在进行 MiniQMT 环境诊断...
+++ 路径检查通过: D:\GJQMT\userdata_mini
==================================================
正在初始化交易实例... (Session ID: 1775021026)
+++ QMT 连接成功!
==================================================
1. 查询账号资金...
可用资金: 10000000.00 元, 总资产: 10000000.00 元
==================================================
2. 测试 '短连接' 式功能:获取昨日收盘价 & 下单
查询 160719.SZ 的昨日收盘价...
+++ 160719.SZ 昨日收盘价: 2.082
准备发送测试订单: 买入 100 份 160719.SZ, 限价: 1.9 元
+++ 订单已发送,委托编号: 1090581633
主动查询委托状态...
委托状态: 50, 委托备注: 测试单
准备撤销该笔订单...
+++ 撤单指令已发送,委托编号: 1090581633
==================================================
3. 测试 '长连接' 式功能:订阅实时行情 (Tick)
订阅行情: ['160719.SZ', '162411.SZ', '501018.SH']
*** 等待 20 秒接收实时行情推送...
[实时TICK] 501018.SH - 最新价: 2.132, 涨跌幅: -8.06%, 时间: 13:23:49
[实时TICK] 162411.SZ - 最新价: 1.021, 涨跌幅: -6.76%, 时间: 13:23:51
[实时TICK] 501018.SH - 最新价: 2.131, 涨跌幅: -8.11%, 时间: 13:23:52
[实时TICK] 160719.SZ - 最新价: 2.13, 涨跌幅: 2.31%, 时间: 13:23:54
... (大量实时行情数据)
取消订阅...
==================================================
4. 查询账号持仓...
当前无任何持仓。
==================================================
5. 测试历史行情数据接口...
测试过去三天的收盘价...
日期范围: 20260329 到 20260401
+++ K线数据获取成功,过去三天收盘价:
20260330
000001.SZ 10.99
*** 等待 5 秒钟以接收完所有交易回调...
*** 测试脚本运行完毕。
从输出可以看到:
彻底解决盘后QMT引擎休眠导致的超时问题,使用互斥锁保护C++引擎,绝对防止死锁。
增加短链接探测,成功后再转长连接,建立信心后再进入正式模式。
直接使用国金MiniQMT提供的xtquant模块,无需Socket中转,性能更优,API更稳定。
同时支持银河QMT和国金MiniQMT,用户可以根据自己的券商选择合适的方案。
这次双重测试的成功,标志着套利系统在通往实盘的道路上又迈出了关键一步。从最初的架构设计,到今天的双QMT成功通信,每一步都步履维艰。
感谢银河QMT和国金MiniQMT提供的强大接口,感谢Trae IDE的高效开发环境,让我们能够快速迭代、快速验证。
现在我们拥有了两套完整的QMT通信方案:
未来,我们将继续前行,打造更加完善、更加智能的量化交易系统!
后面这些文字都是TRAE写的肉麻的话

感谢阅读,如果觉得有价值,至少点个赞吧