kevin9327
d46e601863
fix(notifications): 飞书推送按传入的 max_attempts 退避与记日志
...
_post_feishu 的退避判断与最终 WARNING 仍用模块常量 _FEISHU_MAX_ATTEMPTS(3),
设置页「发送测试消息」传 max_attempts=1 时: 唯一一次失败后仍 sleep 1 秒才返回,
日志写「已重试 3 次」而实际只试了 1 次。两处改用 max_attempts; 生产路径不变。
测试: 单次尝试不退避且日志计数为 1 (未修复时失败), 默认 3 次仍退避 1s、2s。
2026-09-05 21:14:53 +09:00
wshy
c1ad4880fe
Merge pull request #248 from 0112020179/codex/fix-index-chart-jitter
...
fix(chart): prevent axis boundary hover jitter
2026-09-05 18:46:55 +08:00
shy3130
b3e492d890
feat(factor-editor): 算子/字段面板与模板库 UX 迭代
...
- 算子区去重: 移除裸 chips 行, 速查表升级为唯一算子面板(默认展开, 挂载时置 open 避免与折叠态打架)
- 速查表重设计: 时序(13)/截面(3)/工具(9)三张分组卡片, 每行=完整签名+中文说明+参数约束, 点击整行插入公式光标处; 与 chips 共用 OPERATOR_GROUPS 单一数据源
- 折叠标题突出: 白色前景色+medium 字重+accent 箭头(展开旋转), 悬停变色
- 可用字段: 展开高度 160→256px; 分组名提亮加粗; 字段英文 id 蓝色(与算子签名同色), 中文保持灰色
- 模板库 5→12: 新增 低波动/量比回落/RSI超卖/低振幅/隔夜反转/距高点回落/换手稳定, 全部经 /api/factors/validate 预校验
- 校验/试算按钮居右(ml-auto)
- factor-platform-plan.md §5.2 模板计数同步
2026-09-05 18:19:34 +08:00
shy3130
2ff909cd36
fix(notifications): #244 维护者补丁 — 移除预埋类型并修正全角标点
...
- 移除 api.ts 中与通知无关的 MainCostEstimate/StockLevels.main_cost 类型(对应后端字段在本仓库不存在, 属跨 PR 预埋, 全仓库零引用)
- settings.py 5 处 PR 新增字符串的全角逗号改半角, RUF001 恢复到 main 基线(28 ≤ 29)
- 验证: 通知测试 48 passed, 前端 build 通过
2026-09-05 17:16:58 +08:00
wshy
c1cad36449
Merge pull request #244 from yushenglin01/feat/notification-channels
...
feat(notifications): add custom webhook and email channels
2026-09-05 17:14:25 +08:00
shy3130
e40bf15a50
docs(manual): 操作说明书适配 v0.2.3 — 新增因子与信号库章节, 28 章重排
...
- 新增第 10 章「因子」: 检验/因子库/编辑器/组合/挖掘五 tab 与因子↔策略四条桥, 原 9.1 因子回测内容迁入并扩充
- 新增第 11 章「信号库与持仓提醒」: 信号库独立页(原设置 19.6 迁出)与持仓提醒页
- 第 9 章重构: 回测页改为「策略|验证」两视图口径, 小节重排为 9.1 策略回测/9.2 参数优化/9.3 步进优化
- 原 10-26 章顺移为 12-28(含目录锚点与交叉引用); 1 章概览、5.1 菜单、4 章流程、21 章设置清单同步更新
- 校验: 目录 28 条与正文 H2 完全一致, 章节号连续, 无坏锚点与过时引用
2026-09-05 16:52:40 +08:00
shy3130
e0cd625ef4
feat(platform): 因子平台与因子↔策略双向联动 v0.2.3
...
- 因子平台: /factors 一级页(检验/因子库/编辑器/组合/挖掘), DSL 公式因子(25 算子点选、双语字段、我的因子模板、脏公式守卫), 版本与生命周期, 自动挖掘 L1 统计筛选
- 因子↔策略四条桥: 触发器 Zap 快建因子条件信号、因子一键生成排名策略、自定义信号 AI 提示词接入因子分组、策略回测因子归因(胜/败单入场信号日因子均值, 独立 tab, 双语因子名)
- 回测: 统计卡新增盈亏比(≥1 红/<1 绿), 蒙卡回撤合并为中位/95% 双值卡(自适应字号), 高级设置基础过滤与策略编辑器参数对齐(5 组区间)
- 信号库独立页 /signals(原设置 tab 迁出), 持仓提醒入导航; 挖掘并入因子页第 5 tab, /mining 旧链接重定向
- 研究线配套: 因子目录 61→77(评分/矩阵双内核), stats_v2(Newey-West/BH-FDR/DSR), enriched 管道与异动/报价服务配套调整
- 文档: README 导航与特性表、features.md 因子平台章节、操作说明书 9.2、factor-platform-plan 执行状态与 §5、二开文档桥接说明; 交流与支持节改版
- 版本 0.2.2 → 0.2.3; 后端全量 1625 passed(1 例环境性跳过), 前端 build 通过
2026-09-05 15:41:15 +08:00
0112020179
f6257408bf
fix(chart): prevent axis boundary hover jitter
2026-09-05 15:23:50 +08:00
yushenglin
5289cde13e
feat(notifications): add custom webhook and email channels
2026-09-04 16:37:06 +08:00
shy3130
bab609b2d4
fix(ai): DeepSeek thinking 禁用参数被 400 拒绝时去参重试 ( #240 跟进)
...
_openai_kwargs 对 DeepSeek V4 官方域名注入的 thinking 禁用参数
(extra_body) 属外部 API 契约, 模型/接口版本差异可能报 400。照
temperature / reasoning_effort 既有模式补第三条定向回退: 400 且
错误信息指向 thinking 时移除 extra_body 重建请求 (回退默认思考
模式; 若正文因此被推理挤占, 由 _iter_openai_text 显式报错指引)。
与 thinking 无关的 400 不触发回退, 直接抛出。
2026-09-04 12:50:50 +08:00
wshy
3fee4ecba5
Merge pull request #240 from yushenglin01/fix/ai-analysis-focus
...
修复 AI 分析关注重点不突出及静默失效问题
2026-09-04 12:47:39 +08:00
wshy
831e2dc5db
Merge pull request #243 from 0112020179/codex/stream-regime-batches
...
fix(regime): 逐批聚合以降低全量重算内存峰值
2026-09-04 12:47:35 +08:00
shy3130
a9af2bce1c
fix(pipeline): enriched 全量重建流式化, 峰值内存与历史长度解耦 (#208/#174)
...
小内存机器 (2C2G) 延长历史后全量重建必然 OOM 的两个根因:
1. 全量模式把所有批次结果累积在内存 date_buffers 直到统一写盘,
5 年 x 5500 只 (~800 万行) 全表驻留 0.5-1GB;
2. 批次大小按「每只 ~244 行」的年代设定, 历史延长后单批宽表
(指标全列) 瞬时 ~600MB。
修复 (双核模拟实测: 275 万行峰值 RSS 958MB -> 415MB, 耗时 +37%):
- 流式暂存发布: 每批结果立即写暂存文件 (enriched 树外隐藏目录,
不被 **/*.parquet 业务 glob 扫到; polars/duckdb 的 ** 均匹配
点目录), 最后按日期分块流式合并、逐分区原子替换; 日期覆盖
校验与 EnrichedPublication 崩溃语义保持不变, finally 保证
暂存清理, 历史残留按 mtime (24h) 启动清扫;
- 自适应批次: 检测内存 <8GB 时按单批目标行数 15 万收缩,
>=8GB 保持用户设置 (大机器行为不变, 20 核实测耗时持平);
- 刷新路径同修: 启动/盘后的 300 天窗口计算 (repository) 改走
compute_enriched_history_window 分批执行, 与整帧顺序等价
(各步骤均 over(symbol) 分组), 峰值与标的总量解耦。
验证: 新增 5 项回归测试 (流式输出与整帧直算逐列相等/暂存清理/
残留清扫/自适应批次/窗口分批等价), 全套 backend 1498 项通过,
ruff 基线零新增。
2026-09-04 12:40:04 +08:00
0112020179
885e693118
fix(regime): aggregate fallback batches incrementally
2026-09-04 12:19:35 +08:00
yushenglin
00b3492414
fix(ai): 优化分析关注重点与正文输出
2026-09-04 12:03:06 +08:00
shy3130
8c28132361
fix(analysis): 概念/行业映射缓存命中返回类型与签名不一致 ( #186 )
...
_load_concept_map_df 正常路径返回 (map_df, count) 元组, 但缓存只存了
裸 map_df —— 600s TTL 内二次访问命中缓存返回 DataFrame, 调用方按元组
解包把两列拆成两个 Series, 概念/行业分析二次打开必报错 (issue #186
报告者定位)。
- 缓存与返回值同构: 存 (map_df, count) 元组, 类型注解同步
- 移除 market_mainline / rps_rotation 两处针对旧 bug 的防御性兼容层
- 删除失效的 bare-DataFrame 兼容测试, 新增缓存契约回归测试 (3 次连跑通过)
2026-09-04 11:59:00 +08:00
shy3130
2ce8b4b17d
fix(ext-data): 内置概念/行业 preset 不再启动即自动联网拉取 ( #199 )
2026-09-04 11:53:15 +08:00
shy3130
7ea741e4dc
fix(backtest): 回测交易/选股行支持键盘打开K线弹窗 ( #239 维护者补丁)
2026-09-04 11:41:54 +08:00
wshy
84f00d36d3
Merge pull request #239 from thinkbuf/feat/backtest-result-kline-click
...
feat(backtest): clickable K-line popups for trade & picks rows
2026-09-04 11:40:53 +08:00
wshy
2140209506
Merge pull request #237 from 0112020179/codex/incremental-detail-kline
...
perf(kline): 个股详情仅增量更新最后一根日 K
2026-09-04 11:26:55 +08:00
wshy
4ca655279a
Merge pull request #236 from 0112020179/codex/preserve-index-cache-on-failure
...
fix(index): 指数请求失败时保留上一轮有效缓存
2026-09-04 11:26:52 +08:00
richard and Claude
4bb26713fc
feat(backtest): clickable K-line popups for trade & picks rows
...
回测结果页三处标的/交易现在都能点开K线弹窗:
- 交易明细每行可点击,复用 TradeKlineModal 打开该笔交易的「交易回放」(买卖价线 + 持仓区间)。
- 选股分析每行(按标的聚合)新增 PicksSymbolKlineModal:展示该标的整个回测期的日K,逐笔标注买入/卖出箭头并显示成交价;同日同方向多笔合并为一个箭头,价格相同显示 ×n,不同则显示区间。
- 原两个弹窗状态合并为单个 union 覆盖层状态,类型上保证同一时刻只打开一个,消除各 opener 的手工互斥。
- 图表组件透传 visibleBars:'all',标的回放初始即适配显示整段区间,避免买卖点被默认尾窗遮挡。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-04 11:15:36 +08:00
0112020179
8721bd2e83
perf(kline): update detail chart with latest row
2026-09-03 17:35:16 +08:00
0112020179
2e8be527b6
fix(index): preserve realtime cache on provider failure
2026-09-03 14:42:32 +08:00
shy3130
4cb30e48aa
fix: screener JIT 透传 turnover_rate ( #187 ) + PullScheduler 线程安全 ( #203 )
...
- #187 : _compute_enriched_full/_load_enriched_history 的 warmup 读取
白名单补上存储列 turnover_rate —— instruments 不可用无从重算时,
自定义 SQL 用该列做条件会 Binder Error 被吞成静默空结果
- #203 : refresh 的 _tasks 增删 diff 从调用方线程移进主循环闭包,
消除 TOCTOU 窗口; 行为测试覆盖增删/幂等
#187 测试已在修复前代码上验证会失败 (instruments 为空时列丢失)。
2026-09-03 13:45:12 +08:00
shy3130
91fef6d793
test: 加强 #201/#224 回归测试至可复现级别
...
- #201 warmup 测试改为与全历史计算基准对比数值 (ewm 指标从首值播种,
仅断言非 NaN 无法区分新旧代码)
- #224 注入测试改用合法同构 parquet 做目标 (读 /etc/passwd 在未加固
连接下同样报错, 区分不了攻击面是否真实闭合)
两个测试均已在修复前代码 (41205b1/e89ea9b) 上验证会失败。
2026-09-03 13:26:42 +08:00
shy3130
ef59df4a67
fix: 修复 6 个 issue (#225/#226/#201/#188/#200/#196)
...
后端:
- #225 自定义源分钟K字符串 datetime 不再被 cast 成 null:
_normalize_minute 对 Utf8 列按常见格式链式解析 (参照 kline_sync 口径)
- #226 自定义源日K/除权因子单批失败只隔离该批 (重试 1 次 + 跳过 +
warning 汇总), 不再丢弃已成功批次的全部进度
- #201 旧信号回测 _load_panel 加指标 warmup 窗口 (120 交易日保守日历日),
计算后裁回 [start,end]; 数据不足时自然退化
前端:
- #188 因子回测单标的不再整面板空白: 外层条件改 !error, IC 卡片
单独守卫并给出需 >=2 只的提示
- #200 因子回测支持调仓频率 (日/周/月) 与滑点 (bp) 配置
- #196 自选页板块筛选新增 ETF 分类, 旧偏好加载时补 ETF 键保持默认可见
2026-09-03 13:20:59 +08:00
shy3130
e89ea9becf
fix: 修复 4 个 P1 issue (#224/#232/#223/#215)
...
- #224 screener 自定义 SQL 的内存连接关闭 enable_external_access,
注入的 read_parquet/COPY 文件读写直接报错 (安全)
- #232 指数展示缓存百分数口径在消费边界显式 /100:
pipeline._bench_rt_pct_of 与 abnormal_moves._bench_rt_pct 两处,
修复 3/10/30 日偏离值被放大两个数量级
- #223 盘后管道按同日 daily/enriched 行数比较检测实时合并提前
创建的部分分区, 删除后由增量重算全市场补齐
- #215 _basic_filter_for_asset 扩展中和股票专属键 (price_min/max/boards),
并应用到回测/挖掘/策略扫描三个运行期入口, 修复 ETF 静默零信号
2026-09-03 13:01:43 +08:00
shy3130
41205b197c
chore: follow-ups for PR #231/#233 reviews
...
- monitor_rules: raise from None in remind_date validation (B904)
- lots: log warning on asset-type fallback to stock (fail-open traceability)
- matrix: demote turnover NaN-column notice to debug
2026-09-03 12:45:24 +08:00
wshy
8b12fc7a65
Merge pull request #231 from thinkbuf/feat/lots-alerts
...
feat(lots): holdings-reminder page — per-buy-lot auto stop/profit & expiry monitoring
2026-09-03 12:39:58 +08:00
wshy
f8031e16f4
Merge pull request #233 from SeerGlaucus/fix/etf-backtest-turnover-rate
...
fix(backtest): ETF矩阵回测因缺失换手率字段报错
2026-09-03 12:39:52 +08:00
SeerGlaucus
ba83e0241b
fix(backtest): ETF矩阵回测不因缺失换手率字段而失败
...
非股票资产(etf/index)无股本数据(维表仅 symbol/name/code/asset_type),
数据源也不提供换手率; 但矩阵缓存档 common_filter 强制 turnover_min:0.0,
依赖解析仍为 ETF 请求 turnover_rate(需 float_shares 派生), 导致矩阵缓存
构建失败。实测内置 low_volatility_leader 也报
"matrix turnover_rate requires float_shares"。
- _basic_filter_for_asset 将 turnover_min/max 一并中和(与市值界同族, 上次修复遗漏)
- _populate_matrix_derived_arrays 对无股本的 etf/index 把缺失的 turnover_rate
降级为全 NaN 列(与运行期 _optional_field 语义一致), 股票派生路径行为不变
- 新增回归测试: ETF 无股本时降级 NaN 不报错; 有 float_shares 时仍正常派生
2026-09-03 02:37:52 +08:00
richard and Claude
adc7ab52a9
feat(lots): holdings-reminder registry with auto stop/profit & expiry monitoring
...
新增「持仓提醒」页(/lots),登记买入批次(个股/ETF),每批自动生成并同步两条
监控规则: lot_{id}_p(type=price 止盈止损)与 lot_{id}_d(type=date 到期提醒)。
- 核心监控引擎新增 date 规则类型: 纯日历窗口、每个交易日仅在首个轮询评估一次、
按天 cooldown、跨天清理过期键; 消息按触发当天显示"N天后到期/今日到期"。
- 批次派生规则继承默认 webhook 渠道; 监控中心只读展示(批次/批次托管徽标),
通用 monitor-rules 接口对带 lot_id 的规则写/删返回 409, 避免与批次页脱节。
- 通知正文统一在缺省时追加触发现价与涨跌幅, 并避免与引擎自带引语重复。
- 后端分层: strategy/lots.py 域(校验/存储/批次→规则纯映射) + api/lots.py 薄路由
(写锁/校验先行/级联删规则/复用 _sync_engine 重载); services/fs_utils.py 原子写。
- 前端: api/queryKeys 契约、DateShortcuts、Lots 页(数值输入可留空、加载/出错态、
文案打磨)、Monitor 日期提醒/批次徽标; RuleEditor 不手工建 date(由持仓页生成)。
- 记账/加仓减仓属"交易口径", 不在本改动(issue #230 ); 到期提醒按自然日窗口,
休市/节假日顺延的交易日历口径待 issue 定夺。
验证: 新增 tests/test_date_rule.py + tests/test_lots.py 全绿(20), 监控族回归通过,
ruff 新文件干净, pnpm build 通过。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 20:20:38 +08:00
shy3130
de5d5a9769
chore: update assets
2026-09-02 16:27:38 +08:00
wshy
a28f9e852f
Merge pull request #228 from thinkbuf/feat/watchlist-import-csv-groups
...
feat(watchlist): batch import CSV / pasted codes into groups
2026-09-02 15:55:18 +08:00
wshy
3a3012f5b6
Merge pull request #227 from thinkbuf/feat/webhook-test-message
...
feat(monitor): add webhook test message button
2026-09-02 15:55:12 +08:00
shy3130
7ac0456c53
feat(mining): 实时行情与挖掘的冲突确认弹窗
...
盘中实时开启时 enriched 每轮落盘推进数据世代, 排队中的挖掘任务
开跑会因首轮世代校验失败而报错 (mining data generation changed
after the run was queued, 用户反馈)。两个方向加确认弹窗:
- 挖掘页: 实时开启时点「开始挖掘」→ 三按钮确认 (取消 / 仍要开始 /
关闭实时并开始 — 后者一键关实时并提交任务)
- 侧边栏实时开关: 存在 queued 挖掘任务时开启 → 确认弹窗;
运行中任务自动跟随新世代, 不拦截
验证: tsc 零错误 + build 通过 + 浏览器验收 7/7 (弹窗出现/取消
无副作用/关实时并启动任务链路/无排队任务不拦截/环境恢复)。
2026-09-02 15:20:48 +08:00
richard and Claude
e9f5c606b6
feat(watchlist): batch import CSV / pasted codes into groups
...
自选页新增批量导入:支持 CSV/TXT 文件与粘贴证券代码两种来源,解析出
候选并在弹窗内确认后按 M:N 分组一次性写入(目标分组可多选或就地新建,
默认只勾新增标的,已在自选的可并入所选分组)。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 14:48:32 +08:00
wshy
7619fbcf7a
Merge pull request #210 from thinkbuf/feat/kline-preview-nav
...
feat(kline): 弹窗切股导航 + 邻股预取 + 悬停「至今」+ 外部链接
2026-09-02 13:52:38 +08:00
richard and Claude
40fea3236e
feat(monitor): add webhook test message button
...
Add a test button to the push-notification settings so users can verify Feishu and WeCom group-webhook configs after saving.
Backend: POST /api/settings/preferences/webhook-test reads the saved webhook URL/secret and sends a one-shot test message (max_attempts=1 to skip production retry backoff). All failure modes return HTTP 200 + {ok:false, detail} so the UI renders a single path.
Frontend: api.sendTestWebhook(); TestSendButton/TestResult components shared by both channels; success feedback auto-dismisses after 2s.
Tests: 7 cases covering both channels, failure modes, and single-attempt behavior.
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:36:06 +08:00
richard and Claude
0a11bb870e
fix(kline): align intraday prefetch with rendering (live & effective days)
...
Rebase 到最新 main 后,按 review 提的两点把邻股预取与真实渲染路径对齐:
- 邻股预取当日最新分时补 live=true: 与 StockMultiDayIntradayChart 的 latest 同读
实时源,盘中切股不回落分钟增量落盘的旧本地分区 (历史日期后端自行忽略 live)
- StockPanel 两处预取 days 改用 effectiveIntradayDays, 与多日图实际渲染周期一致,
range 预取 queryKey 命中, 切换分时 tab 即时有数据
- 附带清理 rebase 冲突解析产生的残留右括号与冗余注释
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:25:06 +08:00
richard and Claude
6964e1b5c9
fix(kline): two regressions found in PR review
...
- EChartsCandlestick: 悬停重置 effect 依赖补上 symbol(_symbol) ——
预取切股到同长度邻股时 data.length 不变, 原 [data.length] 不触发,
hoverActiveRef 残留导致切股后「至今/周期」无悬停仍显示 (自愈于下次 mousemove)
- Watchlist: DimensionMembersDialog 的 onStockClick 补第三参 navList ——
从成分弹窗打开个股时用成分列表作切股导航 (成员可能不在自选列表,
原实现退回自选列表, 成员不在自选则导航按钮不显示)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:15:30 +08:00
richard and Claude
341b80e7ab
refactor(kline): simplify round 2 — scope flex ratio, single-source guard and default
...
审查后清理, 无行为变更 (除下述作用域修正):
- StockPanel: 日K/分时并排的占宽从硬编码 flex-[1.4] 改为 dailyKlineFlex prop
(默认 flex-1) —— 避免静默改变 TradeKlineModal 等其他消费方的并排布局;
仅 StockPreviewDialog 显式传入 flex-[1.4]
- lib/kline.ts: klineMinuteRangeQueryOptions 内嵌「仅同 symbol」placeholderData 守卫,
与 klineDailyQueryOptions 同源, 删除 StockMultiDayIntradayChart 的内联副本
- DEFAULT_INTRADAY_DAYS 单源化: StockPanel 默认值与弹窗 loadIntradayDays 回退共用
- StockPreviewDialog: prevSymbolRef 初始值改 null (首次挂载 view 本就是 daily);
blur 复用 keydown 的 e.target(t) 替代重复 document.activeElement 查询
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:15:30 +08:00
richard and Claude
4d36a5ff20
fix(kline): blur focused control after arrow-key switching to drop stray focus ring
...
点过分时tab/外链等控件后方向键切股, 浏览器会给该已聚焦控件显示
focus-visible 默认蓝色 outline(应用未自定义 focus 样式, 即浏览器默认环)。
切股成功后 blur 掉当前聚焦元素, 一次覆盖弹窗内所有控件。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:14:14 +08:00
richard and Claude
f3b916c049
feat(kline): prefetch multi-day intraday so switching keeps intraday tab instant
...
之前邻股只预取了日K/财务/单日分时(日K视图旁的分时图), 分时 tab 用的
多日分时(klineMinuteRange)没预取 → 分时 tab 切股仍要重新加载。
- lib/kline.ts: 新增 klineMinuteRangeQueryOptions, StockMultiDayIntradayChart 与预取共用
- StockPanel: 新增 intradayDays prop, 邻股预取补充 klineMinuteRange(days) + 最新分时
- StockPreviewDialog: 把当前 intradayDays 传给两个分支的 StockPanel, 保证 queryKey 命中
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:14:14 +08:00
richard and Claude
41a97888b6
fix(kline): widen dialog, balance chart split, keep intraday view on switching
...
- 弹窗 max-w 1100→1200, 日K/分时并排改 1.4:1 (日K为主视图),
图表信息栏(悬停含「至今/周期」)有足够宽度单行容纳, 不再换行
- 修复: 分时 tab 下弹窗内切股会跳回日K —
视图重置仅在弹窗首次打开(symbol 从 null 变非空)时发生, 切股保留当前视图
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:14:14 +08:00
richard and Claude
7038c7d627
refactor(kline): simplify after review — single-source queries, sort, and nav lists
...
审查后清理, 无行为变更:
- lib/kline.ts: 新增 klineMinuteQueryOptions, StockIntradayChart/StockMultiDayIntradayChart/
StockPanel 邻股预取共用 (与 klineDailyQueryOptions 同风格单源)
- LimitUpLadder: sortLadderStocks 每 tick 只跑一次 (sortedTiers memo 供 TierGroup 与
ladderNavItems 共用), resolveExtFields 提升为 memo (原来算 4 次)
- Dashboard: rankNav 复用 toNavItems 去掉 ! 断言; onNavigate 死条件简化为 alert: undefined
- Screener: 消费 ScreenerTable 传入的 navList (成员弹窗导航不再被丢弃), 移除重复 memo
- Watchlist: nav 列表仅在弹窗打开时构建 (sortedRows 随行情 tick 重建)
- ConceptAnalysis/IndustryAnalysis: 重复的 onStockClick 内联 lambda 抽为 handleStockClick
- StockPreviewDialog: 方向键与 ESC 同层级守卫 priceAlertDraft (点位弹窗打开时不切股)
- StockPanel: 去掉冗余 tick 别名; Monitor: 去掉冗余 as NavItem 断言
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:14:14 +08:00
richard and Claude
3258325daa
feat(kline): add configurable external stock link
...
设置页新增「个股详情外链」: 可填 URL 模板(占位符 {code}/{market}/{symbol}),
信息条第一行右侧显示外链图标(新标签打开)。留空关闭。
- 新建 lib/stock-external-link.ts: load/save/build + scheme 白名单(http/https) + symbol 形状守卫
- storage.ts 新增 stockExternalTemplate kv
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:12:42 +08:00
richard and Claude
0f7c1dfe39
feat(kline): show since-prev-close change and period count on hover
...
悬停某根K线时, 图表自带信息栏额外显示「至今」(该K线昨收到最新收盘的涨跌幅)
与「周期 N」(到最新K线共多少根); 鼠标移出图表区仅隐藏该字段, 其余保持。
- updateAxisPointer 重写: 区分 悬停K线变化 与 竖虚线显隐, 分别控制信息栏重绘与副图 graphic
- 信息栏行高 height → min-height, 容纳「至今」字段不被裁剪
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:12:42 +08:00
richard and Claude
ef66877529
feat(kline): prefetch neighbor stocks and stabilize dialog height
...
切股瞬间免 loading + 弹窗高度不抖动。
- 新建 lib/kline.ts: klineDailyQueryOptions 作为日K查询唯一权威配置,
StockPanel(信息条)/StockDailyKChart(图表)/邻近预取三处共享同一 cache key
- StockPanel: 日K查询上提并新增 prefetchSymbols prop, 预取左右邻股日K+财务,
日K到货后级联预取其默认选中日分时(klineMinute) —— 日K视图并排展示的分时图也免 loading
- StockInfoBar: 无数据时保持挂载(加载态占位), 按字段配置预留行高, 高度不塌陷
- useFinancials: 抽出 financialMetricsQueryOptions 供 prefetch 复用
- StockDailyKChart: 查询改走共享 options, 移除 onDataChange 上报链路
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:12:42 +08:00