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 策略现在怎么拿外部数据?
风险提示:本文为工程工具分享,不构成投资建议;涉及交易接口请自行确认平台合规要求。