ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

给通达信TQ做一个局域网HTTP网关(大QMT实测通过)

给通达信TQ做一个局域网HTTP网关(大QMT实测通过) 给通达信TQ做一个局域网HTTP网关大QMT实测通过一、问题定义同时使用通达信TQ 量化服务和大 QMT 的团队常会遇到一个部署难题TQ 服务tqcenter只监听127.0.0.1:17709通达信与大 QMT 不同机时QMT 策略无法访问 TQ 的任何接口。更麻烦的是平台层限制国信 iQuant 平台实测2026-09策略禁止读写外部文件——共享目录传信号的路被堵死MiniQMT 接口停用——跨进程老通道关闭策略进程读不到 setx 设置的用户环境变量——配置下发也受限。唯一实测可用的进程间通道是 HTTPQMT 内置 Python 的urllib可以正常发起请求。于是方案收敛为一句话在通达信所在机器部署一个 HTTP 网关把 TQ 服务透传到局域网。二、架构与协议设计机器B(大QMT/任意Python) --HTTP POST-- 机器A(TQRelay :17710) --127.0.0.1:17709-- 通达信TQ服务设计目标决定了形态不维护接口清单。TQ 官方接口有几十个且会新增逐个封装是维护噩梦。因此核心只有一个通用透传端点POST /tq?tokentoken Content-Type: application/json {method: TQ接口名, params: {参数字典}}服务端把 body 原样转发给本机 tqcenter把 TQ 原始 JSON 原样返回。错误分两层客户端都要检查转发层:{error:TQ forward failed: ...}// 连接/超时/包体问题TQ层:{id:1,result:{ErrorId:0,...}}// ErrorId ! 0 为业务失败关键实现点鉴权token 随机生成secrets模块经 URL 查询参数校验交易类接口可用allow_trade开关整体禁用。透明端口模式可选开启一个无 token 纯透传端口配合客户端netsh portproxy做本机回环映射让写死127.0.0.1:17709的存量 tqcenter.py 代码零改动跨机运行——这是迁移成本最低的兼容层设计。串行化TQ 调用加全局锁排队。tqcenter 并发能力有限与其赌并发不如显式串行化客户端按排队时间设超时。可观测按日期分文件日志来源 IP、方法、参数摘要、耗时错误独立落盘。零依赖纯 Python 标准库http.server urllib tkinter GUIPyInstaller 可打包单文件 exe。三、公式接口的关键发现筹码函数必须原生计算项目过程中最重要的技术结论WINNER/COST 等筹码函数不要在客户端用 Python 复现。经典复现方案是换手率衰减 三角分布。我实现后与通达信图上筹码逐日核对信号段起点当日吻合度仅约 73%。通达信的精确算法私有衰减模型与分布假设不可知近似复现永远差最后一口气。正确姿势是通过网关调 TQ 的formula_process_mul_zb由通达信引擎原生计算——结果与图上指标 100% 一致。配套实测经验喂入窗口影响筹码结果要与图一致start_time19900101喂全历史用return_count只取末尾 N 根公式输出默认四舍五入阈值判断如 高度控盘0必须xsflag3以上精度复权参数类型不统一get_market_data用字符串none/front/backformula 接口用整数0/1。四、客户端代码通用 Python 客户端任意机器importjsonimporturllib.requestimporturllib.parse RELAYhttp://192.168.1.100:17710TOKEN你的tokendeftq(method,params,timeout300):url%s/tq?token%s%(RELAY,urllib.parse.quote(TOKEN))requrllib.request.Request(url,datajson.dumps({method:method,params:params},ensure_asciiFalse).encode(utf-8),headers{Content-Type:application/json; charsetutf-8},methodPOST)withurllib.request.urlopen(req,timeouttimeout)asr:returnjson.loads(r.read().decode(utf-8,replace))# 取日线示例resptq(get_market_data,{stock_list:[159582.SZ],period:1d,start_time:20260901,end_time:20260924,dividend_type:front,fill_data:False})kresp[result][Value][159582.SZ]print(len(k[Date]),k[Date][-1],k[Close][-1])大QMT 策略内GBK 源码注意#coding:gbkimportjson,os SIGNAL_HOST192.168.1.100# 通达信机器局域网IPTOKENos.environ.get(SIGNAL_TOKEN,)or粘贴token# 环境变量在部分QMT平台不可靠URL_TQhttp://%s:17710/tq?token%s%(SIGNAL_HOST,TOKEN)deftq(method,params,timeout300):importurllib.request requrllib.request.Request(URL_TQ,datajson.dumps({method:method,params:params},ensure_asciiFalse).encode(utf-8),headers{Content-Type:application/json; charsetutf-8},methodPOST)withurllib.request.urlopen(req,timeouttimeout)asr:returnjson.loads(r.read().decode(utf-8,replace))defhandlebar(ContextInfo):resptq(get_market_data,{stock_list:[518880.SH],period:1d,start_time:20260901,end_time:20260924,dividend_type:front,fill_data:False})dresp[result][Value][518880.SH]print(bars:,len(d[Date]),close:,d[Close][-1])definit(ContextInfo):handlebar(ContextInfo)GBK 细节声明#coding:gbk的文件字节必须真是 GBK——含中文协议字符串如公式名的文件要转 GBK 保存纯 ASCII 文件无此问题。五、实测踩坑清单双机环境 16 项自测全过后总结#坑处理1K线窗口 约2年返回分页KlinePagedtrue按年份分窗拼接核对has_more2筹码函数 Python 复现仅 73% 吻合走 formula 接口原生计算3公式喂入窗口影响筹码结果start_time19900101return_count取末尾4复权参数类型K线字符串、公式整数封装客户端函数时统一转换5公式输出默认四舍五入阈值判断用xsflag36部分品种查无此码先在通达信手动打开该品种促发数据下载7TQ 调用不支持并行网关全局锁串行化批量任务预估排队8代码托管模式不支持转发的是接口调用不是整段策略六、部署# 机器A通达信机python tq_relay.py# GUI 模式自动生成配置与随机tokenpython tq_relay.py--serve# 无界面后台模式netsh advfirewall firewalladdrulenameTQRelaydirinactionallowprotocolTCPlocalport17710相关资源TQRelay 已开源MITGitHub 搜foxneet/tq-relay含 232 行双机自测脚本。作者的量化回测工具链数据接口横评、防坑三件套、仓位止损实测在foxneet/quant-toolbox。免责声明本文为工程工具分享不构成投资建议。工具含交易接口转发能力请确认符合所在平台合规要求后使用涉及实盘的资金安全自行负责。
返回列表