Skip to main content
L

dsh-etf-monitor

lacrimosa-da/dsh-etf-monitor

Side panel for DeepSeek Harness that tracks a 15-ETF national-team basket intraday from Eastmoney and Tencent quotes (pure Node, zero dependencies): capital flow, minute-level support pulses and a composite read.

Install

dsh plugin --profile web add github:lacrimosa-da/dsh-etf-monitor

README

dsh-etf-monitor

DeepSeek Harness 侧边栏面板:盯住国家队最可能出手的 15 只宽基 / 行业 ETF, 盘中每 60 秒重算量比、护盘脉冲、溢价率与超额。 纯 Node 直取公开行情,零第三方依赖、不读本地文件、不需要任何 API Key。

license node dsh-plugin


它回答一个问题

盘中想知道「国家队/汇金是不是在买宽基 ETF」,看指数没用——指数会被权重股掩盖。 真正有信息量的是 ETF 自己的成交数据:成交额有没有异常放大、是不是脉冲式护盘、 有没有一级申购资金顶着溢价买。

面板把这三件事做成一屏读数,交易时段内自动重算。

你原本要问面板给的读数
今天量放大了吗?510300 量比推定 + 近 8 日成交额柱
是护盘还是换手?护盘脉冲次数与明细(单分钟 ≥ 当日均量 4 倍)
资金是在承接还是在出?溢价率(对 IOPV)+ 主力净额
宽基和行业谁在动?15 只篮子 + 行业/概念涨跌前列 + ETF 主力净流入流出 TOP

装

入口怎么做说明
插件市场DSH 设置里的「插件市场」搜 dsh-etf-monitor收录 PR 合并后可用,见下方「上架状态」
GitHub 源让我调 plugin_manager → install_bundle,target 填仓库地址按 commit 锁定,不受 npm 影响
本地 tgznpm pack 出 dsh-etf-monitor-0.2.0.tgz,把路径交给 install_bundle快照安装,升级要重装
源码目录target 填 link:C:/path/to/plugins/dsh-etf-monitor改代码即时生效,开发时用

宿主半侧热装配,装完通常不用重启;客户端 bundle 是页面加载时取的,装完/升级完要刷新一次页面。

上架状态

  • 已开源:https://github.com/lacrimosa-da/dsh-etf-monitor(MIT,dsh-plugin topic)
  • 已向 awesome-dsh-plugin 提交收录 PR #12451,合并后 CI 重建目录,市场即可搜到
  • 未发布 npm:市场安装走 GitHub 源,不发 npm 也能装;发 npm 只影响市场里的下载量统计

截图

整页看板(2026-11-05 收盘后实拍,点开放大):

国家队 ETF 面板全貌

510300 分时结构 —— 柱=半小时成交额,线=期末价格,虚线=昨收。柱高逐段衰减 + 价格走平或下移 = 承接力递减:

510300 分时结构(30 分钟桶)

近 8 日成交额 + 护盘脉冲 + 涨跌家数 + 指数 / 海外市场 —— 深色柱是今日,成交额放大到均量 2 倍以上通常对应集中申购:

510300 近 8 日成交额与市场宽度

侧边栏入口(图标名「国家队ETF」,排在「灵枢/上下文」与「梦境」之间):

侧边栏入口

面板长什么样

左侧图标栏(sidebar.panellist,order 30,排在「灵枢/上下文」与「梦境」之间), 图标名 国家队ETF。点开是 main 槽位的整页看板,四个区块:

  1. 四项判读 — 510300 量比推定 / 护盘脉冲次数 / 溢价率 / 涨跌家数
  2. 15 只 ETF 篮子 — 现价、涨跌幅、成交额、量比推定、主力净额、超额、溢价率
  3. 510300 分时结构 — 半小时一桶,成交额柱 + 价位点,一眼看出是否脉冲式护盘
  4. 市场宽度 — 主要指数 / 海外市场 / 行业与概念涨跌前列 / 全市场 ETF 主力净流入流出 TOP

读数怎么读

读数定义怎么判断
量比推定当前成交额 ÷ 按已过交易分钟线性外推的全天成交额> 1.5× 才算真放量;< 0.7× 是缩量
护盘脉冲单分钟成交额 ≥ 当日已过均量的 4 倍连续出现 = 主动买;只出现一两次且价格被吞 = 试盘
溢价率ETF 市价相对 IOPV持续正溢价 = 有申购资金在顶;负溢价 = 折价没人接
超额ETF 涨跌幅 − 跟踪指数涨跌幅只看同一只的时间序列,不要跨标的横比

最有用的一条组合判据:成交额放大 且 溢价率转正 且 分时桶价格重心上移 ——三条同时成立才是真护盘;只有第一条放大,往往只是「换手不是承接」。

真实数据样例

2026-11-05 收盘的篮子(插件实际返回,未做任何修饰):

代码名称现价涨跌成交额超额溢价分组
510300沪深300ETF4.195+0.48%75.23 亿+0.19%+0.04%宽基·沪深300
510330300ETF华夏4.364+0.23%11.23 亿-0.06%-0.16%宽基·沪深300
159919300ETF嘉实4.373+0.21%14.60 亿-0.08%-0.04%宽基·沪深300
510310300ETF易方达4.072+0.22%14.18 亿-0.07%+0.02%宽基·沪深300
510050上证50ETF2.930+0.24%19.91 亿+0.15%-0.08%宽基·上证50
510500中证500ETF6.784+1.85%55.48 亿+0.05%+0.16%宽基·中证500
512100中证1000ETF2.711+2.22%62.26 亿+0.10%+0.06%宽基·中证1000
1598451000ETF2.775+1.98%36.24 亿-0.14%+0.01%宽基·中证1000
588000科创50ETF1.358+1.34%189.11 亿-0.34%-0.34%宽基·科创50
588080科创板501.317+1.15%46.60 亿-0.53%-0.09%宽基·科创50
159915创业板ETF2.584+0.90%163.95 亿+0.03%+0.05%宽基·创业板
512880证券ETF1.022+0.00%12.42 亿+0.19%+0.00%行业·券商
512480半导体ETF0.799+3.50%19.56 亿-0.17%-0.08%行业·半导体
588200科创芯片ETF0.863+0.82%44.70 亿-0.83%-0.15%行业·半导体
512010医药ETF0.398+2.31%5.35 亿+0.15%-0.03%行业·医药

同日 510300 的分时桶(半小时一桶)与护盘脉冲:

09:30  16.32 亿 @ 4.184      脉冲 09:31  3.85 亿 @ 4.155   (12.2× 均量)
10:00  12.82 亿 @ 4.208      近 8 日成交额:58.5 / 45.6 / 89.1 / 86.1 / 120.7 / 190.1 / 125.6 / 75.2 亿
10:30   9.54 亿 @ 4.196

安全与隐私

  • 零第三方依赖:只用 Node ≥ 18.17 内置的 fetch / TextDecoder / AbortSignal.timeout
  • 不读本地任何文件、不写任何文件
  • 不需要 API Key、不需要账号
  • 只对 push2.eastmoney.com、qt.gtimg.cn 等公开行情接口发 GET,不携带任何个人数据
  • 进程内 45 秒缓存,避免重复打上游

兼容性

项要求
DSH支持 dsh.bundle.patch 的版本(本包同时声明 dsh.bundle 与 dsh.client)
Node≥ 18.17(宿主自带 Node 即可)
平台web 客户端(dsh.client.platform: web)

接口

路径说明
GET /dsh-etf-monitor/api取快照,45 秒进程内缓存
GET /dsh-etf-monitor/api?fresh=1强制重算
GET /dsh-etf-monitor/health引擎、版本、最近一轮耗时、最近一次失败原因
GET /dsh-etf-monitor/debug逐接口探活(排障用)

也可以单独 import 数据层,不需要 DSH 运行时:

import { takeSnapshot, summarize } from 'dsh-etf-monitor/snapshot'

const snap = await takeSnapshot()
console.log(summarize(snap))   // 状态=交易中 已过分钟=190 510300=4.18 (+2.2%) 成交额=113.0亿

结构

package.json          dsh.bundle.patch + dsh.client 两处声明
cordis.patch.yml      往配置树插入 id=dsh-etf-monitor 一行
lib/index.js          宿主半侧:注册 /dsh-etf-monitor 前缀路由 + 45 秒缓存 + 串行化
lib/snapshot.js       纯 Node 数据层:直取东财/腾讯,产出与前端约定的 snap 对象
client.js             浏览器半侧:main + sidebar.panellist 两个槽位
test/test_client.cjs  不开浏览器也能把 React 树跑一遍的冒烟测试

口径局限(页脚也写了)

  1. 量比是推定值:用「已过交易分钟线性外推」估全天,开盘初期波动大,只看方向不看绝对值。
  2. 超额含昨日溢价残留:ETF 涨跌幅 − 跟踪指数涨跌幅 是代理指标,不可跨标的横比,只看同一只的时间序列。
  3. 溢价率取腾讯 IOPV 字段(qt.gtimg.cn 第 78 项)。东财的 f71 是均价不是 IOPV,早期版本在这里算错过。

数据源踩过的坑(改代码前先看)

  1. 东财 ulist.np 并发十几条会整批返回空(HTTP 200 但 data.diff 缺失)。现按 20 个一批切块,缺失的再逐个单发补齐,最多补两轮。
  2. 涨停池的总数在 data.tc,不是 data.total;不带 dpt=wz.ztzt 会返回 rc:102。
  3. 日线接口必须带 end=20500101,否则 rc:102。
  4. 涨跌家数只能走 ulist.np 的 f104/f105/f106;stock/get 对指数返回 "-"。
  5. ETF 跟踪指数的 secid 必须和 ETF 自己的 secid 一起请求,否则超额列全空。
  6. 腾讯接口返回 GBK,用 new TextDecoder('gbk') 解,不要引 iconv。

改完怎么生效

  • 改 client.js:刷新一次页面(客户端 bundle 是页面加载时取的,光切面板不重读)。
  • 改 lib/index.js / lib/snapshot.js:宿主半侧热装配;不生效就把插件 disable 再 enable 一次。

测试

# 仓库自带一份真实快照当 fixture
node test/test_client.cjs test/fixture.json

# 想用最新数据:从正在跑的插件里取一份
curl -s http://127.0.0.1:<port>/dsh-etf-monitor/api -o fixture.json
node test/test_client.cjs fixture.json

测试做的事:用假的 window.__ModuleLoader__ 接住自注册描述符,再用假的 React 把 main 与 sidebar.panellist 两个槽位的 React 树整棵展开执行一遍(约 1440 个节点), 断言关键读数真的落到了文案里。不开浏览器也能抓到 undefined.toFixed 这类运行时错误。

FAQ

非交易时段显示什么? 显示 盘前 / 已收盘,数据停在最后一个交易日的收盘值,不会报错也不会装成实时。

数据延迟多少? 东财与腾讯的免费行情普遍有 1–3 秒延迟,面板 60 秒刷新一次,不是逐笔。

为什么不直接读指数? 指数是加权结果,权重股的涨跌会盖住 ETF 自己的资金行为;护盘往往只体现在宽基 ETF 的成交结构和溢价上。

能加自己的 ETF 吗? 能,lib/snapshot.js 里的 ETF_LIST 加一条即可,注意异步补齐规则见「数据源踩过的坑」。

许可

MIT。仅供个人盘中观测,不构成投资建议。

Related plugins