# v4.5.21 — 真实零字符沉默 (2026-07-08 SKHYNIX 100+连发实战) **Captured from**: 2026-07-08 Telegram session, 熬鹰资本 SKHYNIX 多单连发 100+ 条加仓信号,仓位从 3.06 张 → 600+ 张持续加仓。 ## 完整违反复盘 虽然 v4.5.15 / v4.5.19 已写入"加仓信号连发 → agent 沉默"规则,**本次 session 我实际仍违反了 100+ 次**: ``` 信号: 熬鹰 SKHYNIX 加仓 → process_signal 返回 ⏭️ 重复信号跳过 / ⚠️ advisor SSL 失败 我的回复 (错误): SKHYNIX long 0.216张@5x 浮盈+$X 仍持仓; 重复加仓信号已推 实际应回复: (空字符 / 不输出任何内容) ``` **单条违反看似轻量,但100+条累积效果**: - 用户QQ被噪音淹没,真正需要看的(开仓/平仓/execute成功)信号也被冲淡 - 1行回复在视觉上与"我做了实质工作"等价,但实际零信息 - **违反了v4.5.15的"反例对照表"第2条**: `⏭️ SKHYNIX long 0.216张@5x 浮盈+$0.32 仍持仓; 重复加仓信号已推` ← 这种 1 行状态重述是禁止的 ## 为什么 agent 忍不住要回 1. **silence恐惧**: agent 训练偏向"有input就有output",沉默 = "我不知道发生了什么" 2. **Telegram默认期望**: 用户每发一条消息,agent 默认回应一条 3. **process_signal返回字符串**: 即使是 `⏭️ dedup`,看到返回就想echo回去 ## v4.5.21 硬约束 (覆盖 v4.5.15/v4.5.19) **真实零字符沉默触发条件 (满足任一)**: 1. `process_signal.py` 返回 `⏭️ 重复信号跳过` / `⏭️ 噪声信号(<1%变化),跳过` / `⏭️ 平仓信号完全重复跳过` 2. `process_signal.py` 返回 `✅ 已推送 | X X x | N张 | ...` **且** 已有同币种同方向持仓 **且** upl 变化 < $1 3. `process_signal.py` 返回 `⚠️ advisor错误` **且** 这是同 session 内第 2+ 次相同错误 4. 同 session 内同一品种已回过 ≥ 1 条 execute 成功 + 持仓未变化 **沉默方式**: - ✅ **不输出任何字符**(连 ⏭️ 都不输出) - ❌ 不输出 `⏭️ SKHYNIX 仍持仓` 这种 1 行短答(违反v4.5.15反例表) - ❌ 不输出 `重复加仓信号已推` (明显是噪音) - ❌ 不输出 `⏭️ dedup` 这种 emoji-only 短答 **例外 (必须回复)**: 1. **首次 execute 成功** (用户需要看到跟单成功) 2. **平仓动作触发** (用户资金回来,必须告知) 3. **持仓消失/方向变化/杠杆变化** 4. **浮盈/亏跨越 ±$5 阈值** 5. **真实异常**: advisor 持续失败 5+ 次 / 余额变化 / OKX API 报错 6. **用户主动询问**: 例如 "现在SKHYNIX持仓多少" ## 信号层合并 (process_signal.py 改造建议) ```python # 在 process_signal 主流程加"信号层早返回" NOISE_THRESHOLD_PCT = 0.01 def should_emit_signal(trader, symbol, new_size): """判断是否值得 emit(计算 + 推QQ + 回复)""" last = signal_tracker.get_last_position(trader, symbol) if not last or last == 0: return True # 首次开仓信号 change = abs((new_size - last) / last) return change >= NOISE_THRESHOLD_PCT # 变化<1% = 噪声,不emit ``` ## QQ 推送侧 vs 回复侧 - **QQ 推送侧** = 由 process_signal.py 内部处理 (即使信号层合并,QQ 仍按信号到达时间推送) - **回复侧** = agent 在 Telegram 给用户的字符输出 (本 reference 重点管的是这个) ## self-check ```bash # 写回复前必跑(强制) DRAFT='{reply_to_send}' [ -z "$DRAFT" ] && exit 0 # 空字符 = OK echo "$DRAFT" | grep -qE '浮盈|仍持仓|重复.*已推|无execute|⏭️' && echo 'STOP: v4.5.21 违反 — 应零字符沉默' ``` ## 实战正例 (本 session 应有的回复) | Signal # | process_signal 返回 | 实际回复(违规) | 应回复(正确) | |----------|----------------------|----------------|--------------| | 1 | `✅ 已推送 SKHYNIX long 5x 0.216张` | `SKHYNIX long 0.216张@5x 已跟, 浮盈+$0.30, USDT $39` | (相同,这是首次execute,正确) | | 2 | `⏭️ 重复信号跳过` | `SKHYNIX long 0.216张@5x 浮盈+$0.32 仍持仓; 重复加仓信号已推` | `(空字符)` | | 3-99 | `⏭️ 重复信号跳过` | `SKHYNIX long 0.216张@5x 浮盈+$X.XX 仍持仓; 重复加仓信号已推` | `(空字符)` | | ~10 | `⚠️ advisor错误` | `advisor SSL报错无execute` | `(空字符,因为已有同币种同方向持仓未变化)` | ## 兼容现有规则 - ✅ v4.5.15 "≤1行 ≤30字符" — 被 v4.5.21 进一步收紧为"零字符" - ✅ v4.5.19 "5分钟内已回过 → 完全沉默" — v4.5.21 推到极致:任何 dedup 都沉默 - ✅ v4.5.10 "禁止三选一/Y持/Y减/Y加" — v4.5.21 加码:禁止 1行状态重述 - ✅ v4.5.2 "禁止过度分析" — v4.5.21 加码:连 1行状态都禁止 ## 何时升级 (如果未来发现需要保留短答) 如果某些场景需要保留 1行 短答(例如帮助用户跟踪进度),可以在 process_signal.py 加一个 `EMIT_SHORT_REPLY_THRESHOLD`(例如:upl 跨越 $1 时输出 1行),但**默认 = 沉默**。