Commit Graph
100 Commits
Author SHA1 Message Date
shy3130 d266131f90 Merge branch 'pr-213' into merge/pr-213 2026-09-01 22:33:28 +08:00
shy3130 e8c870af73 Merge branch 'pr-219' into merge/pr-221-220-219 2026-09-01 22:20:01 +08:00
shy3130 d0595eb4d7 Merge branch 'pr-220' into merge/pr-221-220-219 2026-09-01 22:20:01 +08:00
shy3130 a9c00fd567 Merge branch 'pr-221' into merge/pr-221-220-219 2026-09-01 22:20:01 +08:00
shy3130 c7a921cc60 merge: feat/full-minute-dataset (全量分钟数据集开放) 合入 main
分支已含 main 全部提交, 合并前验证: 涉改 106 用例 + 前端 tsc 零错误
+ 全量 1340 passed (test_mining_manager 偶发为存量, 合并前 main 可复现)。
2026-09-01 13:13:49 +08:00
shy3130 95cd99ab8c merge: 同步 main (辐射本地读 + 传输压缩/网络设置) 到全量分钟分支
冲突两处均为 minute-refresh status 字段两侧各自新增, 两者全保留
(healthy + provider/provider_effective/repair_only)。
2026-09-01 13:05:21 +08:00
shy3130 bc9461da9a feat(net): 分时/日K批量响应可选 gzip 压缩与网络设置
- _gzip_payload: 偏好开启 + Accept-Encoding 协商 + 超 1KB 才压
  (level 6); datetime 序列化与非压缩路径一致, 保证 since 增量
  字符串字典序合并不受影响
- minute-batch / daily-batch 端点各自独立偏好键, 逐请求即时生效;
  实测分时 9.1MB→1.28MB (86%), 日K 736KB→156KB (79%)
- 超时设置 tab 更名网络设置, 卡内新增压缩区: 大开关 OR 联动
  (任一子开即亮, 全关才灭, 点击全开/全关) + 分时/日K两个子开关
- preferences.save() 加线程锁: 修复并行 PUT read-modify-write
  互相覆盖 (总开关批量关不齐的根因), 存量偏好写入一并受益
- 测试: 双端点压缩/关闭直通/无协商头直通/偏好默认 + 并行 save 竞态
2026-09-01 13:04:00 +08:00
shy3130 f84cb671ef feat(data): 全量分钟健康时策略页与监控注入切读本地分时
- 策略页: healthy 时解除分时列 100 只截断并 prefer_local 读本地分区
- 监控信号注入: 股票 healthy 时直接读本地当日分区, 免每分钟 bucket
  一次的全量 API 拉取; ETF 不在服务 universe, 不健康/读失败回落原路径
- minute-refresh status 增加 healthy 读侧新鲜度字段 (前端共享判断)
- 测试: 注入本地读 3 用例 (健康读本地/不健康回落/ETF 恒走 API)
2026-09-01 13:03:54 +08:00
shy3130 010c484289 feat(data): 全量分钟 (full_minute) 数据集开放插件/自定义源接入
像其他能力一样可路由: 声明 full_minute 数据集并在设置页路由, 即接入
盘中全市场分钟落盘服务 (与 TickFlow Expert 同一能力键 intraday.universe)。

- policy: _DATASET_CAP_MAP 增补 full_minute → INTRADAY_UNIVERSE, 自定义源
  声明且被路由时自动补授能力, 服务门控对两类源统一口径
- capabilities 注册表: full_minute 从不可路由 (field=None) 改为
  full_minute_data_provider 偏好路由; preferences/settings API 收发新字段
- 插件契约: get_intraday_batch (修复轮, 未实现回退 get_minute 当日窗口) +
  get_intraday_latest (稳态增量, 可选; 未实现降级仅修复轮, 节奏下限 60s)
- YAML 声明式源: full_minute 数据集与 minute 同形, loader 白名单放行,
  源编辑器 UI 可配置; 仅修复轮语义
- kline_sync 边界: fetch_intraday_custom_batch / _fetch_intraday_custom_latest,
  帧过北京墙钟守卫, 与 TickFlow 边界函数同纪律
- minute_refresh: 删「自定义分钟源让位」逻辑, 改按路由取数;
  status 增 provider / provider_effective / repair_only
- 前端: 监控页卡片按能力驱动, 数据源页路由矩阵, api.ts 类型
- 测试: 门控/路由/降级/增广新增用例, 后端 1332 全过
- 文档: plugin-development / custom-data-source / configuration / features /
  CONTRIBUTING 契约细化 (AI 可照文档接入)
2026-08-31 22:53:24 +08:00
shy3130 dab8a2c676 test(screener): 矩阵策略计数 18→25 — 补 58f8d7b 新增 7 策略漏改 2026-08-31 22:53:12 +08:00
shy3130 5757950e45 docs(data): 补全量分钟 (full_minute) 能力接入说明
- 定位为独立能力: 当前接入方式为 TickFlow Expert, 而非档位封闭功能
- configuration.md: 档位表 Expert 行补全量分钟 + 新增接入小节 (配 Key→检测→
  开实时行情→自动落盘, 修复轮/增量轮/时段/幂等行为, ETF 不在标的池)
- features.md / plugin-development.md: 增对应条目与插件现状说明
  (数据集暂未纳入 loader 白名单; 自定义分钟源在位时内置服务让位)
2026-08-31 22:36:19 +08:00
shy3130 bdad0fefb5 feat(screener): 策略列标签折叠 — 表头全表开关 + 行级展开
- 默认收起: 每行显示前 N 个策略 + 计数 (跟随列设置"显示前N个", 未配置默认 3)
- 表头图标切换全表展开/收起, 收起时清除行级展开状态, 状态持久化
- 排列方向始终跟随列设置 tagLayout (展开不再强制横向)
2026-08-31 22:30:45 +08:00
shy3130 2fc7d3f439 feat(screener): 策略池支持一键清空与本组全加 2026-08-31 22:30:44 +08:00
shy3130 58f8d7b883 feat(strategy): 新增 7 个矩阵原生内置策略, 公开计数 18→25
- 趋势/形态: 均线粘合突破 · 平台整理突破 · 放量创60日新高
- 量价/涨停: 涨停基因活跃股 (max_change_pct 参数过滤当日已大涨)
- 反转/波动: MACD 零下回升 · 长下影反击 (close_position>=0.5 兼容假阴线) · RSI 中轴回踩
- 阈值统一小数制口径 (change_pct/momentum 除以 100), 一致性测试计数 26
2026-08-31 22:30:44 +08:00
shy3130 be799abfa0 fix(intraday): since 增量时区崩溃 — 客户端直传原始时间串, 服务端归一 aware 输入
客户端 toISOString 生成带 Z 的 UTC, Python 3.12 解析为 aware datetime,
与行内 naive 北京时间比较 TypeError (第二轮轮询 500), 且换算差 8 小时。
- 客户端: since 直接回传最旧最后一根的原始 datetime 字符串 (同格式同时区,
  字典序即时间序), 消灭一切换算
- 服务端: fromisoformat 后 aware 输入先转北京墙钟再去 tzinfo, 防御旧客户端
2026-08-31 22:01:46 +08:00
shy3130 ed2f81c312 feat(realtime): 首用门禁 — 本地无数据时禁止开启实时行情
日K/enriched 均空 (与看板首用弹窗同口径) 时开启实时行情返回 409 并给
同步指引, 不落偏好。展示/监控/梯队全部依赖本地数据底座, 空数据下轮询
只是空转耗配额且缺 instruments 维表。只拦开启不影响关闭, 已开后清库
下次重开自然被拦。
2026-08-31 21:45:07 +08:00
shy3130 320969497a perf(intraday): 分时链路增量传输 + SSE 续画 + 视口感知
- minute-batch 支持 since 增量响应: 只回 >= since 的K (含动态最后一根),
  客户端按 (symbol, datetime) upsert 合并, 轮询流量从全天序列降到每轮一两根
- 自选分时 SSE 续画: enriched tick 前端续写分钟序列最后一根/滚动追加新K
  (纯视图叠加不写缓存, 服务端定版值始终权威); tick 新鲜时轮询降为 30s 兜底
- 视口感知: 从虚拟器直读渲染中 symbol 集合 (可见+overscan), 数据层只拉视口内;
  since 只按本轮请求集合取最旧尾部, 视口外落后不放大窗口; 集合变化 300ms
  防抖补拉; 剔除指数保持端点契约
- since 过滤专项测试: 含 since 当根 / 早于全部K / 无 since 三态
2026-08-31 21:45:06 +08:00
shy3130 869c49bb0b fix(kline): 分钟增量起点改为最后一根本身 — 形成中的动态K需重拉覆盖 2026-08-31 20:54:56 +08:00
shy3130 b78ba9940d perf(kline): 分钟批量补拉取到即落盘 + 尾部增量窗口
- 补拉结果经 _write_minute_partition upsert 落盘 (持仓库写锁, 与全量分钟
  服务/盘后同步同一纪律), 下一轮命中本地, 大自选从每轮全天重拉降为增量
- 完整性判定由 0.9 根数比例改为 期望-2 根: 比例阈值会让持久化数据在 90%
  处冻结尾巴
- 分类三态: fresh 直读本地零请求 / 尾部落后从最后一根+1min 增量拉 /
  中间有洞 (间距非 1min/午休 91min) 退回全天重拉回填, 防增量窗口漏数据
- 落盘失败降级为仅返回本轮数据 (持久化是优化而非正确性前提)
2026-08-31 20:53:23 +08:00
shy3130 bfe01e06d9 feat(data): 无除权因子能力时同步前置二次确认
除权因子不可用时同步静默降级 (日K不复权入库、enriched 直接用 raw 价),
此前无任何提示。现于两个同步入口 (数据页同步按钮、首用欢迎弹窗开始获取)
检测能力矩阵 usable 标志, 不可用先弹确认: 告知不复权口径与除权事件后
需重新校准, 支持不再提示 (localStorage)。矩阵未加载完成时 fail-open 不拦截。
2026-08-31 20:34:27 +08:00
shy3130 bfc2eede3e style(monitor): 设置监控页右列「全量分钟」移至「连板梯队降级修正」上方 2026-08-31 20:04:14 +08:00
shy3130 bfcad563d3 feat(frontend): 自选分时请求带 prefer_local, 策略页行为不变
- klineMinuteBatch 加 preferLocal 参数, 响应类型补 full_minute_local
- 仅 Watchlist 分时轮询传 true (全量分钟健康时股票不走批量补拉);
  Screener 不传, 严格限定本轮只辐射自选场景
2026-08-31 17:10:09 +08:00
shy3130 df5cae143e feat(minute): 自选分时接入全量分钟本地供给 (prefer_local + freshness 判定)
- MinuteRefreshService.is_healthy(): 偏好开 + 线程活 + 最近一轮距今
  ≤ max(2×间隔, 30s)。last_round_at 只在取数+落盘成功后更新, 连续失败
  自动超时判不健康, 冷启动修复轮期间天然不健康
- /api/kline/minute-batch 加 prefer_local 标志: 服务健康时股票 incomplete
  不再批量补拉, 本地有多少给多少 (服务下一轮落盘补全; 停牌票补拉也是空,
  无损); ETF 不在全量分钟 universe 内维持补拉; 不健康回落现状兜底。
  响应加 full_minute_local 标记
- 大自选 (数百上千只) 不再每 6s 轮询持续打批量分钟接口
- 4 个新用例: 健康跳过股票补拉/ETF 仍补, 不健康回落, 无标志不受影响,
  is_healthy 三条件边界
2026-08-31 17:10:02 +08:00
shy3130 6d72efc624 docs: 指数固定清单契约 + 自定义源指数补充协议
- CONTRIBUTING 能力路由矩阵小节: 实时指数为产品级固定契约不走路由矩阵
  (index_const 单一权威, 指数页固定四只, 指数偏好已删, 监控标的不受限);
  自定义源 get_realtime_indices 可选协议与 fuyao 连坐语义注记
- plugin-development: get_realtime_indices 方法契约与软失败语义
2026-08-31 16:50:38 +08:00
shy3130 58b86a962b feat(frontend): 指数页固定核心四只, 删除全指数搜索与侧栏指数配置
- /indices 指数页保留: 左侧固定核心四只(核心指数卡片), 删除搜索框与
  全量指数列表; 右侧日K/分时详情与同步指数日K按钮不变
- 侧栏指数条固定四只常驻显示, 点击跳指数详情
- 监控设置"左侧菜单指数"配置卡删除(四选多选+固定显示开关)
- api.ts: 删 indexList/indexSearch, Preferences 移除 5 个指数偏好字段;
  queryKeys 同步清理
2026-08-31 16:50:28 +08:00
shy3130 3c6ed99922 feat(index): 指数收敛为固定核心四只 + fuyao 指数快照接入
- 新建 app/services/index_const.py 单一权威: 展示层固定四只核心指数
  (上证/深证成指/创业板/科创综指), quote_service/overview/
  market_overview_builder/sector_monitor 四处重复定义全部收敛
- fuyao 插件接入指数快照端点 (/api/a-share-index/prices/snapshot):
  client 增加 index_snapshot (批量上限 627 码), provider 实现可选协议
  get_realtime_indices — .BJ 后缀先行过滤 (未知代码整批 1002 连坐),
  volume 不做股转手; 修复 fuyao 路由下指数冻结在日K兜底的 bug
- quote_service 自定义源分支鸭子类型调用 get_realtime_indices 补拉指数,
  请求清单 = 核心四只 + 启用指数监控规则标的; 未实现的源走日K兜底
- TickFlow 分支指数固定按码显式拉取, 移除 CN_Index 全量 universe 与
  mode core/all 分支; 指数落盘固定 merge 不截断
- 指数偏好全套下线: realtime_index_symbols / sidebar_index_symbols /
  indices_nav_pinned / realtime_pull_index / realtime_index_mode
- /api/index/list 与 /search (全指数浏览搜索) 删除; daily/minute 保留
  供指数详情页, sync_instruments/sync_daily 保留供数据页
- sector_monitor 指数标的恒可监控, catalog 签名不再依赖指数偏好
- 新增 7 个用例: 指数快照映射/.BJ 过滤/软失败 + 自定义源指数补充链路
  (含监控规则并入/无协议源静默/指数失败软降级)
2026-08-31 16:50:21 +08:00
shy3130 e287a55e82 fix(capabilities): redetect 同步刷新 app.state 快照并升级 tickflow SDK 0.1.25
- /api/capabilities/redetect 重新探测后同步写回 app.state.capabilities,
  minute_refresh 等门控服务即时读到新档位, 不再需要重启
- tickflow 0.1.24 缺 intraday_universe 方法导致 Expert 档全量分钟探测失败,
  升级到 0.1.25
- 全量分钟轮次异常与模式补充 warning 日志, 便于线上诊断
2026-08-31 16:50:12 +08:00
shy3130 4d27f3139e Merge branch 'feat/capability-routing': TickFlow 列式直转提速与除权因子时区修复, 分钟增量间隔上限 120s 2026-08-30 22:29:57 +08:00
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
shy3130 bfa87d1f0b fix(screener): 策略池按日线/分钟周期隔离, 修复分钟视角下整池显示失效
原设计: 日线/分钟共用一份策略池。切到分钟模式后, 池中 15 个日线策略
在分钟策略列表里解析不到, 策略池对话框右侧全部标成「失效」; 此时确认
还会把混合名单回写全局池, 日线池同样被污染。

- 池按周期隔离: 'strategy-pool' (日线, 沿用原 key 存量无损) +
  'strategy-pool-1m' (分钟, 新 key); useStrategyPool(timeframe) 返回
  当前周期的池, 任一池变更幂等落库双 key, 切换周期不会交叉写
- 「失效」徽章回归本义: 仅当策略真被删除 (不在本周期列表) 时出现
- prune 解除仅日线限制: 各周期用自身策略列表清理各自的池, 互不误删
- 策略构建器/叠加策略创建的是日线策略, 固定入日线池 (即使分钟页保存)

验证: 分钟对话框无失效列表、可正常添加分钟红7; 日线 15/31 ↔ 分钟 1/1
往返切换稳定; 刷新后双池持久。

注: 开发中 vite HMR 热替换瞬间曾把本地日线池写空 (旧代码对话框与新
模块混布的开发态一次性产物, 生产构建无 HMR 不受影响); 已从用户截图
复原原 15 策略及顺序 (boll_breakout → five_consecutive_yang)。
2026-08-30 19:05:08 +08:00
shy3130 1746a0e305 feat(minute): 分钟红7改用开盘窗口 + 盘中增量卡片移至设置右列
分钟红7: 检查窗口从「最近7根」改为「当日最早7根(开盘7根)」—
捕捉开盘急拉形态, 窗口在早盘即固定, 不随盘中新K线漂移;
close 取开盘窗口末根收盘价 (基础过滤口径同步更新)。

- 窗口选择: tail → head (sort 后 int_range < bars), 输出列契约不变
- 新增两个区分性测试: 开盘命中后转绿仍命中且 close 取窗口末根;
  开盘不足红K数、尾盘转红不救回 (旧最近窗口口径会命中)
- 实盘验证: 252 只命中, 每只窗口末时间均为 9:36 (开盘第7根)
- 设置页「盘中分钟增量」卡片从左列顶部移至右列 (连板梯队修正之后)

注: 本地 runtime 覆盖文件 minute_red_streak.json 的 description
快照已同步新文案 (gitignored, 不入库)
2026-08-30 19:05:07 +08:00
shy3130 2f8d1e5e60 refactor(settings): 盘中分钟增量刷新开关迁至实时监控设置
该功能是交易时段常驻运行的实时服务, 心智模型归实时行情设置更合理;
数据页分钟K弹窗还原为纯盘后批量同步语义。

- 配置端点归属迁移: minute_refresh_enabled/interval 由 PUT
  /api/settings/preferences/realtime-monitor 拥有 (set_realtime_monitor_config
  写入 + getter 返回, clamp [60,300] 不变); minute-sync 端点还原原状
- 前端 Monitoring.tsx 新增「盘中分钟增量」卡片 (开关/间隔滑杆 60-300s/
  运行轮次状态行), 沿用 Card/ToggleRow/滑杆防抖既有模式
- MinuteSyncConfig 移除盘中增量区块; api.ts updateMinuteSync 还原 3 参签名
- 新增归属测试: realtime_monitor_config 拥有 refresh 键且越界 clamp

验证: 28 项分钟相关测试通过; UI 开关双向回路 (curl 置开→UI 显示开,
UI 点击→偏好翻转 False 且服务 gate_reason=disabled); 数据页弹窗无残留
2026-08-30 19:05:06 +08:00
shy3130 5e2358ce48 feat(minute): 分钟策略执行后端 + 分钟红7策略 + 盘中增量落盘 (Expert)
一期 · 分钟策略执行链路:
- 引擎新增 minute_filter 执行后端: 策略声明 filter_minute_history(df, params),
  timeframes 必须且仅为 ["1m"]; 输入为当日分钟K窗口, 命中行事后联表 enriched
  快照补基础过滤列 (name/total_shares/change_pct), close 用最新分钟价
- 内置策略「分钟红7」(minute_red_streak): 最近 N 根(默认7)分钟K至少 5 根
  close>open, 且按最高价排序的最高的 2 根全红; 全向量化, 671k 行约 230ms;
  参数 bars/min_red/top_red/rank_by_close, 不足 N 根不触发, 同值取更晚K线
- ScreenerService 1m context: 优先读 as_of 当日 kline_minute 分区, 缺失回退
  全市场最近分区; 单分区直读与全量 glob 解耦
- run_preset/run_all 分钟周期结果不写日线盘后缓存 (语义隔离)

二期 · 盘中分钟增量落盘 (Expert 专有):
- kline_sync.fetch_intraday_full_market_burst: intraday.batch 独立限流池,
  全市场 5546/200=28 块线程池一次打出, 轮内不重试
- MinuteRefreshService: 后台线程, 门控链 = 开关→自定义分钟源让位→INTRADAY_BATCH
  能力→连续竞价时段(9:30-11:30/13:00-15:00); 固定节奏 next=max(起点+间隔,完成),
  不补跑; 每轮单次合并落盘 (_write_minute_partition unique 幂等)
- 偏好 minute_refresh_enabled(默认关)/minute_refresh_interval([60,300]s 默认60);
  GET /api/settings/minute-refresh/status 状态端点

前端:
- 策略页日线/分钟周期切换 (1m 下 ETF 置灰、不触发盘后 runAll、prune 仅日线),
  策略卡片「分钟」徽章, 策略池对话框按周期拉取
- 数据页分钟K设置弹窗新增盘中增量区块: 开关/间隔(60-300s)/能力缺失置灰/
  服务状态行(运行中·时段暂停·最近一轮)

测试: 26 项新增 (形态7/引擎4/context4/服务11), 更新 3 个 matrix 不变量测试;
全量 1112 passed; 前端 build 通过; 浏览器端到端实测通过
2026-08-30 19:05:05 +08:00
shy3130 afbf432eae fix(backtest): 子进程退出收尾超时不再丢弃已送达的回测结果
终态消息入队后显式冲刷队列并以 os._exit 立即退出, 跳过大数据量下
可达数十秒的解释器 teardown (GC/DuckDB 线程 join/DLL 卸载); 父进程
在子进程超时未退出时改为强杀并采纳已送达结果, 记录 worker_exit_forcibly
指标, 错误场景优先抛出 worker 真实异常。
2026-08-26 22:07:40 +08:00
shy3130 55b8e739c3 fix(mining): enriched 数据并发更新时重读快照而非整轮失败
用户在数据更新进行中跑挖掘: 面板读取期间 enriched 发布提交新世代,
assert_data_generation 直接抛 EnrichedGenerationUnavailableError,
整轮运行作废且只留一句英文堆栈; 启动接口撞上发布中状态还会 500。

- mining_runtime: 面板+撮合矩阵读取包进有限重试环 (默认 3 次)。
  世代变化时丢弃半新半旧的读取, 用新世代整体重读; 发布未完成时先等
  5s; 耗尽后以带指引的中文错误终止。排队指纹仍只在首轮校验, 重试跟随
  新世代等价于"更新后立刻重跑"
- api/mining: build_data_fingerprint 撞上发布中状态映射为 400 中文
  提示 (原来未捕获直接 500), 前端 task.error 红字通路直接可见
- 测试: 读取中单次世代漂移重读后成功 / 持续漂移耗尽后带指引失败 /
  发布中启动返回 400; 全量挖掘回归 103 passed
2026-08-26 13:19:16 +08:00
shy3130 de51929a44 fix(mining): 市场环境数据缺失时挖掘启动即失败并前置提示
用户在未计算市场环境的数据目录跑挖掘: 搜索阶段的 regime 评估被
evaluator 软捕获成 error 字符串, 整轮嵌套搜索照常跑完后, artifacts
阶段的 _regime_date_count 硬抛 ValueError, 计算全部浪费且只在最后
给出指引。

- mining_runtime: require_regime 时在因子面板就绪后立即用与
  artifacts 相同的 fold 口径预构建一次 regime mask (required 区间取
  全部外层 fold 测试窗并集), 数据为空/覆盖不完整即刻带指引消息终止
- MiningWorkbench: 启动前查询 /api/regime/latest, 未计算时侧栏显示
  警告横幅(直达数据页)并在开始时 toast 阻止, 避免产生必败的运行记录
- 测试: 缺数据 fail-fast / 覆盖充足通过 / fold 窗口内缺口报错 三例
2026-08-26 12:55:38 +08:00
shy3130 f7b5f13945 feat(monitor): 轮询放量监控 — 相邻快照成交量/额差值阈值告警
新监控类型 volume_delta: 全市场相邻两次行情轮询的成交量增量 >= 阈值(默认
9000 手)即提醒, 镜像 ladder 封单监控的临时列注入模式。开盘保护(9:25 竞价
撮合/午休缺口不误报)、跨天清空、数据源重置防御; metric 支持手数/金额双
口径(金额对不同股价更公平); basic_filter 基础过滤(股价/总市值/流通市值/
成交额/剔除ST, 与策略 basic_filter 语义对齐); 命中超5只合并批量通知;
冷却期默认300s; 触发记录/SSE/Webhook 全链路复用。16项专项+104回归测试。
2026-08-25 14:07:16 +08:00
shy3130 196af2fa06 feat(monitor): 策略监控新建规则默认通知事件改为选股结果
DEFAULT_STRATEGY_NOTIFY_EVENTS 从买/卖信号改为进入/移出选股结果,
新建规则、类型切换、策略页创建监控三处默认随之生效; 与后端省略
notify_events 字段时的回填口径一致。旧规则空值回退(LEGACY)不变。
2026-08-25 09:52:56 +08:00
shy3130 0eb3e54b67 fix(data): 自定义源实时行情百分制涨跌幅截面自动归一为小数制
契约要求 change_pct/amplitude/turnover_rate 小数制(0.0366=3.66%),
但 a-stock-data 等第三方接口返回 3.66 表示 3.66%, 原样透传导致行业/
概念统计与前端展示整体放大 100 倍(用户反馈)。get_realtime 摄取边界
按截面中位数判定(|值|中位数>0.31 必为百分制, 小数制受 30cm 涨跌停
约束不可能超过), 整批归一; 小样本退用最大值; 附 7 项回归测试与文档说明。
2026-08-24 17:14:55 +08:00
shy3130 9883208847 fix(mainline): 维度映射返回值按形态取用, 修复重算偶发 Series 报错
用户反馈市场环境点重算偶发 'Series' object has no attribute 'group_by':
若 _load_concept_map_df 返回裸 DataFrame, 元组解包会把两列拆成 Series
(Series.is_empty 可通过, group_by 不存在)。改为按 tuple/DataFrame 实际
形态取值, market_mainline 与 build_rps_rotation 两处解包点同修,
附回归测试(裸 DataFrame 假实现端到端不炸)。
2026-08-24 17:14:48 +08:00
shy3130 b14ffda1bd feat(ui): 数据源能力卡片显示 TickFlow 订阅档位要求与全档位标识
每张能力卡右上角显示该能力所需最低档位(全档位/Starter+/Pro+/Expert+,
配色与左侧菜单档位体系一致, 当前档位不足时琥珀描边提示), 替代原
"当前提供方"徽标(信息已由下方高亮标签承载)。TickFlow 详情头部与
列表卡片在"第三方"后增加 Expert 三色渐变的"已适配全档位"标识。
2026-08-24 17:14:48 +08:00
shy3130 971b4376d1 fix(ai): Codex CLI 状态检测实跑 --version 并移除老版本不支持的 --ephemeral
状态检测原为浅检查, 误报已连接; 改为 codex --version 实测。
--ephemeral 在 codex 0.58 等老版本不存在(unexpected argument),
隔离已由临时 CODEX_HOME 保证, 移除该参数。
2026-08-24 17:14:39 +08:00
shy3130 46635074e8 fix(ai): PR #193 新增 AI 调用放开 max_tokens 限制
合并 #193 引入的 3 处显式 max_tokens(信号生成 2000/策略代码 3000×2)
重新踩中 0ee3aa8 修过的问题: 推理模型思考 token 计入 max_tokens 预算,
显式限制挤占正文导致 JSON/代码截断。统一改为 None(请求不传该参数,
输出上限交给服务端默认)。四个分析器本就是 None, 标题生成 max_tokens=8
为刻意保留的小任务限制, 均不动。
2026-08-24 14:21:55 +08:00
shy3130 6c7c7088a9 feat(ui): 数据源能力卡片标签式路由 — 每个数据集单独选择提供方
- 每个数据源详情展示能力卡片, 卡片上以可点标签列出所有具备该能力的
  数据源(TickFlow 恒为候选), 点标签即刻切换该数据集路由, 跨源自由组合
- 右上角徽标显示当前提供方; 除权因子含「跟随日K」标签(默认态)
- TickFlow 详情含全部能力 + 恢复默认; 插件 Key 配置区对齐 TickFlow 布局
- 插件详情「整体切换为该源」= 一键套用其全部适配能力, 其余回退 TickFlow
2026-08-24 14:21:45 +08:00
shy3130 ea746b97c7 feat(plugins): 新增 fuyao 同花顺官方实时行情插件(默认 hidden)与插件 Key 界面配置
- fuyao 插件: 全市场实时快照分页拉取, 字段对齐数据契约(pct 百分制÷100),
  兼容官方文档与实际返回两种信封/字段名; 优化完成前 plugin.yaml 标记
  hidden: true, 加载器跳过注册不展示, 删除该行即可开放
- plugin.yaml 新增 api_key_env 约定: 设置页提供 Key 输入框, 先探后存
  (POST/DELETE /api/settings/plugin-key), secrets.json 优先于 .env
- secrets_store.get_env_backed_secret(field, env_name) 支持插件取 Key
- loader: 插件状态透出 api_key_env, 新增 probe_plugin_key 委托探测
- 31 个插件测试; docs/plugin-development.md 补充约定说明
2026-08-24 14:21:38 +08:00
shy3130 a4554794fc fix(dev): macOS 下 dev.sh 启动失败修复
- bash 3.2 空数组在 set -u 下展开报 unbound variable, 加 ${arr[@]+...} 守卫
- 全局 /usr/local/bin/uvicorn (Xcode python3.9) 劫持 venv, 改用 python -m uvicorn
2026-08-24 14:21:27 +08:00
shy3130 f856b4a8f8 回测「全部」范围与环境过滤冲突时自动顺延正式起点
正式首日 = 面板首日 (数据边界, 如「全部」范围从本地数据第一天开始) 时,
T-1 环境校验所需的上一交易日不在面板内, fail-closed 直接报错且用户
无法补更早数据。新增 clamp_formal_start_for_regime: 首日让渡为预热,
正式起点顺延到第二个交易日 (首日环境即成为次日 T-1), 仅损失 1 个
正式交易日。接入 run() 三条数据分支与优化器共享矩阵路径, 结果 config
回显实际生效起点。
2026-08-21 17:41:42 +08:00
shy3130 21260f1053 异动监控修复与规则口径对齐 (上交所交易规则 2026 修订)
- 盘中增量路径补算偏离列: compute_enriched_today 补 momentum_3d,
  live_agg 新增 _close_3d_ago 递推状态, 增量/全量回退两路径统一附着
  今日偏离 (基准 = 历史帧昨收 × (1+指数实时涨跌) 外推, 排除盘中
  写入的今日指数行), 修复盘中异动列表恒为空的问题
- 主板 ST 口径统一: 2026-07-06 起风险警示股票涨跌幅 10% 且异常波动
  特别规定废止, 删除原 ±15%/10日+50%/30日+100% 从严表, ST 与普通
  主板同标准
- 严重异常波动负向阈值对齐官方不对称口径: 10日 +100%(-50%),
  30日 +200%(-70%), 跌方向更早触发; 前端规则表/窗口徽标同步双侧显示
2026-08-21 17:41:35 +08:00
shy3130 bcb5cedd9a 引导页改为选择第三方数据源并弱化品牌关联
- 欢迎语改为 TSP, 声明页措辞通用化, 去掉品牌链接
- 数据源步骤不再配置 Key: 卡片选择第三方源, 复用设置页切换逻辑与自有源编辑器
- 第三方/自有标识徽标, 第三方为黄色胶囊
- 新增插件化提示框: 两条接入路径与文档指引 (docs/custom-data-source.md / plugin-development.md)
- 侧栏数据源徽标图标换为 DatabaseZap
2026-08-20 17:34:20 +08:00
shy3130 5374d8dc85 收起的图表列表头保留文字标签 (仅靠 nowrap 防折行) 2026-08-20 16:40:57 +08:00
shy3130 3b2fcfcb67 修复收起图表列时表头换行顶高的问题
- 根因: 收起时列宽压到 44px, 分时表头「眼睛按钮+排序箭头+内边距」
  约 62px 放不下, 排序箭头被挤到第二行, 表头行被顶到 63~81px
- 修复: 表头单元格统一 whitespace-nowrap (表头不应折行, 长标签同样
  受益); 日k/分时列收起态隐藏文字标签只留眼睛按钮, 列保持紧凑
- 验证: 收起态行高 43px 单行(日k 44px/分时 56px), 展开态 41px
2026-08-20 16:37:08 +08:00