FishStock
FishStock 是一个轻量、安静、本地优先的 VS Code 行情扩展。在不离开编辑器的情况下,用原生侧边栏快速查看少量股票、指数、ETF、国内商品期货和本地持仓收益。
0.8.0 是持仓统一展示版:不再按币种分成「人民币持仓 / 港币持仓」两组,所有持仓合并为一列,排序与手动上移 / 下移都跨币种生效;港币金额按可配置的汇率(默认 0.9,可在持仓管理页随时调整或一键恢复)折算为人民币,列表末尾给出一行总计。港股条目挂「港」角标以便与 A 股区分。修正了悬浮窗在停牌时仍显示「开市」的问题(Tree View 与悬浮卡口径现已一致),并为其加上状态图标与分段说明。收盘后 60 秒内仍会刷新一次,使最终收盘价落定;Tree View 描述行的展示字段可勾选(默认数量、市值、浮动盈亏、当日盈亏四项全开),未勾选的字段仍可在悬浮面板与编辑器管理器查看;排序提供浮动盈亏与今日盈亏的收益率 / 金额共四个维度,再次选择同一项即可切换升降序;默认顺序下可对持仓条目右键上移 / 下移,手动顺序持久化保存;停牌持仓显示「停牌」而不是「今日 ±0」。编辑器区域的可视化持仓管理器继续支持连续搜索、多选添加、从自选股批量导入、表格内修改多只持仓并统一保存,表格底部保留按币种的小计行;Tree View 继续用于快速查看市值、浮动盈亏、当日盈亏和收益状态。FishStock 不要求账户,不上传自选或持仓数据,不提供投资建议;行情来自第三方公开网页端点,可能受到地区、网络和访问策略影响,与券商对账可能存在差异,请以券商为准。
主要特点
- 原生
Stock、Fund、Futures 与 Holdings 同级 Tree View;自选保持“分组 → 条目”,持仓按人民币与港币分组。
- 股票支持 A 股、港股、常见市场指数、科创板和北交所新旧代码。
- Fund 当前支持沪深交易所 ETF,可按名称、拼音简称或代码搜索,例如“电网设备ETF”或
159326。
- Futures 支持已收录交易时段的国内商品期货主连和当前有效月份合约,并按品种区分夜盘收盘时间。
- 一个安静的状态栏项目;默认轮播“名称 + 现价 + 涨跌幅”,也可切换为持仓浮动盈亏轮播。
- 持仓数据只保存在本机;编辑器管理器支持批量添加、修改和删除,收益计算复用 Stock/Fund 行情,不增加独立行情请求链路。
- 支持分组、排序筛选、全部展开、手动与自动刷新、清空和恢复默认。
- 浮窗展示价格、涨跌、成交及适用品种的更多字段。
- 自选与持仓数据保存在当前 VS Code Profile,本扩展没有账户、遥测或自有服务器。
- 可主动复制脱敏诊断信息,帮助反馈问题,不会自动上传日志。
快速开始
- 从 VS Code 扩展市场安装 FishStock。
- 点击 Activity Bar 中的 FishStock 图标。
- 在
Stock、Fund 或 Futures 标题栏点击 + 添加自选;在 Holdings 标题栏打开持仓管理器,连续添加标的并统一填写、保存数量与平均成本。
- 将鼠标悬停在条目上查看详情,点击条目可在浏览器打开外部行情页面。
| 操作 |
入口 |
| 添加股票或指数 |
Stock 标题栏或目标分组的 + |
| 添加 ETF |
Fund 标题栏或目标分组的 + |
| 添加期货 |
Futures 标题栏或目标分组的 + |
| 管理持仓 |
Holdings 标题栏的管理按钮,或命令面板执行 FishStock: 管理持仓 |
| 批量添加持仓 |
管理器中连续搜索、多选结果,支持 A 股、港股和境内交易所 ETF |
| 修改或批量删除持仓 |
在管理器表格中修改多行,或勾选多条后删除,最后统一保存 |
| 记录买入或卖出 |
管理器表格中该行的“调仓”按钮,填变动数量与成交价后应用 |
| 删除、移动、调整顺序 |
右键具体条目 |
| 添加、重命名、删除分组 |
视图标题栏或分组右键菜单 |
| 全部展开或全部折叠 |
对应视图标题栏 |
| 排序和涨跌筛选 |
对应视图标题栏的排序按钮 |
| 手动刷新 |
对应视图标题栏的刷新按钮 |
| 选择状态栏轮播分组 |
任一自选视图标题栏的 ... 菜单,或命令面板 |
| 切换状态栏展示 |
任一视图标题栏的 ... 菜单,选择行情轮播或持仓盈亏 |
| 清空或恢复默认 |
对应视图标题栏的 ... 菜单,执行前会确认 |
| 复制脱敏诊断信息 |
命令面板,或视图标题栏的 ... 菜单 |
股票搜索示例:美的集团、mdjt、000333。ETF 搜索示例:电网设备ETF、dwsbetf、159326。期货搜索示例:沪金、AU0、AL2608。搜索结果会先预览,只有确认后才写入自选。
支持范围
| 品类 |
当前支持 |
暂不支持 |
| Stock |
A 股、港股、A 股与港股常见指数 |
美股和历史走势 |
| Fund |
沪深交易所 ETF |
场外基金、ETF 联接基金、LOF、港股 ETF |
| Futures |
已收录交易时段的国内商品期货主连和有效月份合约 |
金融期货、期权、外盘期货、时段尚未收录的新品种 |
| Holdings |
A 股、港股、沪深交易所 ETF 的数量、平均成本、市值、浮动盈亏与收益率 |
期货持仓、交易流水、已实现收益、费用税费、分红、自动汇率获取、账户与资产曲线 |
首次创建本地数据时,Stock 提供少量股票、指数和银行示例,Fund 提供沪深300ETF示例,Futures 提供沪金、白银、铜、沪铝和锡主连示例;Holdings 默认为空,不创建虚构持仓。升级扩展不会覆盖已有自选。
持仓浮动盈亏按“(现价 - 平均成本) × 数量”计算,收益率按“浮动盈亏 ÷ (平均成本 × 数量)”计算。人民币和港币分别汇总;未配置汇率时按原币种展示,配置 fishStock.holdings.hkdToCnyRate 后仅将港币金额折算为人民币展示,百分比与原币种存储不变;结果未包含费用、税费、分红或公司行动影响。closed 和 stale 行情仍可计算但会明确标注状态,error 或没有有效价格时不展示估算盈亏。
调仓按移动加权平均成本计算:加仓时平均成本为“(旧数量 × 旧成本 + 买入数量 × 成交价) ÷ 新数量”,减仓只减少数量、平均成本保持不变。全部卖出后该持仓在保存时移除。调仓只修改内存草稿,与数量、成本的修改一起在点击“保存全部”后统一写入。本次已实现盈亏只在调仓预览和提示中显示,不记录到本机,也不参与持仓汇总。
持仓管理器先在内存中维护草稿,点击“保存全部”后一次性校验和写入;任意一行的数量或成本无效时不会保存任何一行。关闭含未保存更改的管理器时,可选择保存、继续编辑或放弃。管理页面不直接访问网络或本地存储,搜索、行情和保存均由扩展进程处理。
配置
| 配置 |
默认值 |
有效范围 |
说明 |
fishStock.refreshIntervalSeconds |
60 秒 |
15–3600 秒 |
自动刷新间隔 |
fishStock.staleAfterSeconds |
120 秒 |
30–86400 秒 |
交易中距最近一次成功获取超过该时间时标记为“刷新超时” |
fishStock.statusBar.rotationSeconds |
5 秒 |
3–60 秒 |
状态栏轮播间隔,不触发网络请求 |
fishStock.colorConvention |
china |
china / international |
涨红跌绿 / 涨绿跌红 |
fishStock.holdings.hkdToCnyRate |
留空 |
0.1–2 |
港币折算人民币的汇率(1 港币 = ? 人民币)。留空表示不折算,港币持仓按原币种显示;只作用于金额,百分比不变 |
港币折算
港股与港币计价 ETF 的金额默认按港币显示。若希望它们与人民币持仓放在一起读,配置 fishStock.holdings.hkdToCnyRate(1 港币可兑换的人民币数量,如 0.8557):
- 设置界面:
Ctrl+, 打开设置,搜索 hkdToCnyRate,在 FishStock › Holdings: Hkd To Cny Rate 中填入数值;
- 或编辑 settings.json:
Ctrl+Shift+P → Preferences: Open User Settings (JSON),加入 "fishStock.holdings.hkdToCnyRate": 0.8557。
保存即生效,无需重启。留空即恢复原币种显示,行为与未配置时完全一致。折算只作用于市值与盈亏金额,收益率与当日百分比不受影响(相对值,汇率在分子分母里约掉);持仓数据始终按原币种保存,调整汇率不会改写已有记录。该数值是「1 港币 = ? 人民币」,填反会导致金额被放大。
行情可用性
Stock、Fund 使用腾讯公开网页行情端点,Futures 使用新浪公开网页行情端点。Holdings 复用 Stock 与 Fund 的行情缓存,不接入额外行情端点。这些端点没有面向 FishStock 的正式接口契约,字段、访问策略和可用地区可能变化。
行情状态统一为以下四种:
live(实时):当前处于交易时段,已取得当前交易日行情,且最近一次成功获取仍在过期阈值内。价格或行情时间没有变化不影响该状态;阈值内的一次刷新失败只显示警告。
closed(休市):当前处于午休、盘间休息、收盘、周末或节假日,仍展示最近有效行情。
stale(数据过期):交易中长时间没有成功获取、未取得当前或最近交易日行情、行情时间异常,或期货时段尚未收录;界面会进一步显示“刷新超时”“等待当日行情”“行情时间异常”或“时段未收录”。
error(暂不可用):没有可展示的有效行情。
浮窗同时显示“行情时间”和“最近获取”:前者来自行情源,可能因没有成交而不变化;后者表示 FishStock 最近一次成功取得该条目。交易中的过期阈值只作用于最近获取时间。单次请求失败会保留 live 缓存并给出警告,只有持续失败超过阈值才转为“刷新超时”;休市时不因网络失败把有效行情改成实时或暂不可用。
自动刷新按条目判断时段:A 股覆盖集合竞价、上午、午休、下午和收盘;港股覆盖开市前、早市、午休、午市、收市竞价与半日市;国内商品期货覆盖日盘三节、跨自然日夜盘和节假日前夜盘关闭。开盘、休息和收盘边界会立即更新展示,并对发生切换的条目补一次行情请求;常规轮询只请求正在交易的条目。
手动刷新不受交易时段、节假日或自动退避限制,会请求当前 View 的全部自选并提示“行情已刷新”“当前休市”或“部分期货交易时段未收录”。扩展激活时仍异步加载一次最近行情,不阻塞本地自选展示。
某个行情源返回 HTTP 403 后,对应模块的自动刷新会按 15 分钟、30 分钟、1 小时、2 小时、最长 6 小时递增退避,避免持续重复请求;手动刷新可立即重新探测。完整时段和兼容边界见行情源说明。
原生视图布局
Stock、Fund、Futures 与 Holdings 是可独立显示或隐藏的 VS Code 原生 View,首次布局提供 2:1:1:1 高度权重,并在全新工作区中默认展开。FishStock 不在 VS Code 启动时打开侧边栏,也不在用户展开某个 View 时联动其他 View。之后的折叠状态和 View 高度继续由 VS Code 保存,扩展不强制重设原生分隔位置。
如果重新展开的 View 占用了过多空间,请拖动分隔线;同时展开相邻 View 后双击分隔线,可以使用 VS Code 的原生均分行为。FishStock 不会在启动时强制聚焦或展开 View,以免抢占编辑器焦点并覆盖用户布局。
数据与隐私
自选分组、持仓数量、平均成本和状态栏展示方式保存在当前 VS Code Profile 的本机 globalState 中。FishStock 不读取工作区文件,也不会收集或上传遥测。为了完成搜索和行情,用户输入的搜索文本或证券代码会由本机直接发送给腾讯、新浪或北交所公开站点;持仓数量、平均成本、市值和盈亏不会发送给行情源,也不经过 FishStock 服务器。
完整说明见隐私说明。
问题反馈
遇到问题时,可以执行 FishStock: 复制运行诊断信息,再通过 GitHub Issues 提交。诊断报告不包含自选名称、证券代码、持仓数量、平均成本、盈亏、文件路径或工作区信息。刷新错误可在“查看 → 输出 → FishStock”中查看。
反馈前请阅读支持说明。
本地开发
要求 VS Code 1.90 或更高版本、Node.js 20 或更高版本以及 pnpm 11。
pnpm install
pnpm run check
pnpm run test:smoke
在 VS Code 中按 F5 启动 Extension Development Host。
生成稳定通道 VSIX:
pnpm run package:vsix
生成预发布通道 VSIX:
pnpm run package:vsix:pre-release
命令会执行 lint、单元与回归测试、真实 Extension Host 冒烟、版本和 Marketplace 元数据校验、包内容检查,并生成 fish-stock-<version>.vsix。
许可证与声明
FishStock 使用 MIT License。
本软件仅用于行情辅助展示,不提供投资建议。第三方行情可能延迟、不完整、不准确或不可用,任何投资决策及其结果均由用户自行承担。