Commit Graph
633 Commits
Author SHA1 Message Date
shy3130 d29f9c0ea8 perf(data): TickFlow 取数切换 as_dataframe=False 列式直转; 修复除权因子日期 UTC 偏移一天
- 全部 K 线取数点改走 CompactKlineData 列式直转 polars (无 pandas 中转,
  全市场单轮本地转换 ~1.1s → ~0.1s), 时区口径统一 _timestamp_to_beijing_datetime
- 除权因子 trade_date 原取 UTC 日期, 北京零点事件整体早一天 → 转北京墙钟后取日期
- 盘中分钟增量间隔上限 300s → 120s (universe 仅回最新 3 根, 超限必留缺口)
2026-08-30 22:29:33 +08:00
shy3130 0417216439 Merge branch 'feat/capability-routing' (v0.2.2): 能力路由矩阵、fuyao 插件、分钟策略回测、盘中/复盘增强、首用引导改版 2026-08-30 19:47:19 +08:00
shy3130 1a7e6ad32c Merge remote-tracking branch 'origin/main' into feat/capability-routing
# Conflicts:
#	README.md
#	backend/app/backtest/worker.py
2026-08-30 19:47:11 +08:00
shy3130 80ecb6e409 chore(release): 版本号统一升级至 v0.2.2 2026-08-30 19:43:52 +08:00
shy3130 a8a6c81fff Merge remote-tracking branch 'origin/feat/volume-delta-alert' into feat/capability-routing
# Conflicts:
#	backend/app/services/quote_service.py
2026-08-30 19:42:43 +08:00
shy3130 bbe44af63b docs(readme): 声明/联系/交流群/打赏文案润色 2026-08-30 19:40:15 +08:00
shy3130 10f01ea091 style(onboarding): 不可用能力提示改为「该能力目前不可用」 2026-08-30 19:20:51 +08:00
shy3130 9a4621c8de feat(onboarding): 能力路由步骤进入时按 tickflow-fuyao-stocksdk 优先级自动设置路由 2026-08-30 19:19:08 +08:00
shy3130 dbd0e7f316 style(onboarding): 注册链接独占一行显示 2026-08-30 19:14:28 +08:00
shy3130 7ed2660d63 feat(onboarding): Key 表单附注册链接, TickFlow 链接带邀请码 2026-08-30 19:09:53 +08:00
shy3130 299790d38f docs(readme): 修改readme相关内容 2026-08-30 19:05:49 +08:00
shy3130 560a2d7735 feat(onboarding): API Key 表单常驻展开, 不再折叠收起 2026-08-30 19:05:48 +08:00
shy3130 2cd0ea987b feat(onboarding): 数据源步骤改为只读展示, 仅保留 API Key 配置 2026-08-30 19:05:48 +08:00
shy3130 0bcb0849dc feat(onboarding): 数据源步骤双 Key 入口与 fuyao 增强路由 2026-08-30 19:05:47 +08:00
shy3130 6b49231d67 feat(onboarding): 第3步由「能力探测」改为「能力路由检测」
- 以能力路由矩阵呈现(7 数据集逐行: 生效源+可用性+候选提示),
  替代以 TickFlow 档位为中心的旧视图, 多源下矩阵即真相
- 不可用行针对性提示: 有候选给「可切换候选: X」; TickFlow 未配 Key
  给「配置 Key 后可解锁」; 底部汇总 N/M 可用与 None 档说明
- 步骤名/注释同步改为能力路由; 移除不再使用的 TickFlow 档位视图代码
- 浏览器实测: 7 行矩阵渲染正确, 可用性/候选/汇总与当前环境一致
2026-08-30 19:05:46 +08:00
shy3130 3225713826 feat(onboarding): 引导页支持填写 TickFlow API Key
- 数据源卡片网格下新增入口「为 TickFlow 填写 API Key(可选)」,
  复用内联 Key 表单(TICKFLOW_API_KEY, 密码框自动聚焦)
- 文案区分: 留空=免费 None 模式可直接用, 填 Key 按档位解锁更多数据集;
  TickFlow 不自动切换数据源(与插件不同, Key 与选源正交)
- 走 /tickflow-key 先探后存: 浏览器实测假 Key 返回「Key 无效或已过期」
  且 secrets.json 未落盘
2026-08-30 19:05:45 +08:00
shy3130 a499da95c4 fix(onboarding): 引导页支持内联配置缺 Key 型插件(如 fuyao)
此前 fuyao 因未配 Key 被自检判为不可用, 向导数据源步骤按「缺依赖」
一律禁用, 文案误导(需安装依赖)且无处可配。

- 区分两类不可用: 缺依赖(真禁用) vs 缺 Key(api_key_env 声明型,
  卡片可点, 显示「需配置 API Key,点击填写」)
- 点击展开内联 Key 表单: 官网申请链接 + 先探后存(POST /plugin-key,
  无效不落盘), 验证成功自动选用该数据源
- 浏览器实测: fuyao 卡片可点、表单呈现/自动聚焦/空值禁用正确,
  无效 Key 返回实探错误且不落盘, 取消正常关闭
2026-08-30 19:05:44 +08:00
shy3130 25c2802d6f feat(onboarding): 首用引导更新为多源口径并增加后续步骤
- 获取数据说明保持数据源中立(TickFlow 免费服务器/当前源), 本地分析
  提示不再 TickFlow 专属
- FetchDataCard 增加 fuyao(同花顺 REST) Key 解锁提示(财务/龙虎榜/
  盘前风向标/竞价异动), 附设置页直达链接
- WelcomeFetchModal 新增「获取完成后的推荐步骤」: 配 fuyao Key →
  分钟落盘(可选, 分钟回测/板块分时) → 自选/策略/回测研究闭环
- tsc 通过, 看板页 HMR 后渲染正常
2026-08-30 19:05:43 +08:00
shy3130 893cf960e3 fix(chart): 关闭 lightweight-charts TradingView 归属角标
- layout.attributionLogo=false: 板块分时图与个股日K两处一致
- licence 链接要求改由 README 技术栈 Lightweight Charts 外链承担
- 实测: 个股分析页图表渲染正常, DOM 无 tv-attr-logo 残留

# Conflicts:
#	README.md
2026-08-30 19:05:35 +08:00
shy3130 3f27d412d1 docs(readme): 架构图重排为数据向上流的精简分层, 数据集口径改为多数据集
- flowchart BT: 数据源自下而上流向前端, 修正箭头方向歧义
- 节点标签精简为专业短词, 细节保留在关键机制表
- 能力路由不再写死数量(现 6 个数据集, 注册表持续扩展):
  图内改「多数据集 · 按能力独立路由」, 正文/核心功能表/features.md 同步
- 浏览器实测: 779×1045, 六层序 呈现→应用→研究→计算→存储→数据源

# Conflicts:
#	README.md
2026-08-30 19:05:34 +08:00
shy3130 b4f2605b81 docs(readme): README 按分支能力重写并新增技术架构章节, features.md 补齐
- 新增 🏗️ 技术架构: 六层 mermaid 分层图(数据源插件化/能力路由/Polars
  计算/研究执行/FastAPI 服务/React 前端) + 六条关键机制 + 技术栈表,
  数字均对照代码核验(15 列存储/68 列现算/62 因子/18 策略)
- 核心功能表/页面详情/路线图补 v0.3: 能力路由矩阵、fuyao 源、分钟体系、
  交易日探针、龙虎榜+风向标、全时段异动、导出与载入复测、成分股弹窗
- features.md 补: 分钟策略回测与结果沉淀、异动监控三tab(偏离值阈值
  按板块分档精确化)、复盘龙虎榜/风向标注入、指标现算口径
2026-08-30 19:05:33 +08:00
shy3130 75c2ab29f7 feat(frontend): 异动中心三tab、回测导出与载入复测、看板成分股弹窗与板块分时
- 异动监控重构为按交易时间线三tab: 竞价异动(风向标+当日/次日对照+追高标记,
  fuyao 未配置统一引导态)/盘中异动(信号筛选+连板/量比/振幅/换手表)/偏移异动
- 复盘页移除风向标卡片(AI 注入保留在后端)
- 回测结果导出 CSV(BOM, 概要/净值/交易明细/分标的统计四段)
- 候选方案「载入复测」: 弹窗→策略页传递, 23 项配置回填复跑
- 看板概念/行业排名行点击弹出成分股(dimensionKindForSourceField 判型),
  领涨股带涨跌幅与板块徽章
- 成分股弹窗新增板块等权分时: 双线(板块/全市场)+0%基线, 伪时间戳轴
  HH:MM 标签, 分钟未落盘引导态, 60s 轮询续期
2026-08-30 19:05:32 +08:00
shy3130 fb7785ceb9 feat(abnormal,dashboard): 盘中异动聚合、维度 source_field 与板块分时端点
- abnormal_moves 新增 build_intraday: enriched 七类当日信号聚合,
  优先级(涨停>炸板>翘板>跌停>新高>新低>放量)+涨跌幅排序, GET /api/abnormal/intraday
- 维度排名项携带 group_source 与 source_field(configId.field),
  前端可精确判定概念/行业而非字符串包含
- ext_data 新增 dimension-intraday: 成分股×当日分钟分区等权聚合,
  prev_close 优先/首根退化基准、成分网格化 ffill、全市场对照线,
  小数制涨跌幅契约、60s 进程内缓存、点击触发不预计算
- 板块分时 7 测 + 盘中异动 4 测
2026-08-30 19:05:32 +08:00
shy3130 3d627aba5e feat(recap): 盘前风向标服务与 AI 复盘注入
- fuyao 客户端新增 short-term-benchmark 端点透传
- auction_benchmark 服务: 历史按日 JSON 缓存(当日不缓存)、交易日回退、
  四态降级(ok/fallback_prev/source_unavailable/no_data)
- 读取时从相邻日K分区现算当日/次日收益对照, 不落缓存
- 复盘 user prompt 注入「盘前风向标(竞价)」上下文
- 11 个测试覆盖回退/缓存/富化数学/上下文
2026-08-30 19:05:31 +08:00
shy3130 cff3b07527 feat(recap): 龙虎榜卡片信息密度与可读性增强
- 摘要行扩为净买/净卖/机构净买/机构净卖各 Top5, 四行药丸左缘固定槽对齐
- fmtVolume 负数按绝对值分级补万/亿单位 (净卖席位原显示裸数字)
- 个股名称后复用 boardTag 加创/科/北板块徽章 (表格/药丸/游资chips)
- 三榜表格数值列头可点击排序 (升降切换, 空值恒垫底, 切tab重置)
- 游资席位金额去掉「净买」前缀
- AI 复盘提示词龙虎榜摘要四段统一 Top5
2026-08-30 19:05:30 +08:00
shy3130 381038e94f feat(recap): 复盘页龙虎榜卡片与 AI 复盘资金动向注入
- fuyao dragon-tiger-list 三榜接入 (非路由数据集, tickflow 无对应能力)
- services.dragon_tiger: 本地日K分区做交易日回退(规避接口非交易日报错), 历史日 JSON 按日缓存(不可变), 当日未发布自动回退上一期
- 卡片视觉对齐市场摘要条: 奖杯徽章/排名药丸/分段式tab/净买额比例条/席位奖牌, 收起两行摘要展开三榜明细, 点股票开日K预览
- AI 复盘 prompt 注入龙虎榜摘要段 (净买/净卖/机构/游资 Top), 未配置 fuyao 时空串不占段
- displayDate 联动: 历史复盘显示当期榜单
2026-08-30 19:05:29 +08:00
shy3130 9d290f003d feat(market): 交易日探针——工作日休市剔除行情轮询与分钟增量
- 探测链: fuyao 交易日历(权威) → tickflow 行情时间戳(5只篮子 OR 判定, 9:40 开盘缓冲窗) → None 未知回退周几近似
- 周末零成本直判; 结论分档 TTL 缓存 (交易日 1h / 休市 30min 自愈 / 未知 5min 防重试风暴), 纯读不落盘
- 实时行情: 休市日跳过轮询/盘前预热/定版, fuyao 周五数据误归属从源头消除
- 分钟增量: gate_reason 新增 holiday; 探针未知时空轮升级机制仍为第二道防线
- 实测(周六): 三层链路真实验证, fuyao 日历连调休周一均正确判休市
2026-08-30 19:05:28 +08:00
shy3130 3b09fac15e feat(realtime): 自选实时分流与数据落盘可靠性
- quote_service 实时通道重构与自选分流, 旧 watchlist 批量测试相应移除
- repository.replace_with_retry 原子写重试; pipeline_jobs 任务记录落盘
- stock-sdk provider 适配增强; 分时图组件与预览入口调整
2026-08-30 19:05:27 +08:00
shy3130 d70a960750 feat(fuyao): 日K dump 链路强化与财务数据集适配
- 财务接入(股本除外): 三大报表多期 + 指标单期, 字段映射至项目 canonical 列
- metrics: bps 由估值 pb_mrq 反推, eps_basic 取自利润表, report 期由最新披露期反查
- financial_sync 报告期合并升级为逐列填空: 多源数据并集共存, 新值覆盖缺列保留
- 前序未入库工作一并提交: 10 年/10d 日K dump、除权因子事件推导与涨跌停自检
2026-08-30 19:05:26 +08:00
shy3130 cda69fb9e1 feat(routing): 能力路由矩阵支持不可路由能力行
- CAPABILITY_REGISTRY 新增 full_minute 行 (field=None, 生效源恒为 TickFlow)
- 全量分钟排于财务数据之后; 非路由候选标签改为非交互展示保留完整高亮
- 设置页数据集标签/服务中状态覆盖非路由能力
2026-08-30 19:05:25 +08:00
shy3130 657d4d9948 feat(minute): 全量分钟能力位与两阶段日内分钟落盘
- tickflow SDK 0.1.25: intraday.universe 标的池单请求拉全市场当日分钟
- 新能力位 Cap.INTRADAY_UNIVERSE (TickFlow Expert 专有) + 探测/别名/schema v6
- 分钟刷新两阶段: 冷启动与缺口修复走 intraday_batch 全天突发(分块容错), 稳态走 universe 增量
- 覆盖看门狗: 落后>3min / 无数据 / 连续空轮自动升级全量自愈
- 刷新间隔钳制 [3,300]s 默认 6s; 监控页全量分钟开关与状态入口
- CONTRIBUTING: 分钟 K 北京时间墙钟契约 (naive, 入口强制归一)
2026-08-30 19:05:25 +08:00
shy3130 246a7df57d refactor(ui): 检测档位集群移至 API Key 标题行右侧
- 档位徽章/说明/重检测/可用功能悬停图标从卡片头部移到
  「TickFlow API Key」标题行右侧 (档位由 Key 检测得出, 语义归位)
- 卡片头部只留 第三方/已适配全档位/服务中 徽章
- 可用功能浮层锚点改右对齐, 向左展开不越入能力表栏
2026-08-30 19:05:24 +08:00
shy3130 d5582c3c8d docs(data): 沉淀能力路由矩阵契约, 同步插件接入文档
- CONTRIBUTING §4 新增「能力路由矩阵契约」: 注册表单一权威、usable 统一
  门控、能力层中立原则、独立路由禁特殊值(same_as_daily 已下线)、
  分时/depth5 边界注记
- custom-data-source: 除权因子接入示例移除 same_as_daily
- plugin-development: manifest 字段表补 homepage 可选字段
2026-08-30 19:05:23 +08:00
shy3130 6fb46b100a feat(ui): 能力徽章与数据源页重构——路由门控、中立文案、详情卡重排
- 侧栏数据源徽章: 六能力方格(按注册序) + 悬浮路由卡(逐格同色对应,
  fixed 定位逃逸侧栏裁剪, 渲染后按实际高度钳制视口防遮挡)
- 各页能力门控切换为矩阵 usable 视角: Data/Financials/Monitor 缺能力时
  提示并引导数据源配置; 门控判定不再绑定 TickFlow 套餐
- 设置页数据源区: 能力路由卡(点标签切换, 乐观更新)、TickFlow 详情改为
  左 API Key 右能力档位表、检测档位收进头部徽章集群(+/重检测)、
  可用功能收进悬停图标、订阅档位面板移除
- 插件详情与 TickFlow 同构: 能力适配表(服务中/已适配/未就绪/—) +
  Key 区申请话术嵌官网链接(manifest homepage)
- 能力层文案中立化: 通用界面不出现档位/订阅词汇, 能力不可用警示按
  usable 判定(TickFlow 档位不足与源未就绪同待遇)
- API Key 输入框与保存按钮改为一行左右布局
2026-08-30 19:05:22 +08:00
shy3130 b4aa5918fc feat(data): 能力路由矩阵落地——五档入册、除权独立路由、插件源下限放宽
- 新增能力注册表 capabilities.py 与 /capability-matrix: 六能力(实时/日K/
  分钟/五档/除权/财务)统一 candidates/pending/usable, 各页门控以 usable 为准
- 五档盘口 (depth5) 进入矩阵: tf_tier=pro, 插件数据集白名单暂未开放
- 除权「跟随日K」(same_as_daily) 下线: 每能力独立路由, 四处跟随解析移除,
  存量旧值经 preferences getter 回退 tickflow 自愈; 矩阵显示与实际拉取口径一致
- 实时轮询下限: 路由到插件/自定义源时不受 TickFlow 档位限速, 通用下限 1s
  (默认间隔仍 6s, TickFlow 路由档位查表不变)
- 插件 manifest 新增 homepage 透传; loader 输出 api_key_masked (Key 脱敏
  与 TickFlow 同一展示契约); fuyao 声明官网
2026-08-30 19:05:21 +08:00
shy3130 578a531743 fix(data): 自定义源比例字段单位改为显式声明 pct_unit 未声明 fail-closed
amplitude/turnover_rate 的百分制与小数制数值区间重叠(0.05 既可能是
0.05% 也可能是 5%), 截面中位数启发式不可判, 赌错即整体放大 100 倍,
违反 CONTRIBUTING §3.1 禁止启发式转换的约束。

- realtime 数据集新增 pct_unit: percent|decimal 显式声明, 声明即契约
  (percent 无条件 /100, decimal 无条件透传, 不受数值外观影响)
- 未声明时 change_pct 保留涨跌停 30% 上限的截面判定(物理可判),
  amplitude/turnover_rate 置 None 交 enriched 管道按价格/股本口径重算
  并记录 WARNING; 已配置 transforms 的列视为用户接管单位, 透传
- 配置解析/清洗/序列化全链路校验取值, 非 realtime 数据集声明即报错
- 契约测试重写覆盖声明优先、边界值、fail-closed 与 transforms 兼容
2026-08-30 19:05:20 +08:00
shy3130 0b4bde6dda feat(fuyao): 快照单页 limit=6000 一次拉完全市场
实测服务端单页 6000 不截断(全市场 ~5600 只), 一轮轮询从 11 请求降到
1 请求, 大幅降低 4001 限频压力; 分页循环保留作未来扩容/服务端截断兜底。
插件开发文档重写并补充单页上限实测结论与页间隔自限速要求。
2026-08-30 19:05:20 +08:00
shy3130 b8fa08f027 fix(worker): 消除回测子进程结果消息丢失竞态
现象: 整年区间回测偶发 'backtest worker exited without result (exitcode=0)'。
根因: 子进程 event_queue.put 只是把消息交给后台 feeder 线程, 主线程随即退出,
feeder 随进程销毁, 大结果/高负载下消息尾部未刷入管道; 父进程 0.1s 轮询
恰在 Empty+进程已死时跳出循环, 未读到的 result 被丢弃。

修复 (双侧):
- 子进程 finally 中 close+join_thread 队列, 保证退出前消息完整刷入管道
- 父进程在判定无结果前做一次兜底排空 (join 后 1s×2 轮 get)
2026-08-30 19:05:19 +08:00
shy3130 d4aa9ed6ad test(backtest): 分钟回测守卫与六项语义测试
- _guard_minute_strategy_backtest: 非股票资产与回测起点早于本地分钟K起点
  均返回 400 并提示「扩展分钟K历史」, 覆盖 run 与 SSE stream 两入口
- 合成分钟分区+日线面板夹具, 断言: 触发分钟收盘成交价/日线窗口严格止于
  T-1 的因果性/涨停拒买计数/缺分区日跳过/离场走日K次日开盘/入口守卫
2026-08-30 19:05:18 +08:00
shy3130 d9f7bc645d feat(backtest): 回测页支持分钟策略与分钟级成交展示
- 策略下拉改取 'all' 时段, 分钟策略入列表并加 sky 色「分钟」徽章
- 选中分钟策略条件化 UI: 隐藏分钟成交开关与 signal_next_minute,
  建仓口径固定显示「信号分钟收盘」, 展示本地分钟K覆盖提示与起始日越界警告
- 交易明细买入列渲染 HH:MM 分钟徽章 (entry_date 携带 YYYY-MM-DD HH:MM)
- SSE 连接前先 fetch 探测, HTTP 400 直接展示后端 detail,
  不再误入 EventSource 无限重连
2026-08-30 19:05:17 +08:00
shy3130 0559632de6 feat(backtest): 分钟策略回测 v1 — 逐交易日回放信号分钟收盘入场
- 新增 MinuteSignalReplayer: 枚举区间内分钟分区日, 逐日组装 StrategyDataContext
  (timeframe=1m, 日线窗口严格止于 T-1) 并复用 strategy_engine.run, 与实盘选股同路径
- 缺分区日显式跳过并记入 skipped_days, 不回退最近分区
- 涨停拒买: 信号分钟收盘 >= 当日涨停价(T-1 raw_close + 板块幅度)剔除并计数
- MarketMatrix 新增 entry_price 覆盖矩阵, 引擎在有限值处优先于 open/close 惯例
- repository.list_minute_dates 按目录名枚举分钟分区日, 零 parquet 扫描
- strategy.run 增加 minute_filter 分支: 入场 delay 0/离场沿用日K matcher,
  trades.entry_date 补全为 YYYY-MM-DD HH:MM (北京时间)
2026-08-30 19:05:16 +08:00
shy3130 d9ff91fa12 fix(dialog): 日K视图左右双栏同步实时刷新 — 蜡烛与内嵌分时接入独立轮询
上个提交只覆盖了「分时」标签页 (StockMultiDayIntradayChart); 默认日K视图
的 StockPanel 双栏仍不刷新:
- 左侧蜡烛 (StockDailyKChart): 日K查询挂载后从不轮询, 今日实时蜡烛
  (后端 _maybe_inject_live_candle 注入) 不随行情更新 → 透传
  refetchIntervalMs 到 StockDailyKChart 接入同一轮询
- 右侧内嵌分时 (StockIntradayChart): 对话框漏传 refetchIntervalMs 给
  StockPanel 日K分支, 且请求未带 live → 补传参数; 轮询上下文中
  klineMinute 带 live=1, 当日盘中直接实时拉取 (历史日期后端自行忽略)

浏览器实测 (实时行情关闭): 日K视图下 kline/daily 与
kline/minute?date=当日&live=1 均以约 6s 节奏持续轮询
2026-08-30 19:05:16 +08:00
shy3130 974a3dccd2 chore(dialog): 移除 StockPreviewDialog 残留的 useQuoteStatus 导入 2026-08-30 19:05:15 +08:00
shy3130 08701f8886 fix(kline): 个股详情分时图独立轮询, 盘中直接实时拉取最新K
- /api/kline/minute 新增 live 参数: 当日连续竞价时段跳过本地优先直接
  实时拉取, 避免盘中分钟增量落盘后 90% 完整度启发式让详情分时图停在
  上一增量轮 (>=60s 滞后), 与行情列表节奏脱节
- StockPreviewDialog 打开即独立轮询 (间隔沿用偏好, 默认 6s), 不再要求
  「分时刷新开关 + 实时行情运行」双条件 — PR #114 引入的门槛默认冻结详情图
- market_time 抽出公共 in_continuous_session, minute_refresh 复用同一实现
- 新增 12 个单测覆盖 live 路径, 本地回退与连续竞价时段边界
2026-08-30 19:05:14 +08:00
shy3130 7ceddc0669 docs(test): 分钟红7夹具注明与运行时副本的双位置关系 2026-08-30 19:05:13 +08:00
shy3130 68579f1b10 style(screener): 分钟周期徽章换 sky 色系, 与 AI 来源徽章的紫色区分 2026-08-30 19:05:12 +08:00
shy3130 9593883c59 refactor(strategy): 分钟红7由内置策略改为自定义策略
按用户要求, 分钟红7不再是产品内置形态, 以自定义策略形态交付:
- 移除 app/strategy/builtin/minute_red_streak.py; 运行时副本落在
  data/strategies/custom/ (gitignore, 用户可自行修改调参)
- 策略 id (minute_red_streak) 不变: 参数覆盖 / 策略池引用 / minute_filter
  契约 (daily_history_bars + daily= 注入) 全部不受位置影响
- 仓库保留参考实现作为测试夹具 (tests/fixtures/strategies/),
  25 个行为测试改由夹具加载, 引擎加载测试同时断言 source == "custom"
- builtin 相关不变量更新: 内置 19 个全部 matrix_native, 无 minute_filter

本地验证: /api/strategies/reload 后 source=custom, 08-25 分区分钟扫描
命中 5 只 (用户实盘参数: 6根开5红+最高2红+20日涨停过+沪深主板50-200亿)。
2026-08-30 19:05:11 +08:00
shy3130 8ccb681214 feat(settings): 补全设置卡片定位闪烁锚点体系
此前「从业务页引导去设置」只有 depth-fix 一处孤例 (SealedBadge → 连板
梯队修正卡片闪烁), 其余 8 个引导链接只带 tab 参数跳转, 用户落地后要
自己在设置页里找目标卡片。

- 通用锚点机制: useCardFlash hook (/settings?tab=X&highlight=<anchor>
  打开时目标卡片 scrollIntoView 居中 + ring 高亮 2s, 一次会话仅触发
  一次防 StrictMode 重放) + AnchorWrap 包裹层 (无统一 Card 组件的面板用)
- Settings 把 highlight 传给全部面板 (面板类型本就声明了 highlight?: string)
- 锚点落位: 监控页 Card 组件 anchor 化 — quotes(行情轮询)/webhooks(推送
  通知)/minute-refresh(盘中分钟增量)/intraday-refresh(分时图刷新)/
  depth-fix(原实现迁移到统一机制); AI ai-connection; 数据源 data-sources;
  信号库 signals
- 8 个引导链接补 &highlight=: RuleEditor/Review webhook 未配置提示 →
  webhooks; Layout 实时无权限/监控入口 → data-sources/quotes; Data 页
  数据源入口 → data-sources; 信号触发器 → signals

验证: pnpm build 通过; 浏览器实测 8 个锚点全部滚动定位+闪烁; 顺带补验
40e54ea 统一策略池欠的界面项 (双池→统一迁移 17/33、分钟徽章、三态筛选
只过滤显示不动池、ETF 视角无分钟策略、分钟卡片实时单跑)。
2026-08-30 19:05:10 +08:00
shy3130 a342d94238 feat(screener): 策略池统一 — 日线/分钟合并单池, 执行按策略声明周期路由
原设计: 日线/分钟双池隔离 (strategy-pool / strategy-pool-1m), 页面按
周期开关切换两套世界。拆池根因是列表按周期过滤 + 页面级周期切换: 分钟
视角下池内日线策略解析不到才显示「失效」, 属于修补表象而非消除根因。

- 池合并: 双 key 一次性迁移为单池 (日线在前、分钟在后、按 ID 去重,
  完成后删旧分钟 key 保证幂等, StrictMode/HMR 重放安全)
- 执行路由真相来源从 UI 开关改为策略自身 timeframes 声明: 日线走盘后
  缓存/runAll, 分钟走本地分钟K分区实时单跑 (卡片点击/参数保存重跑均
  按各自周期传参)
- 周期开关降级为三态显示筛选 (全部/日线/分钟, 默认全部), 只过滤卡片
  显示, 不影响池与执行; runAll 自动跑仅覆盖池内日线子集
- ETF 置灰移除: 分钟策略 asset_types 仅股票, ETF 列表自然不含
- 池对话框取全量列表, 待选/已选两侧显示「分钟」徽章; 失效判定回归
  全周期合并列表, 消解「切视角整池失效」问题类别
- 后端零改动: /api/strategies 的 timeframe 为空本就不过滤, 前端 'all'
  时省略参数; 其余依赖默认日线过滤的 strategyList 调用方行为不变

验证: pnpm build 通过; git diff --check 干净; 3 处 run.mutate 调用点
均带周期参数; 迁移幂等路径 (双池/仅分钟/空池) 走查通过。界面手工验证
待实机执行 (池迁移/分钟徽章/筛选空态/ETF 视角)。
2026-08-30 19:05:10 +08:00
shy3130 b82c4eaedb feat(minute): 分钟红7新增「N日内涨停过」条件 + minute_filter 日线窗口契约
分钟策略此前只能访问当日分钟窗口, 无法叠加日线维度条件。本次为
minute_filter 后端扩展可选日线历史契约:

- 契约: 策略声明 META["daily_history_bars"] (0-250) + filter_minute_history
  接受 daily 关键字 (加载期校验, 纯分钟策略零改动); 引擎聚合各策略声明
  (minute_daily_history_bars) 后由 ScreenerService 1m 分支装配
  context.daily_history (enriched 日线窗口), run() 以 daily= 注入
- 分钟红7: require_limit_up (默认开) + limit_up_days (5-60, 默认20) 参数;
  涨停判定复用 enriched 预计算信号 signal_limit_up (收盘封板) 或
  signal_broken_limit_up (炸板盘中触及), 任一命中即算涨停过, 输出
  recent_limit_ups 次数列; 日线窗口缺失时失败闭合 (宁可漏过不可错报)
- 测试 25 项: 涨停信号过滤/炸板计数/回看窗口边界(第20日含第21日不含)/
  失败闭合/开关旁路/加载校验(缺 daily 关键字与超范围)/引擎注入/服务装配

实盘验证: 用户参数(bars=6)基线 24 只 → 要求涨停过后 6 只, 全部带
recent_limit_ups; 全量 1112 项后端测试通过。
2026-08-30 19:05:09 +08:00