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
shy3130
bd84d4c0ae
feat(ui): 侧边栏桌面三态 + 移动端抽屉 (落地 #166 设计)
...
桌面 (≥768px): 展开 14rem → 图标条 3.5rem → 隐藏 0 + 左缘悬浮按钮
(hover 1s 以 overlay 预览不挤压主区, 点击固定展开 push); 三态持久化
localStorage tf-nav-state, 自动迁移旧 tf-nav-collapsed 两态键。
移动端 (<768px): aside 换壳为 fixed 抽屉 (80vw / max 320px + 半透明
遮罩), 左上角汉堡唤出, ESC/路由跳转/点导航/点遮罩关闭; 原移动端
强制收起为图标条的旧逻辑移除, 抽屉内恒为完整形态。
数据挂起门控对齐: 图标条/隐藏/抽屉关闭态均不为侧栏隐藏 UI 发请求。
交互设计取自 PR #166 (intfoo), 贴现有 navCollapsed 体系实现而非
合并其平行 sidebar 组件树 (其桌面两态与 main 现有能力重复)。
验证: tsc 零错误 + build 通过 + 浏览器验收 8 项 PASS (桌面三态
两轮循环含隐藏恢复、移动抽屉开合/遮罩/ESC); 修复验收发现的
overlayPreview 残留导致的"恢复后侧栏 fixed 覆盖主区"bug。
2026-09-02 12:40:56 +08:00
shy3130
22add7179c
merge: PR #167 监控自定义信号全显 + 信息条弹窗性能优化
...
冲突解法: SignalPicker 采用 options 形态 (PR 重构) + 保留 main 的
intradayDisabledSignals/intradayDisabledHint 变量 (含自选分组作用域
禁用分时穿越的增强语义, 自动合并会被 PR 旧内联表达式悄悄丢掉)
+ filterCustomByKind: false (监控场景显示全部自定义信号)。
验证: tsc 零错误, pnpm build 通过。
2026-09-02 10:56:49 +08:00
shy3130
576850d0fa
feat(data): 数据页同步任务支持手动停止 (二次确认)
...
- 同步运行中顶栏出现「停止」按钮, 点击先弹二次确认: 注明协作式停止
(当前分块完成后中断, 不损坏已写入数据) + 停止后再次拉取需重新走
完整管道 (拉取→指标计算→监控规则), 无法从停止处续跑
- api.ts 新增 pipelineJobCancel, 调用既有 POST /api/pipeline/jobs/{id}/cancel
(取消标志 + 分块回调检查 + JobCancelledError 协作式退出, 后端零改动)
- 补 cancel 端点契约测试: running/pending 可停、终态 400、未知 404、
停止后可立即新建任务
2026-09-01 22:42:59 +08:00
shy3130
84725cd362
fix(pipeline): 解锁设置页 A 股拉取开关 ( #216 维护者补丁)
...
后端 getter/白名单已随 pr-218 修复, 前端 PipelineScopeConfig 的
locked 特判 (v0.1.60 为配合后端硬编码所加) 未解锁 — 不删则 issue
的用户路径 (设置界面取消勾选 A 股) 依然走不通。删除特判, 恢复与
ETF/指数开关对称的行为。
2026-09-01 22:41:33 +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
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
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
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
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
58b86a962b
feat(frontend): 指数页固定核心四只, 删除全指数搜索与侧栏指数配置
...
- /indices 指数页保留: 左侧固定核心四只(核心指数卡片), 删除搜索框与
全量指数列表; 右侧日K/分时详情与同步指数日K按钮不变
- 侧栏指数条固定四只常驻显示, 点击跳指数详情
- 监控设置"左侧菜单指数"配置卡删除(四选多选+固定显示开关)
- api.ts: 删 indexList/indexSearch, Preferences 移除 5 个指数偏好字段;
queryKeys 同步清理
2026-08-31 16:50:28 +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
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
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
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
75c2ab29f7
feat(frontend): 异动中心三tab、回测导出与载入复测、看板成分股弹窗与板块分时
...
- 异动监控重构为按交易时间线三tab: 竞价异动(风向标+当日/次日对照+追高标记,
fuyao 未配置统一引导态)/盘中异动(信号筛选+连板/量比/振幅/换手表)/偏移异动
- 复盘页移除风向标卡片(AI 注入保留在后端)
- 回测结果导出 CSV(BOM, 概要/净值/交易明细/分标的统计四段)
- 候选方案「载入复测」: 弹窗→策略页传递, 23 项配置回填复跑
- 看板概念/行业排名行点击弹出成分股(dimensionKindForSourceField 判型),
领涨股带涨跌幅与板块徽章
- 成分股弹窗新增板块等权分时: 双线(板块/全市场)+0%基线, 伪时间戳轴
HH:MM 标签, 分钟未落盘引导态, 60s 轮询续期
2026-08-30 19:05:32 +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
3b09fac15e
feat(realtime): 自选实时分流与数据落盘可靠性
...
- quote_service 实时通道重构与自选分流, 旧 watchlist 批量测试相应移除
- repository.replace_with_retry 原子写重试; pipeline_jobs 任务记录落盘
- stock-sdk provider 适配增强; 分时图组件与预览入口调整
2026-08-30 19:05:27 +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
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
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
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
68579f1b10
style(screener): 分钟周期徽章换 sky 色系, 与 AI 来源徽章的紫色区分
2026-08-30 19:05:12 +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
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