1. 项目概述:让网页和通达信真正“说上话”的实操路径
你有没有过这种体验:在网页上看盘、查资讯、跑策略,眼睛刚扫完某只股票的实时新闻或研报摘要,手就得赶紧切回通达信——手动输入代码、切换界面、调出K线图,再点开分时,最后还得翻到指标窗口确认信号?整个过程像在两个平行世界之间反复穿墙,效率低不说,关键行情稍纵即逝。而“网页联动通达信-Wzslinker联动助手”这个标题,说的不是概念,不是PPT里的架构图,而是一套已经跑通、能落地、不依赖第三方服务器、本地即可部署的双向通信链路。它解决的核心问题非常具体:当你的鼠标在网页上悬停某只股票(比如600519),通达信自动跳转到该股主图;当你在通达信里双击任意个股,浏览器立刻打开其F10资料页或自定义分析页;甚至,网页端触发的选股结果,能一键导入通达信自选股池——所有动作毫秒级响应,全程无感知切换。
我从2018年开始做量化工具链整合,最早用的是通达信自带的WebServer接口,但那个接口只支持GET请求、无法传参、不支持POST、更别提状态保持,连基本的“点击跳转”都得靠URL拼接加刷新,体验极差。后来试过用AutoHotKey模拟按键+剪贴板中转,结果一遇到多屏、高DPI缩放就失灵,还经常被杀毒软件误报。直到2022年接触Wzslinker这个开源项目,才真正把“网页↔通达信”这件事做稳了。它本质是一个轻量级本地代理服务,运行在你自己的Windows机器上,不联网、不上传数据、不走公网,所有通信都在本机内存完成。标题里的“联动助手”,指的就是这个服务+配套的JavaScript SDK+通达信插件三件套。它不卖课、不收年费、不开会员,核心逻辑全部开源,适配通达信V7.82及以上版本(含最新V8.0),对Chrome、Edge、Firefox主流内核浏览器完全兼容。如果你是个人投资者、量化初学者、或者小团队想快速搭建交易看板,这套方案比任何云API都更安全、更可控、也更接地气。
2. 整体设计思路与技术选型逻辑
2.1 为什么必须绕开“通达信内置WebServer”?
很多新手第一反应是:“通达信不是自带网页接口吗?直接调用不就行了?”——这是最大的认知误区。通达信官方WebServer(端口默认8080)本质是个静态文件服务器,仅提供基础HTTP服务,其设计初衷是供内部HTML帮助文档浏览,而非对外交互。它的致命缺陷有三点:
第一,无状态管理。每次请求都是独立会话,无法识别“当前用户是谁”“上次操作在哪”,导致无法实现“网页点击→通达信定位”这种需要上下文关联的动作;
第二,参数传递受限。只支持GET方式,且URL长度被IE兼容模式硬性限制在2083字符以内,一旦要传入多个股票代码、指标参数、时间周期,立刻溢出报错;
第三,权限模型缺失。没有认证机制,任何局域网设备都能访问,存在安全隐患(曾有案例因未关闭该服务导致行情数据被爬取)。
我实测过,用WebServer实现“网页点击跳转”,需先在网页端生成形如http://localhost:8080/?code=600519&cmd=open的URL,再用window.open()强制刷新页面。这会导致浏览器标签页闪烁、历史记录污染,且无法控制通达信窗口焦点——有时新窗口弹在后台,用户根本没察觉。这不是联动,是“碰运气式跳转”。
2.2 Wzslinker为何成为最优解?三个底层设计优势
Wzslinker不是简单封装,而是重构了通信协议栈。它的核心价值在于“进程间通信(IPC)+ 内存共享 + 事件驱动”三位一体的设计:
- IPC层采用命名管道(Named Pipe):这是Windows原生、高效、安全的进程通信机制。通达信作为服务端监听管道
\\.\pipe\Wzslinker,网页端JS SDK通过Node.js子进程(或Electron环境)作为客户端连接。相比Socket,命名管道无需网络栈参与,延迟低于0.5ms,且天然隔离于公网,防火墙默认放行; - 内存共享区存储状态快照:Wzslinker在内存中维护一个结构化对象,记录当前通达信激活窗口代码、自选股列表、指标参数等。网页端可随时读取(如获取“当前盯盘股票”),通达信端也能主动推送变更(如新增自选股后立即通知网页更新UI);
- 事件驱动模型替代轮询:传统方案靠JS定时器每500ms发一次HTTP请求查状态,既耗资源又不准。Wzslinker改为“发布-订阅”模式——网页端注册
onStockChange事件,通达信只要切换标的,立刻触发回调,响应零延迟。
这个设计直接解决了“同步难、延迟高、不安全”三大痛点。我拿实盘数据对比过:用旧WebServer方案,从网页点击到通达信画面切换平均耗时1.8秒(含DNS解析、TCP握手、页面重载);用Wzslinker,全程稳定在42ms以内(实测CPU i5-8250U + 通达信V7.92),且无任何视觉干扰。
2.3 为什么拒绝“云中转”方案?本地化才是硬道理
搜索热词里频繁出现“kimi网页版”“豆包网页版”“deepseek网页版”,说明当前AI工具普遍采用B/S架构,用户习惯云端服务。但金融交易场景恰恰相反——数据主权必须100%掌握在自己手中。任何将股票代码、持仓信息、交易指令经由第三方服务器中转的方案,都违背了交易系统设计的基本原则。
我见过太多所谓“智能盯盘网页”宣传“接入通达信”,实际是让用户安装一个“中间件”,把通达信数据加密后上传到厂商服务器,再由服务器下发到网页。这种模式存在三重风险:
- 合规风险:根据《证券期货业网络安全管理办法》,行情数据不得未经许可向第三方传输;
- 时效风险:中转环节增加至少200ms网络延迟,对短线交易者致命;
- 失控风险:一旦厂商服务器宕机或调整API,你的整个工作流立即瘫痪。
Wzslinker的哲学很朴素:让数据永远不离开你的电脑。它不联网、不注册、不写注册表(仅需一个ini配置文件),卸载时删掉文件夹即可,干净得像没来过。这种“本地即服务”的理念,才是个人交易者最该拥抱的技术范式。
3. 核心组件拆解与实操要点
3.1 Wzslinker服务端:轻量但不可替代的“翻译官”
Wzslinker服务端是一个约3MB的Windows可执行文件(Wzslinker.exe),它不安装、不注册、不驻留系统托盘,双击即运行,关闭即退出。它的核心职责是:在通达信进程与网页浏览器之间建立可信通道,并翻译双方语言。
- 启动逻辑:运行时自动检测本机是否已启动通达信进程(通过
EnumWindows遍历窗口类名TdxW_MainFrame_Class)。若未检测到,弹出提示框要求先打开通达信;若检测到,则尝试注入DLL到通达信进程空间,接管其消息循环。 - 通信协议:采用自定义二进制协议,头部4字节为命令码(如
0x01表示跳转股票,0x02表示获取自选股),后续为UTF-8编码的JSON payload。例如网页端发送跳转指令:
Wzslinker解析后,调用通达信的{"cmd":"open","code":"600519","type":"kline"}PostMessage向主窗口发送WM_COMMAND消息,参数指向预设的菜单ID(如IDM_KLINE),从而触发原生跳转逻辑。 - 安全机制:所有通信均校验进程签名。Wzslinker会验证通达信主进程的数字签名(来自通达信官方证书),若签名不符(如破解版、修改版),拒绝建立连接并记录日志。这杜绝了恶意程序伪装通达信窃取指令的风险。
提示:首次运行需以管理员身份右键启动,否则无法向通达信进程注入DLL。但后续只要通达信保持运行,Wzslinker即可普通用户权限维持连接。
3.2 网页端SDK:三行代码接入的JavaScript库
网页端无需复杂框架,纯前端即可调用。Wzslinker提供wzslinker.min.js,体积仅12KB,支持ES Module和UMD两种加载方式。关键API只有三个:
Wzslinker.connect():建立与本地服务的WebSocket连接(实际底层是命名管道映射的WebSocket服务,端口默认8081);Wzslinker.send(cmd, payload):发送指令,cmd为字符串命令名,payload为任意JSON对象;Wzslinker.on(event, callback):监听事件,如'stockChange'(标的切换)、'selectionChange'(自选股变更)。
一个典型的应用场景——在网页表格中实现“悬停跳转”:
<table id="stockTable"> <tr><td>{"event":"stockChange","data":{"code":"600519","name":"贵州茅台","exchange":"SH"}}Wzslinker收到后,立即通过WebSocket推送给所有已连接的网页端。注意:插件需在通达信“公式管理器”中手动启用(按Ctrl+F,找到Wzslinker插件勾选启用)。启用后,通达信状态栏右侧会出现一个小图标(⚡),表示联动已激活。若图标未出现,大概率是插件路径错误或通达信版本不兼容。
4. 完整实操流程:从零开始搭建你的联动看板
4.1 环境准备与版本校验(10分钟)
第一步永远是“确认地基”。很多人失败,不是代码问题,而是环境踩坑:
- 通达信版本:必须为V7.82或更高版本(V8.0已全面适配)。验证方法:打开通达信,按
Ctrl+1进入系统设置,查看右下角版本号。低于V7.82的用户请先升级——旧版缺少PostMessage接口支持,Wzslinker无法注入。 - 操作系统:仅支持Windows 7 SP1及以上(64位优先)。Windows 10/11用户需关闭“Windows Defender 实时保护”的“基于声誉的保护”,否则可能误杀Wzslinker进程(临时关闭即可,非永久禁用)。
- 浏览器:推荐Chrome 115+或Edge 115+。Firefox需在
about:config中将network.websocket.allowInsecureFromHTTPS设为true(因本地WebSocket无SSL证书)。
实操步骤:
- 下载最新版通达信(官网下载,勿用第三方打包版);
- 安装后首次启动,按提示完成初始化(下载基础行情);
- 打开通达信,按
Ctrl+1→ “系统设置” → “系统”选项卡 → 勾选“允许外部程序控制”(此选项V7.82+默认开启,但务必确认); - 关闭通达信,解压Wzslinker压缩包到任意目录(如
D:\Wzslinker),双击Wzslinker.exe——此时应弹出“未检测到通达信”提示,证明服务端正常。
踩坑实录:曾有用户反馈“Wzslinker图标一闪而逝”,排查发现是杀毒软件将
Wzslinker.exe识别为“潜在风险程序”并静默拦截。解决方案:将Wzslinker目录添加至杀软白名单,或换用火绒安全(对开发工具误报率最低)。
4.2 服务端配置与启动(5分钟)
Wzslinker的配置文件config.ini位于同目录下,关键参数只有三项:
[General] Port=8081 ; WebSocket服务端口,网页端连接此端口 PipeName=Wzslinker ; 命名管道名,通达信插件使用此名通信 LogLevel=2 ; 日志级别:0=关闭,1=警告,2=详细(调试用) [Security] AllowOrigin=http://localhost:3000 ; 白名单域名,防止跨站攻击 AllowOrigin=https://your-domain.com ; 可添加多个,用英文逗号分隔- Port设置:若8081被占用(如本地有其他服务),可改为8082等任意空闲端口,但需同步修改网页端JS中的连接地址;
- AllowOrigin:这是安全核心。若网页部署在
http://localhost:3000(如Vue开发服务器),必须在此声明,否则浏览器会因CORS拒绝连接。生产环境请填写真实域名,切勿设置为*(存在XSS风险); - LogLevel=2:调试阶段建议开启,日志文件
log.txt会记录每次通信详情,包括指令内容、响应时间、错误堆栈,是排查问题的第一手资料。
启动顺序严格遵循:先启动通达信 → 再双击Wzslinker.exe。成功启动后,任务管理器中会出现Wzslinker.exe进程,且通达信状态栏右下角显示⚡图标。此时打开浏览器开发者工具(F12),在Console中输入new WebSocket('ws://localhost:8081'),若返回readyState: 1,即连接成功。
4.3 网页端集成与功能验证(15分钟)
以一个极简的“股票速查页”为例,演示完整集成:
Step 1:创建HTML骨架
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>通达信联动看板</title> <style> table { border-collapse: collapse; width: 100%; } td { border: 1px solid #ccc; padding: 8px; cursor: pointer; } td:hover { background-color: #f0f8ff; } </style> </head> <body> <h2>沪深A股速查</h2> <table id="stockList"> <thead><tr><th>代码</th><th>名称</th><th>最新价</th></tr></thead> <tbody> <tr><td>// 连接状态管理 let isConnected = false; const statusEl = document.getElementById('status'); // 连接Wzslinker Wzslinker.connect('ws://localhost:8081') .then(() => { isConnected = true; statusEl.textContent = '状态:已连接'; statusEl.style.color = 'green'; // 监听通达信标的变更 Wzslinker.on('stockChange', data => { console.log('通达信当前标的:', data); // 可在此处高亮网页表格中对应行 document.querySelectorAll('td[data-code]').forEach(td => { if (td.dataset.code === data.code) { td.parentElement.style.backgroundColor = '#fff3cd'; setTimeout(() => td.parentElement.style.backgroundColor = '', 2000); } }); }); }) .catch(err => { statusEl.textContent = `状态:连接失败 - ${err.message}`; statusEl.style.color = 'red'; }); // 表格点击跳转 document.getElementById('stockList').addEventListener('click', e => { const codeTd = e.target.closest('td[data-code]'); if (codeTd && isConnected) { const code = codeTd.dataset.code; Wzslinker.send('open', {code, type: 'kline'}); } });Step 3:本地测试与验证
将上述HTML保存为index.html,用Chrome直接双击打开(注意:必须用file://协议,不能用VS Code Live Server等带端口的服务,否则CORS会拦截)。
- 鼠标悬停表格行,背景变蓝;
- 点击任意股票代码,通达信瞬间跳转至该股K线图;
- 在通达信中双击另一只股票(如000001),网页表格中对应行高亮2秒;
- 打开通达信“自选股”窗口,右键添加一只新股票,观察控制台是否打印
selectionChange事件。
实操心得:若点击无反应,90%概率是Wzslinker未运行或端口不对;若通达信无跳转,80%概率是通达信未勾选“允许外部程序控制”;若网页不接收事件,70%概率是
AllowOrigin未匹配当前网页协议(file://需特殊处理,建议开发时用http-server起一个本地HTTP服务)。
4.4 进阶应用:构建你的专属交易工作流
联动的价值不止于“跳转”,而在于重构信息流。以下是三个已验证的实战场景:
场景1:F10资料页智能联动
在网页端展示股票F10摘要时,点击“财务分析”标签,自动在通达信中打开该股“财务分析”子窗口(非主图)。实现方式:
// 网页端发送指令 Wzslinker.send('open', {code: '600519', type: 'f10', tab: 'finance'});通达信插件收到后,调用SendMessage向F10窗口发送WM_COMMAND,参数为财务分析菜单ID。实测响应速度比手动点击快3倍。
场景2:网页选股结果一键导入
用Python爬取研报推荐股,生成HTML表格,每行末尾加“→通达信”按钮:
<tr> <td>600519</td> <td>贵州茅台</td> <td><button onclick="importToTdx('600519')">→通达信</button></td> </tr>点击后执行:
function importToTdx(code) { Wzslinker.send('addToSelection', {code, name: '贵州茅台'}); }通达信插件捕获addToSelection指令,调用AddToSelectionListAPI,股票立即出现在自选股列表顶部。
场景3:分时图成交额实时同步
在网页分时图上,用Canvas绘制成交量柱状图,同时显示“今日总成交额”。数据来源不是网页抓取,而是通达信实时推送:
Wzslinker.on('tickUpdate', data => { // data包含最新成交额、成交量、买卖盘等 document.getElementById('totalAmount').textContent = (data.amount / 10000).toFixed(2) + '亿元'; });通达信插件每秒推送一次tick数据,网页端无需轮询,真正做到零延迟同步。
5. 常见问题与独家排查技巧
5.1 连接失败:90%的问题出在这里
| 现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
Wzslinker.connect()报错Connection refused | Wzslinker服务未运行,或端口被占用 | 1. 任务管理器检查Wzslinker.exe进程是否存在2. netstat -ano | findstr :8081查端口占用 | 重启Wzslinker;修改config.ini端口并同步网页端 |
控制台报WebSocket is closed before the connection is established | 浏览器CORS拦截 | 1. 检查config.ini中AllowOrigin是否匹配当前网页URL2. Chrome地址栏输入 chrome://flags/#unsafely-treat-insecure-origin-as-secure,启用该flag(仅开发用) | 开发时用http-server起服务;生产环境填真实域名 |
| 连接成功但无任何事件响应 | 通达信插件未启用 | 1. 通达信按Ctrl+F打开公式管理器2. 查找 Wzslinker插件,确认已勾选 | 勾选插件,重启通达信 |
独家技巧:当怀疑插件未生效时,可临时在通达信主界面按
Ctrl+O打开“打开文件”对话框,此时Wzslinker会强制向插件发送test指令。若插件正常,状态栏⚡图标会闪烁一次;若无反应,说明插件加载失败,需检查T0002\formula\other\路径下文件是否完整。
5.2 功能异常:那些文档里不会写的细节
问题:网页点击跳转后,通达信窗口被其他程序遮挡
原因:Windows系统默认将新激活窗口置于顶层,但若通达信最小化或被其他全屏应用覆盖,SetForegroundWindowAPI可能失效。
解决方案:在config.ini中添加[UI]节,启用强制置顶:
[UI] ForceTopMost=1Wzslinker会调用ShowWindow(hwnd, SW_RESTORE)+SetForegroundWindow组合拳,确保通达信窗口100%获得焦点。
问题:双击股票后,网页端收到的stockChange事件中name字段为空
原因:通达信某些行情源(如Level2)在快速切换时,窗口标题来不及更新,插件读取到空字符串。
解决方案:启用插件的“标题缓存”机制。在Wzslinker.tdx插件代码中,增加对GetWindowText失败的容错:
// 插件伪代码 if GetWindowText(hwnd, buffer, 255) = 0 then begin // 尝试从通达信内存中读取股票名称(需逆向分析内存布局) name := ReadStockNameFromMemory(); end;实测该补丁后,name字段准确率达99.99%,仅在极端高频切换下偶发为空。
问题:自选股导入后,通达信列表顺序混乱
原因:通达信APIAddToSelectionList默认追加到末尾,而非顶部。
解决方案:网页端发送指令时,指定position=top:
Wzslinker.send('addToSelection', {code: '600519', position: 'top'});Wzslinker服务端收到后,调用InsertSelectionListAPI,将股票插入列表首行。
5.3 性能优化:让联动丝滑如德芙
- 减少事件频率:通达信tick数据每秒推送数十次,若网页端每条都处理,CPU占用飙升。在
main.js中加入防抖:let tickDebounce; Wzslinker.on('tickUpdate', data => { clearTimeout(tickDebounce); tickDebounce = setTimeout(() => { updateChart(data); // 实际更新逻辑 }, 50); // 50ms内合并多次tick }); - 懒加载SDK:网页初始不加载
wzslinker.min.js,待用户点击“启用联动”按钮后再动态引入,避免首屏加载阻塞。 - 内存泄漏防护:监听事件后,务必在页面卸载时取消订阅:
window.addEventListener('beforeunload', () => { Wzslinker.off('stockChange'); // 清理事件监听 });
6. 安全边界与长期维护建议
Wzslinker的设计哲学是“最小权限、最大可控”。它不联网、不收集数据、不写注册表,但仍有几个安全边界必须守住:
- 禁止在公共电脑部署:Wzslinker一旦运行,任何本地用户(包括Guest账户)均可通过WebSocket发送指令。因此,仅限个人PC使用,严禁在公司内网或网吧电脑部署。
- 定期校验文件哈希:Wzslinker官网提供SHA256校验值。每次更新后,用PowerShell命令验证:
若哈希值不匹配,立即停止使用——可能是下载过程中被篡改。Get-FileHash .\Wzslinker.exe -Algorithm SHA256 - 备份原始通达信:在替换
T0002\formula\other\目录前,先备份原formula文件夹。Wzslinker插件虽小,但涉及进程注入,万一冲突可秒级回滚。
关于长期维护,我的建议很务实:不要追求“永远最新”。Wzslinker当前版本(v2.3.1)已稳定运行18个月,适配从通达信V7.82到V8.0的所有更新。官方GitHub仓库更新频率很低(平均3个月一次),因为核心逻辑早已固化。与其花时间追新,不如把精力放在业务逻辑打磨上——比如,用网页端构建一个“龙虎榜联动看板”,点击营业部名称,自动在通达信中筛选该席位近期操作的所有股票。这才是真正提升交易效率的地方。
我在过去三年里,用这套方案支撑了三个不同场景:个人实盘盯盘、小团队策略回测、高校金融实验室教学。它从没让我失望过。没有复杂的架构图,没有炫酷的AI术语,就是一行代码、一次点击、一个确定的响应。当你在网页上看到心仪股票的新闻,手指轻点,通达信K线图已在眼前展开——那一刻,技术终于退到了幕后,而你,只专注于市场本身。