dsh-etf-monitor: A DSH sidebar panel to monitor National Team ETFs

Introduction

For A-share intraday monitoring, the common practice is to stare at indices. However, indices are weighted results; the rise and fall of weight stocks will mask the ETF’s own trading behavior. The question of whether the “National Team / Huijin is buying wide-base ETFs” is primarily contained in the trading structure of the ETF shares themselves: whether the transaction volume has anomalously amplified, whether it is a pulse-like support, or whether there is subscription capital absorbing the premium.

Below is an introduction to lacrimosa-da/dsh-etf-monitor, a DeepSeek Harness (DSH) sidebar panel that turns the three items above into a one-screen dashboard, recalculating every 60 seconds during trading hours. Pure Node direct access to public market interfaces, zero third-party dependencies, no reading of local files, no need for any API Key.

What is this

A client-side plugin maintained by lacrimosa-da, categorized as client-side, MIT licensed, tagged with dsh-plugin in the repo, not published on npm (will be searchable in the plugin market after PR merge). The core is the pure Node data layer lib/snapshot.js, which directly fetches public market data from Eastmoney push2.eastmoney.com and Tencent qt.gtimg.cn, producing a snap object, while the frontend is responsible for rendering.

It answers only one question: Does the intraday trading structure of wide-base / sector ETFs show active capital supporting the market?

Panel and Metrics

On the left icon bar sidebar.panellist, there is an icon called “National Team ETF” (order 30, placed between “Lingshu / Context” and “Dream”). Clicking it opens the full-page dashboard in the main slot, consisting of four blocks:

  1. Four Judgments — Estimated volume ratio for 510300 (CSI 300 ETF), number of support pulses, premium rate, up/down count
  2. 15 ETF Basket — Current price, change %, volume, estimated volume ratio, net main capital, excess, premium rate
  3. 510300 Intraday Structure — Half-hour buckets, volume bars + price points
  4. Market Breadth — Main indices / Overseas markets / Industry & Concept leaders / Top main capital inflows/outflows for the whole market ETFs

How to Read the Four Judgments

Metric Definition Judgment Criteria
Estimated Volume Ratio Current Volume ÷ Linear extrapolation of full-day volume based on elapsed minutes > 1.5x is true amplification; < 0.7x is shrinking volume
Support Pulse Single-minute volume ≥ 4x the average of elapsed minutes for the day Continuous appearance indicates active buying; appearing only 1-2 times with the price being swallowed indicates market testing
Premium Rate ETF market price relative to IOPV Sustained positive premium indicates subscription capital absorbing the top; negative premium indicates discount with no takers
Excess ETF Change % - Tracking Index Change % Only look at the time series of the same ETF, not horizontal comparison across different targets

The most useful combined criterion given in the README is: Volume amplification AND Premium rate turning positive AND Intraday bucket price center of gravity moving up; all three must be true to count as true support; only the first one being amplified often just means “turnover but no absorption”.

Scope of the 15 ETF Basket

Narrow-base coverage: CSI 300 (510300 / 510330 / 159919 / 510310), SSE 50 (510050), CSI 500 (510500), CSI 1000 (512100 / 159845), STAR 50 (588000 / 588080), ChiNext (159915); Sector coverage: Brokerage (512880), Semiconductor (512480 / 588200), Pharmaceuticals (512010). The basket is fixed in ETF_LIST in lib/snapshot.js. The FAQ in the README says you can add one yourself, but be careful of the asynchronous completion rules.

How to Use the Intraday Structure

Bar height is half-hour volume, line is closing price, dashed line is yesterday’s close. Bar heights decay segment by segment, price flattening or moving down indicates decreasing absorption capacity. Recalculated every 60 seconds, not tick-by-tick.

Installation and Enablement

Search for dsh-etf-monitor in the plugin market (available after PR merge). Not published on npm, market installation uses the GitHub source.

GitHub source installation method (from README): Call plugin_manager → install_bundle, fill target with repository address, lock by commit. For source code directory development, use local path:

link:C:/path/to/plugins/dsh-etf-monitor

Local tgz snapshot: First npm pack to get dsh-etf-monitor-0.2.0.tgz, then pass the path to install_bundle, upgrade requires reinstall.

Host-side hot patching, usually no restart needed after installation; client bundle is fetched on page load, so refresh is needed after install/upgrade. Modifying client.js requires a page refresh; modifying lib/index.js / lib/snapshot.js uses host-side hot patching, if not effective, disable then enable once.

API and Independent Use

The plugin registers four routes with the /dsh-etf-monitor prefix:

GET /dsh-etf-monitor/api            Take snapshot, 45-second in-process cache
GET /dsh-etf-monitor/api?fresh=1    Force recalculation
GET /dsh-etf-monitor/health         Engine, version, last round duration, last failure reason
GET /dsh-etf-monitor/debug          Probe health per interface (for troubleshooting)

The data layer can be referenced independently outside the DSH runtime:

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

const snap = await takeSnapshot()
console.log(summarize(snap))   // Status=Trading Elapsed Minutes=190 510300=4.18 (+2.2%) Volume=11.3B

Definition Limitations

  1. Volume ratio is an estimated value, using linear extrapolation of elapsed minutes to estimate full-day volume. High volatility in the early opening period, so only the direction is looked at, not the absolute value.
  2. Excess contains yesterday’s premium residual, it is a proxy indicator, not suitable for horizontal comparison across different targets.
  3. Premium rate uses Tencent’s IOPV field (item 78 of qt.gtimg.cn); Eastmoney’s f71 is average price, not IOPV, so early versions calculated this incorrectly here.

Regarding security, lib/index.js only sends GET requests to public market interfaces, does not carry personal data, does not read/write local files, and uses a 45-second in-process cache to avoid hitting upstream repeatedly.

Use Cases and Notes

Suitable for developers who want to view the trading structure of wide-base ETFs during trading hours and judge the intensity of support, and also suitable for using the snapshot data layer for secondary processing. Compatibility requirements: DSH must support dsh.bundle.patch (this package declares both dsh.bundle and dsh.client), Node ≥ 18.17, platform is web client.

The plugin runs with the permissions of the current DSH process. Before installation, read the source code first and confirm the MIT license. Market data has a 1-3 second delay, the panel refreshes every 60 seconds, for personal intraday observation only, does not constitute investment advice.

Testing can be run without a browser by rendering the React tree:

node test/test_client.cjs test/fixture.json

Or take a real-time snapshot from a running plugin as a fixture:

curl -s http://127.0.0.1:<port>/dsh-etf-monitor/api -o fixture.json
node test/test_client.cjs fixture.json

Summary

Turning the question of “whether the National Team is buying ETFs” from search engines and manual chart watching into an auto-recalculating panel in a DSH sidebar comes at the cost of several definition limitations. Directory page: https://www.skillhub.cn/plugins/lacrimosa-da/dsh-etf-monitor. Source code and README: https://github.com/lacrimosa-da/dsh-etf-monitor.

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye