FishStock
FishStock 是一个轻量、安静、本地优先的 VS Code 行情扩展。在不离开编辑器的情况下,用原生侧边栏快速查看少量股票、指数、ETF、国内商品期货和本地持仓收益。
0.8.4 是持仓展示与操作入口一致性修订版。选择浮动盈亏或当日盈亏的收益率 / 金额排序后,持仓的编辑与删除入口仍然可用,仅上移 / 下移因排序会覆盖手动顺序而隐藏。港币持仓的平均成本和现价继续使用 HKD,只有市值、成本金额、盈亏金额与按币种小计按当前汇率折算为 CNY;Tree View 总计行同时显示所用汇率,默认 0.9 明确标记为占位值。
停牌状态在 Stock、Fund、Futures、Holdings、普通行情悬浮卡、持仓悬浮卡和状态栏之间统一优先显示,停牌期间不再把当日零变动展示成平盘,复牌后自动恢复开市、休市或过期状态。手动在 settings.json 写入越界汇率或残缺的 treeViewFields 时会安全回退,不再产生错误折算或空白描述行。
保存期间显示「保存中…」并暂时锁定草稿修改,防止重复写入或新输入被旧结果覆盖;失败保留草稿与调仓输入,显示实际原因并允许重试。数量或成本无效时明确显示待填写行数、首个错误字段,可点击「定位填写」直接修改。管理页有未保存更改时编辑器页签同步显示标记,并支持 Ctrl+S 调用与「保存全部」相同的校验和重复提交保护。
重复打开管理页保留勾选、调仓输入和滚动位置;添加、编辑命令只聚焦目标输入。搜索框清空、更换关键词,以及保存或放弃草稿后,旧搜索结果与旧错误不会回填。
期货搜索正确区分 RB0 主连与 RB2610、RB2710 等月份合约,十月合约不再被误标为主连或触发代码格式错误;是否展示仍取决于行情有效性。
行情刷新继续保持当前汇率;修改折算设置即时同步 Tree View、持仓悬浮卡与管理页,并保留未保存草稿、勾选、输入焦点和调仓输入。关闭折算时,混币持仓不合并总计,金额排序暂用默认顺序;恢复有效汇率后继续应用原排序选择。
持仓保持统一列表,港股条目带「港」角标。港币平均成本与现价保持 HKD,港币金额默认按 0.9 折算为人民币,可在管理页表格工具栏修改或点击「默认」恢复;Tree View 列表末尾显示总计与所用汇率,管理页保留按币种小计。排序提供浮动盈亏与今日盈亏的收益率 / 金额四个维度,再次选择同一项切换升降序;默认顺序下可跨币种上移 / 下移并保存手动顺序。描述行的数量、市值、浮动盈亏、当日盈亏默认全开,可按需勾选;未勾选的字段仍可在悬浮卡和管理页查看。管理页继续支持连续搜索、多选添加、从自选股批量添加、表格内修改与统一保存。
收盘后 60 秒内继续按调度间隔刷新,使收盘价落定;停牌条目的状态优先显示「停牌」,持仓当日盈亏为 —。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 |
| 修改或批量删除持仓 |
在管理器表格中修改多行,或勾选多条后删除,最后统一保存 |
| 保存全部持仓 |
管理页「保存全部」,或按 Ctrl+S |
| 记录买入或卖出 |
管理器表格中该行的“调仓”按钮,填变动数量与成交价后应用 |
| 开关港币折算、修改汇率或恢复默认 |
管理页表格工具栏的「港币折算」、汇率输入框与「默认」按钮 |
| 删除、移动、调整顺序 |
右键具体条目 |
| 添加、重命名、删除分组 |
视图标题栏或分组右键菜单 |
| 全部展开或全部折叠 |
对应视图标题栏 |
| 排序和涨跌筛选 |
对应视图标题栏的排序按钮 |
| 手动刷新 |
对应视图标题栏的刷新按钮 |
| 选择状态栏轮播分组 |
任一自选视图标题栏的 ... 菜单,或命令面板 |
| 切换状态栏展示 |
任一视图标题栏的 ... 菜单,选择行情轮播或持仓盈亏 |
| 清空或恢复默认 |
对应视图标题栏的 ... 菜单,执行前会确认 |
| 复制脱敏诊断信息 |
命令面板,或视图标题栏的 ... 菜单 |
股票搜索示例:美的集团、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 默认为空,不创建虚构持仓。升级扩展不会覆盖已有自选。
持仓浮动盈亏按“(现价 - 平均成本) × 数量”计算,收益率按“浮动盈亏 ÷ (平均成本 × 数量)”计算。Tree View、持仓悬浮卡与管理页按当前配置展示港币折算金额;平均成本、当前价格、持仓数量与原币种存储保持不变。单条百分比不受汇率影响,混币总计收益率可能因折算权重变化;具体汇总规则见下方「港币折算」。结果未包含费用、税费、分红或公司行动影响。closed 和 stale 行情仍可计算但会明确标注状态,error 或没有有效价格时不展示估算盈亏。
调仓按移动加权平均成本计算:加仓时平均成本为“(旧数量 × 旧成本 + 买入数量 × 成交价) ÷ 新数量”,减仓只减少数量、平均成本保持不变。全部卖出后该持仓在保存时移除。调仓只修改内存草稿,与数量、成本的修改一起在点击“保存全部”后统一写入。本次已实现盈亏只在调仓预览和提示中显示,不记录到本机,也不参与持仓汇总。
持仓管理器先在内存中维护草稿,点击“保存全部”或按 Ctrl+S 后一次性校验和写入;任意一行的数量或成本无效时不会保存任何一行。存在未保存草稿时,编辑器页签标题会带有明确标记。关闭含未保存更改的管理器时,可选择保存、继续编辑或放弃。管理页面不直接访问网络或本地存储,搜索、行情和保存均由扩展进程处理。
配置
| 配置 |
默认值 |
有效范围 |
说明 |
fishStock.refreshIntervalSeconds |
60 秒 |
15–3600 秒 |
自动刷新间隔 |
fishStock.staleAfterSeconds |
120 秒 |
30–86400 秒 |
交易中距最近一次成功获取超过该时间时标记为“刷新超时” |
fishStock.statusBar.rotationSeconds |
5 秒 |
3–60 秒 |
状态栏轮播间隔,不触发网络请求 |
fishStock.colorConvention |
china |
china / international |
涨红跌绿 / 涨绿跌红 |
fishStock.holdings.treeViewFields |
四项全开 |
任意 boolean 子集 |
控制 Holdings 描述行字段;缺失或无效字段回退默认值,至少保留一项 |
fishStock.holdings.hkdToCnyRate |
0.9 |
0.1–2 或 null |
1 港币对应的人民币数量。重置配置恢复 0.9;显式 null 关闭折算;单条百分比不受影响 |
港币折算
fishStock.holdings.hkdToCnyRate 表示 1 港币对应多少人民币,例如 0.8557 表示 1 HKD = 0.8557 CNY。默认 0.9 是占位近似值,请按实际汇率调整;合法数值范围为 0.1–2(含端点)。可通过以下入口修改:
- 持仓管理页:勾选「港币折算」后输入汇率;取消勾选则按原币种显示。再次开启使用当前页面上次有效汇率,首次进入关闭状态时使用
0.9;点击「默认」恢复 0.9 并开启折算。
- 设置界面:
Ctrl+, 打开设置,搜索 hkdToCnyRate 并填入数值;使用「重置设置」恢复 0.9。
- settings.json:
Ctrl+Shift+P → Preferences: Open User Settings (JSON),写入 "fishStock.holdings.hkdToCnyRate": 0.8557。删除配置项恢复默认 0.9;关闭折算需显式写入 "fishStock.holdings.hkdToCnyRate": null。
配置修改即时生效,无需重开管理页或等待行情刷新;行情更新继续使用当前汇率。更新展示时保留未保存的数量与成本、勾选、输入焦点和调仓输入。
| 持仓与配置 |
Tree View 总计行 |
金额排序 |
| 有效汇率 |
港币折人民币后汇总,标明 CNY 与所用汇率 |
按折算后的同一币种金额比较 |
null,只有一种币种 |
按原币种汇总,标明 CNY 或 HKD |
按该币种金额比较 |
null,人民币与港币混合 |
显示「未合并:未启用港币折算」,不显示混币合计金额或合计百分比 |
暂用默认顺序,保留已选维度与升降序;恢复有效汇率后继续应用 |
关闭折算后,持仓仍在统一列表中展示。管理页保留按币种小计;开启折算时港币小计明确标注折算为 CNY,关闭后使用原币种单位。状态栏的持仓盈亏继续显示原币种金额与币种标签。
汇率只换算市值、成本市值和盈亏金额;平均成本与当前价格始终使用原币种。单条持仓的收益率、当日涨跌比例与百分比排序不受汇率影响;总计收益率按合计浮动盈亏除以合计成本市值计算,混币持仓的权重随汇率变化,总计百分比也可能变化。调整汇率不会改写持仓记录,FishStock 不自动获取汇率。手动写入越界、非数字等无效汇率时,运行时安全回退到默认 0.9。
行情可用性
Stock、Fund 使用腾讯公开网页行情端点,Futures 使用新浪公开网页行情端点。Holdings 复用 Stock 与 Fund 的行情缓存,不接入额外行情端点。这些端点没有面向 FishStock 的正式接口契约,字段、访问策略和可用地区可能变化。
行情状态统一为以下四种:
live(实时):当前处于交易时段,已取得当前交易日行情,且最近一次成功获取仍在过期阈值内。价格或行情时间没有变化不影响该状态;阈值内的一次刷新失败只显示警告。
closed(休市):当前处于午休、盘间休息、收盘、周末或节假日,仍展示最近有效行情。
stale(数据过期):交易中长时间没有成功获取、未取得当前或最近交易日行情、行情时间异常,或期货时段尚未收录;界面会进一步显示“刷新超时”“等待当日行情”“行情时间异常”或“时段未收录”。
error(暂不可用):没有可展示的有效行情。
停牌是独立于四种状态的事实标记,并优先于 live、closed 和 stale 展示。普通行情悬浮卡、三个自选 Tree View、Holdings、状态栏及持仓管理页统一显示暂停图标和「停牌」;复牌后恢复底层行情状态。停牌期间不计算当日盈亏,也不把零变动显示成平盘。
浮窗同时显示“行情时间”和“最近获取”:前者来自行情源,可能因没有成交而不变化;后者表示 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。
本软件仅用于行情辅助展示,不提供投资建议。第三方行情可能延迟、不完整、不准确或不可用,任何投资决策及其结果均由用户自行承担。