# Crypto ATR Signal v1.1 修复报告 修复日期:`2026-06-22` 当前页面版本:`v1.1.0` ## 问题概述 首页信号列表原本会展示 `signals` 表中的历史信号,而不是只展示当前最新已收盘 4H K 线的信号。 这会导致一个问题: ```text 历史 K 线中 ATR 倍数更高的信号,可能排在当前最新 K 线信号前面。 ``` 因此用户在首页看到的并不完全是“当前最新一根 4H K 线”的信号。 ## 问题原因 原首页查询逻辑直接读取 `signals` 表: ```sql SELECT symbol, direction, multiple, range, atr14, open_time, created_at FROM signals ORDER BY CAST(multiple AS REAL) DESC, open_time DESC, symbol ASC LIMIT 300 ``` 该查询没有限制: ```sql WHERE open_time = 最新已收盘K线 ``` 所以历史信号会被一起展示。 ## 修复方案 首页先从 `klines` 表中读取当前数据库里的最新 K 线时间: ```sql SELECT MAX(open_time) AS open_time FROM klines ``` 然后只查询该 `open_time` 对应的信号: ```sql SELECT symbol, direction, multiple, range, atr14, open_time, created_at FROM signals WHERE open_time = ? ORDER BY CAST(multiple AS REAL) DESC, open_time DESC, symbol ASC LIMIT 300 ``` ATR 倍数正序 / 倒序排序仍然保留,但排序范围只限于当前最新已收盘 K 线的信号。 ## 修复结果 修复后: ```text 首页 = 当前最新已收盘 K 线信号 历史信号 = 继续保留在数据库中,但不混入首页 ``` 当前本地验证结果: ```text 数据库历史信号总数:68 最新 K 线信号数:26 首页当前信号:26 ``` ## 影响范围 影响文件: ```text webapp.py ``` 不影响: ```text scanner.py 扫描逻辑 ATR 计算逻辑 缺口补抓逻辑 SQLite 数据结构 历史信号保存 实体占比过滤开关 数据清理逻辑 ``` ## 当前状态 已完成: - 首页只展示最新已收盘 K 线信号。 - 历史信号继续保留,默认保留 `SIGNAL_RETENTION_DAYS=90` 天。 - ATR 倍数排序继续可用。 - 本地服务已重启验证。 ## 后续建议 后续如果需要查看历史信号,建议单独增加: ```text /history ``` 或页面切换: ```text 当前信号 / 历史信号 ``` 这样首页保持清爽,历史查询也有独立入口。