Files
Hermes-Skills/okx-auto-position/references/v4.5.21-real-zero-silence.md
T

95 lines
4.8 KiB
Markdown

# 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行),但**默认 = 沉默**。