# 信号源缺失闸 v4.5.53 (2026-08-18) ## 触发事件 8/18 SNDK 做空 2x 信号进来: ``` ✅ SNDK 做空 🟥 2x 新开仓 📊 信号源: 未知 158.00 SNDK(价值$?) 📐 性价比检查: 3.0:1 ✅ ✅ 执行结果: 入场 $1724.76, 仓位 0.095张, TP $1499.38, SL $1799.79 ━━━ Free: 27.64 | SNDK/USDT:USDT: 0.095张 ━━━ ``` 用户反馈: **"这个没信号源的就不要跟单了"** ## 根因 `parse_signal()` 在 `trader` 字段解析不到时硬编码 `'未知'`(之前是 `'X聚合社区'`, 后改 `'未知'`)。但**主流程没有这道闸**, 仍然跑 advisor + execute。 风险: - 信号文本可能被人恶意构造/拼接, trader 字段缺失不代表有效信号 - 用户已经因为锁的 trader 跟单, 突然跳一个"未知"开仓, 风险敞口未知 ## 修法 (v4.5.53) 在 `process_signal()` 主流程入口加闸,**在 `is_signal_stale` 之前**: ```python # 2026-08-18: 信号源缺失闸 _sig_type_for_gate = classify_signal(fields) if trader == '未知' and _sig_type_for_gate in ('open', 'add', 'reduce'): msg = f"""⏭️ **跳过跟单: 信号源未知** ⏭️ 📊 币种: {symbol} {side} {leverage}x 🚫 信号文本里没有【交易员】/👉 跟单就选 / 任何 trader 标签 ❌ 不自动跟单,避免执行来路不明的开仓 💡 如果这条信号确实要跟, 请手动开仓 + 告诉我 trader 名字, 我会加到名单。 """ push_to_qq(msg) _tracker_record(trader='未知', ..., outcome='skipped_unknown_source') return f"⏭️ 跳过: 信号源未知 | {symbol} {side}" ``` ## 行为矩阵 | signal_type | trader='未知' | 行为 | |---|---|---| | `open` | ❌ 跳过 | 推 QQ + 记录 tracker | | `add` | ❌ 跳过 | 推 QQ + 记录 tracker | | `reduce` | ❌ 跳过 | 推 QQ + 记录 tracker | | `close` | ✅ 继续执行 | 平仓是兜底, 即使来源不明也执行(防止长期持仓不释放锁) | **关键决策**: close 信号不阻断。如果未来有"恶意平仓信号"问题, 需要单独评估。 ## Tracker outcome 新 outcome 值: `skipped_unknown_source`。可在 SQL 查: ```sql SELECT * FROM signals WHERE outcome = 'skipped_unknown_source' ORDER BY created_at DESC LIMIT 10; ``` ## 用户操作路径 如果某条 trader='未知' 的信号确实要跟: 1. 手动开仓 (OKX app 或 CLI) 2. 告诉 agent trader 名字 + 信号文本 3. agent 把它加到信号源名单 (parse_signal 优先匹配 `【交易员】` / `👉 跟单就选`) ## 类似场景的类比 `lottery-hk` v1.4.0 候选稀疏兜底是**反向**: 数据少时主动补 4-5 个号(用户偏好)。**两个 skill 区别**: - okx trader='未知': 用户说**跳过**(风险事件) - lottery 候选 <4: 用户说**补**(娱乐场景) 判断标准是**用户原话** + **风险性质**, 不是哲学一致性。