返回列表 发布新帖

TQRelay——大QMT跨机调用通达信TQ接口的HTTP网关(开源)

485 2
发表于 2026-9-26 12:26:12 | 显示全部楼层 阅读模式

TQRelay——大QMT跨机调用通达信TQ接口的HTTP网关(开源)


iQuant 平台的策略写限制大家都懂:禁止读写外部文件、MiniQMT 接口停用。策略要拿通达信 TQ 的数据(尤其公式引擎的筹码函数),常规路全断。

我写了个 HTTP 网关 TQRelay(纯 Python 标准库,553 行单文件,MIT 开源),部署在通达信所在机器,实测大 QMT 策略跨机调用全部 TQ 接口通过(双机 16 项自测)。

架构

机器B(大QMT) --HTTP POST--> 机器A(TQRelay :17710) --127.0.0.1:17709--> 通达信TQ服务

核心就一个接口:POST /tq?token=xxx,body {"method":"接口名","params":{...}},原样透传、原样返回。tqcenter 有的接口全能调,官方加接口零维护。

对 QMT 用户最有价值的三点

1. 透明端口模式——旧代码零改动。 额外开一个无 token 纯透传端口(17711),客户端:

netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=17709 connectaddress=<机器A_IP> connectport=17711

之后写死 127.0.0.1:17709 的旧 tqcenter.py 代码一行不改,直接跨机跑。

2. 公式筹码函数走通达信原生计算。 WINNER/COST 这类筹码函数别在客户端重算——换手率衰减+三角分布的纯 Python 复现,对着通达信图逐日核对,信号段起点当日吻合度只有约 73%。通达信精确算法私有,近似永远差一口气。经转发器调 formula_process_mul_zb 由通达信引擎原生算,与图上 100% 一致。喂入窗口影响结果:要与图一致就 start_time=19900101 喂全历史 + return_count 取末尾 N 根;阈值判断用 xsflag=3 以上精度(公式输出默认四舍五入)。

3. 平台限制的绕行经验(国信 iQuant 实测)。 策略禁读写文件 → 配置/信号全走 HTTP;策略进程读不到 setx 的用户环境变量 → token 用常量手工粘贴;内置 Python 的 urllib 可用;#coding:gbk 文件字节必须真是 GBK(含中文公式名的文件要转 GBK 保存)。

QMT 策略内调用模板

#coding:gbk
import json, os

SIGNAL_HOST = '192.168.1.100'   # 通达信机器的局域网IP
TOKEN = os.environ.get('SIGNAL_TOKEN', '') or '粘贴token'
URL_TQ = 'http://%s:17710/tq?token=%s' % (SIGNAL_HOST, TOKEN)

def tq(method, params, timeout=300):
    import urllib.request
    req = urllib.request.Request(URL_TQ,
        data=json.dumps({'method': method, 'params': params},
                        ensure_ascii=False).encode('utf-8'),
        headers={'Content-Type': 'application/json; charset=utf-8'}, method='POST')
    with urllib.request.urlopen(req, timeout=timeout) as r:
        return json.loads(r.read().decode('utf-8', 'replace'))

def handlebar(ContextInfo):
    resp = tq('get_market_data', {'stock_list': ['518880.SH'], 'period': '1d',
               'start_time': '20260901', 'end_time': '20260924',
               'dividend_type': 'front', 'fill_data': False})
    d = resp['result']['Value']['518880.SH']
    print('bars:', len(d['Date']), 'close:', d['Close'][-1])

def init(ContextInfo):
    handlebar(ContextInfo)   # 调试模式干跑一次

实盘结构建议:ContextInfo.run_time 做收盘前定时任务;下单 passorder(23, 1101, ACCOUNT, code, 5, -1, vol, '策略名', 2, '备注', ContextInfo);持仓用 get_trade_detail_data 的 m_nCanUseVolume 尊重 T+1;失败安全——转发失败/超时/日期不符,当日不动仓位并落日志。

常用 TQ 接口速查(全部实测)

method 要点
get_market_data K线;窗口>约2年会分页(KlinePaged/has_more),按年份分窗拼接
formula_process_mul_zb 公式引擎;筹码原生计算;复权参数是整数0/1(get_market_data 是字符串,别搞混)
get_market_snapshot 实时快照 Now/LastClose/Volume
get_more_info 换手/流通市值/涨跌停价
get_gb_info_by_date 历史逐日股本 → 精确换手率
get_zdt_data 涨跌停状态
query_stock_positions / order_stock 持仓/下单(需通达信端登录资金账户;转发器 allow_trade 可整体关闭)

更多接口与踩坑清单(品种数据要先在通达信手动打开下载、全局锁串行化等)见 GitHub README。

安全说明

主端口 token 鉴权(token 走 URL 参数,局域网要可信);透明端口无 token,务必配 allow_ips 白名单、不需要交易就关 allow_trade;全部请求按日期落日志(来源 IP/方法/耗时)。


工具已开源(MIT):GitHub 搜 foxneet/tq-relay,553 行单文件 + 232 行自测脚本,PyInstaller 可打包 exe。我把量化工具链的实测笔记整理在公众号「晋盈投资」(不荐股、不承诺收益)。

欢迎讨论:你们的 QMT 策略现在怎么拿外部数据?

风险提示:本文为工程工具分享,不构成投资建议;涉及交易接口请自行确认平台合规要求。

评论2

信仰_b6fKy
发表于 2026-10-18 23:10:31 | 显示全部楼层
大qmt要禁了啊
foxneet楼主
发表于 2026-10-19 10:16:02 | 显示全部楼层
已有券商在大QMT 测试端实测出网络封禁和文件只写不读,但截至现在多数券商尚未发正式通知,10.23 全面落地与否仍未知。我的做法是不等结论先跑退路——通达信TQ 外部 Python 模式不受这个限制,我已经从模拟到实盘全链路验证完(真实账户 9 笔测试单闭环),这两天会发搬家实测文。断不断,两手准备都不亏。感兴趣可以关注公众号「晋盈投资」看后续实测。
客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表