dsh-stock-watch

57Star5Fork4Issue0Watching

在 DSH Web 右上角添加 A 股自选股盯盘弹窗:实时行情、分时/K 线、买卖目标价提醒,并集成扇形 AI 入口一键生成研究与复盘对话。

语言
JavaScript
License
MIT
分支
main
dsh-plugindsh-plugin-marketdsh-pluginspluginstockstock-market

安装

$ dsh plugin --profile web add github:Awu12277/dsh-stock-watch

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

在 DSH Web 界面的右上角提供可折叠、可拖动的 A 股自选股盯盘弹窗,实时展示自选股涨跌、目标价触发、分时与日/周/月 K 线,并把"一键投资研究""每日复盘/行情分析/涨停分析"等 AI 入口就地接入到 DSH 对话。

核心能力

  • 在 DSH Web 右上角提供可折叠拖动的📈自选股药丸与展开面板:折叠态显示当前分组涨跌家数(3↑0↓),展开后列出名称/代码、现价、涨跌幅、迷你分时折线与目标价触发标记(买入/卖出/等待)
  • 支持多分组自选股(分组名、代码、买卖目标价),面板内 按名称/代码检索全 A 股池(约 5549 只);分组配置持久化在浏览器 localStorage,首次启动从 ~/.stocking/settings.json 一次性迁移
  • 提供分时视图(含黄色均价 VWAP 线与昨收基准虚线,按 A 股交易时段 09:30–11:30 / 13:00–15:00 标注,午间留白)与日/周/月前复权 K 线(蜡烛+成交量柱+MA5/10/20/60 均线);K 线支持 +/−/重置 缩放,MA 显隐可切换
  • 买入/卖出目标价在列表与详情实时显示,详情页点击进入数字输入(两位小数、留空清除、回车确认、Esc 取消),保存后立即写回 localStorage 并重算触发标记
  • 胶囊拖到屏幕四边自动吸附为半球(仅显示涨跌家数);悬浮胶囊触发 GSAP 扇形动画菜单,提供「📊 行情分析 / 📅 每日复盘 / 🚀 涨停分析」三个选项,方向按胶囊所在象限自动布局,鼠标在菜单内不收起
  • 详情页"📈投资研究报告"按钮与扇形菜单点击均新开 DSH 对话发送简短关键词,由 host 端注入的条件式系统指令保证自动按预定义框架(A 股短线复盘 / 行情分析 4 项 / 涨停分析 4 项 / 投资研究+前端设计)执行

技术实现

  • 语言: JavaScript(ESM,未启用 TypeScript;index.js + client.js 两个源文件)
  • 关键依赖: Host 端零外部依赖(仅用 node:osnode:fs/promisesnode:fsnode:url 内置模块与 Node 原生 fetch);Client 端通过 __ModuleLoader__.require("react") 复用宿主 React;图表层懒加载 CDN:lightweight-charts@4.2.3(unpkg / jsdelivr 双源)与 gsap@3.12.5,CDN 不可用时自动降级为自绘 SVG 蜡烛与折线
  • 架构模式: dual-half 宿主插件。Host half 通过 ctx.inject(['webServer']) 注册 5 条 /dsh-stock-watch/* 路由(config / stocks / quotes / kline / minute),并在 apply 启动时通过 ensureUserSkills() 把随包 investment-researchfrontend-design 两个技能复制到 ~/.agents/skills/(目标已存在则跳过),随后通过 ctx.get('systemPrompt') 注入两条 order=200 / 201 的条件式 system prompt section;Client half 通过 ctx.slots.inject("shell.overlay", ...) 在 DSH Web 右上角嵌入可拖动 React 弹窗,依赖宿主的 slotsconnectionsessions 服务
  • 入口文件: Host 入口 index.jsapply / name = 'dsh-stock-watch'inject = ['webServer']);Client 入口 client.jsinject = ['slots']);挂载声明 cordis.patch.yml(在 web profile 插入 1 行 Loader)+ package.json#dsh.bundle.patch + package.json#dsh.client.platform = 'web'

适用场景

在 DSH Web 工作流中写作或对话的 A 股投资者,希望在不离开聊天界面的前提下随时看到自选股涨跌与达到目标价的提示,并把临时冒出的"今天看好哪只、为什么""盘后复盘""涨停分析"等问题一键转交给 DSH 对话获得投研回答或盘后复盘。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness (DSH)未声明package.json 未声明 enginesdshhub.compatibility.dsh;通过 dsh plugin --profile web add 安装,依赖 webServer / slots 两个宿主服务
Node.js未声明package.json 未声明 engines;源码使用 Node 原生 fetchAbortSignal.timeout(12000)node:fs/promisesfileURLToPath,建议 Node ≥18(fetch 与 timeout 稳定版本)
平台跨平台纯 JS + 内置 Node 模块,无原生依赖;Host 端在启动时联网腾讯财经 web.ifzq.gtimg.cn,Client 端可选访问 unpkg.com / cdn.jsdelivr.net
原生模块不引入 node-gyp 模块,全部依赖为 JS 或纯浏览器脚本

安装方式

dsh plugin --profile web add github:Awu12277/dsh-stock-watch

配置项

本插件没有宿主端的 Schema 配置;自选股、买卖目标价、面板位置、面板尺寸与 MA 均线显隐均在浏览器 localStorage 中通过面板 UI 管理。Host 端提供两个可选环境变量:

配置类型说明默认值
DSH_STOCK_WATCH_NO_SKILLS环境变量设置为 1 后禁用首次启动时把随包技能复制到用户技能目录的逻辑未设置(启用注入)
DSH_STOCK_WATCH_SKILLS_DIR环境变量自定义技能注入目标目录,覆盖默认的 ~/.agents/skills~/.agents/skills

常见问题

Q: 安装后右上角没有出现📈自选股药丸怎么办?

A: 确认安装命令带了 --profile web 并且安装后重启了 dsh webpackage.json#dsh.client.platform 固定为 web,只有 web profile 会在启动时扫描这个 bundle;仅刷新浏览器不会重新装载宿主页与客户端模块。

Q: 行情数据从哪里来?和官方接口一样吗?

A: Host 端使用 Node 原生 fetch 直连腾讯财经公开接口 web.ifzq.gtimg.cnminute/queryfqkline/get),与上游 CLI 项目 stocking 的 market.ts 同源。即使 DSH 部署未挂载 web fetch provider 或沙箱封锁了部分网络,本插件仍能取到行情。

Q: 自选股怎么添加?数据存在哪里?怎么彻底清除?

A: 在面板顶部按 进入添加视图,按名称或代码检索全 A 股池(约 5549 只),回车即加入当前分组。所有用户配置(分组、代码、买卖目标价、面板位置、面板尺寸、MA 显隐)都持久化在浏览器的 localStorage,key 分别为 stocking.config.v1 / stocking.pos.v1 / stocking.size.v1 / stocking.ma.v1。首次安装时若检测到 ~/.stocking/settings.json 会自动迁移,之后 localStorage 为唯一来源;浏览器控制台执行 localStorage.removeItem('stocking.config.v1') 后刷新即可恢复默认分组(上证指数、沪深 300、紫金矿业)。

Q: 右上角的"一键投资研究"和扇形菜单是怎么工作的?会泄露我的设置吗?

A: 它们都不会把提示词正文暴露在消息里。"投资研究"按钮发送的是简短消息 分析{公司名}(代码),扇形菜单发送的是"每日复盘 / 行情分析 / 涨停分析"三个关键词。完整提示词由 host 端通过 ctx.get('systemPrompt').section() 注入两条条件式 system prompt section,仅当用户消息匹配"分析某家上市公司"或对应关键词时按框架展开,避免污染日常对话。注意「每日复盘」只在 15:00 至次日 09:00 之间可点击,交易时段会被置灰并提示"还未收盘"。

Q: 目标价触发后怎么提醒?需要打开页面吗?

A: 详情页点 "买入目标" / "卖出目标" 进入数字输入(两位小数、留空清除、回车确认、Esc 取消),保存后回写 localStorage 并即时重算。当前价 ≥ 卖出价标记 卖出,≤ 买入价标记 买入,反之为 等待,在列表与详情以胶囊颜色显示。插件不会发送系统级推送通知,需要保持 DSH Web 页面打开。

Q: K 线、扇形动画需要联网吗?网不好会怎么样?

A: K 线默认从 unpkg.comcdn.jsdelivr.net 加载 lightweight-charts@4.2.3,扇形菜单加载 gsap@3.12.5,两个 CDN 依次尝试。CDN 不可达时会自动降级为自绘 SVG(蜡烛与折线仍可见),但缩放交互动画、GSAP 扇形展开等细节可能不完整。

Q: 卸载之后还要清理什么?

A: 执行 dsh plugin --profile web remove dsh-stock-watch 后重启 dsh web,客户端弹窗与宿主路由会被一并移除。本插件首次启动时复制的 ~/.agents/skills/investment-research~/.agents/skills/frontend-design 因为是文件级复制,会按普通文件保留(如不再需要可手动 rm -rf 清理);用户已有的同名技能不会被覆盖。

Q: 哪些时段能看到实时行情?非交易时段的数据是昨天的吗?

A: 数据来自腾讯财经分钟接口。A 股交易时段(北京时间 09:30–11:30 / 13:00–15:00)提供分钟级折线;非交易时段返回的是收盘后的快照,列表每 10 秒刷新一次。分时视图的时间轴会按交易日时段标注,午间 11:30–13:00 留白。

上手难度

入门 — 一条 dsh plugin --profile web add + 重启 dsh web,刷新页面即可看到右上角药丸,初次自选股配置都通过面板内 与分组 tab 完成,无需编辑配置文件。

已知问题与限制

  • 安装或更新后必须重启 dsh web:客户端 bundle 与 cordis 插件行均在启动时扫描,仅刷新浏览器不会重新装载(README.md:26)
  • 行情接口来自腾讯财经公开端点 web.ifzq.gtimg.cn:连接失败时列表行显示"行情获取失败,请稍后重试",插件不缓存上次价格,刷新即重新请求(client.js:1660 / index.js:387)
  • 腾讯财经 K 线返回列序以 [date, open, close, high, low, volume] 为基准:插件对最后一根 K 线以"现价 vs 最近价"做自校正保险,若接口列序再次变动需要相应调整(index.js:329-342)
  • 「每日复盘」扇形菜单选项仅在 15:00 至次日 09:00 之间可点击:交易时段会置灰并提示"还未收盘",避免盘未收却要求复盘(README.md:54)
  • 客户端图表与扇形动画默认走 unpkg.com / cdn.jsdelivr.net:不可达时自动降级为自绘 SVG,K 线缩放(+/−/重置)与 GSAP 扇形动画等细节可能不完整(client.js:225-300)
  • 自选股持久化绑定浏览器 localStorage:跨浏览器、跨设备或无痕模式不会同步自选股;多设备共用需自行导出/导入 stocking.config.v1(client.js:810-837)
dsh-stock-watch — DeepSeek Harness 插件 | deepseek-plugin.org