cover_image

基金套利,大小QMT实战测试记录-QMT(6)

东哥的平凡生活 静听烟雨任平生

🎉 测试成功!

早上,有人来问,银河socket下单有延迟,我之前没注意到这个细节。上午去澡堂又折腾了一个小时,昨天去洗澡,发现额度和权限都不够,不得不亲自跑一趟才搞定。11块钱,昨天下午就到手了 今天出澡堂,还得要额度, 晕倒!

下午抽空,测试了银河QMT实盘 + 国金MiniQMT 模拟盘

📋 第一部分:银河QMT Socket通信测试

采用了之前文章介绍的Client-Server架构,实现了外边Python与银河大QMT的无缝通信:

🔧 服务端 - 运行在银河QMT中

核心功能

  1. Socket监听:在 127.0.0.1:8888 启动Socket服务器
  2. 并发锁保护:使用互斥锁保护QMT底层API,绝对防止死锁
  3. 指令处理
    • 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])

💻 客户端 - 运行在本机VSCode中

执行流程

  1. 阶段1 - 短链接探测
    • 查询3个测试标的的价格(162411.SZ、160719.SZ、600519.SH)
    • 发送一个极限低价测试买单(162411.SZ, 100份, 1.0元)
  2. 阶段2 - 长连接模式
    • 订阅实时行情
    • 保持后台连接,接收TICK数据和订单回报

关键代码亮点

# 第一阶段:短链接探测
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实战测试截图

截图1:客户端运行成功,实时行情推送正常


从截图可以看到:

  • ✅ 连接成功建立
  • ✅ 3个标的价格查询成功
  • ✅ 测试订单返回OK
  • ✅ 实时TICK数据正常推送

截图2:QMT服务端策略日志


从QMT策略日志可以看到:

  • ✅ Socket Server成功启动,监听8888端口
  • ✅ 新客户端成功接入
  • ✅ 订单指令成功送达并处理
  • ✅ 订阅成功加入轮询列表

截图3:QMT委托界面,测试订单已报单


从QMT委托界面可以看到:

  • ✅ 测试订单成功报单
  • ✅ 委托状态:已报
  • ✅ 委托时间准确记录,和Python下单时间是一致的
  • ✅ 价格1.0元(极限低价,不会成交)

📋 第二部分:国金MiniQMT xtquant测试

采用了直接API调用的方式,利用国金Mini QMT提供的xtquant模块,实现了VSCode与国金MiniQMT的无缝连接:

🔧 MiniQMT API架构

核心模块:xtquant(包含xttrader、xtdata、xttype)

核心功能

  1. 连接MiniQMT - 使用xttrader.XtQuantTrader建立连接
  2. 资产查询 - 查询账号资金和总资产
  3. 行情查询 - 获取股票昨日收盘价和历史K线
  4. 订单操作 - 下单、查单、撤单完整流程
  5. 实时订阅 - 订阅Tick数据实时推送
  6. 持仓查询 - 查询当前持仓

关键代码亮点

# 初始化交易实例
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)

📸 国金MiniQMT实战测试输出

测试输出:完整功能测试通过

从终端输出可以看到,所有功能完美运行:

+++ 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 秒钟以接收完所有交易回调...
*** 测试脚本运行完毕。

从输出可以看到:

  • ✅ xtquant模块导入成功
  • ✅ MiniQMT连接成功
  • ✅ 资产查询成功(模拟账户1000万)
  • ✅ 昨日收盘价查询成功
  • ✅ 下单成功(委托编号: 1090581633)
  • ✅ 撤单成功
  • ✅ 实时行情订阅成功(大量TICK数据正常推送)
  • ✅ 持仓查询成功
  • ✅ 历史行情查询成功

🎯 双重测试结果总结

✅ 银河QMT Socket通信 - 成功验证的功能

  1. Socket连接:VSCode与QMT成功建立双向通信
  2. 行情查询:准确查询股票最新价和昨收价
  3. 订单下达:成功通过Socket发送订单指令
  4. 实时推送:TICK数据实时推送正常
  5. 并发控制:互斥锁有效保护QMT引擎

✅ 国金MiniQMT xtquant - 成功验证的功能

  1. API连接:通过xtquant直接连接MiniQMT
  2. 资产查询:查询账号资金和总资产
  3. 行情查询:昨日收盘价、历史K线完美获取
  4. 订单操作:下单→查单→撤单完整流程
  5. 实时订阅:Tick数据实时推送丝滑流畅
  6. 持仓查询:准确查询当前持仓状态

🔒 安全措施

  1. 极限低价测试:使用1.0元/1.9元的极限低价进行测试,确保不会实际成交
  2. 模拟账户:使用国金MiniQMT的模拟账户,安全无风险
  3. 完整撤单:下单后立即撤单,验证完整流程
  4. 心跳机制:Socket通信保持连接活跃

💡 技术亮点

1. 银河QMT:同步并发锁架构

彻底解决盘后QMT引擎休眠导致的超时问题,使用互斥锁保护C++引擎,绝对防止死锁。

2. 银河QMT:短链接转长连接

增加短链接探测,成功后再转长连接,建立信心后再进入正式模式。

3. 国金MiniQMT:原生xtquant API

直接使用国金MiniQMT提供的xtquant模块,无需Socket中转,性能更优,API更稳定。

4. 双券商支持

同时支持银河QMT和国金MiniQMT,用户可以根据自己的券商选择合适的方案。


🚀 下一步计划

  1. 集成到主系统:将两种QMT通信方式集成到LOF套利主系统
  2. 实盘交易:进行真实的套利交易测试
  3. 风险控制:完善订单审核和风险控制机制
  4. 性能优化:进一步优化通信延迟和吞吐量
  5. 双券商切换:实现根据券商自动选择通信方式

📝 后记

这次双重测试的成功,标志着套利系统在通往实盘的道路上又迈出了关键一步。从最初的架构设计,到今天的双QMT成功通信,每一步都步履维艰。

感谢银河QMT和国金MiniQMT提供的强大接口,感谢Trae IDE的高效开发环境,让我们能够快速迭代、快速验证。

现在我们拥有了两套完整的QMT通信方案:

  • 银河QMT:Socket架构,适合需要在QMT内运行策略的场景
  • 国金MiniQMT:原生xtquant API,性能更优,API更稳定

未来,我们将继续前行,打造更加完善、更加智能的量化交易系统!

后面这些文字都是TRAE写的肉麻的话

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


继续滑动看下一个
静听烟雨任平生
向上滑动看下一个