95 lines
4.8 KiB
Markdown
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行),但**默认 = 沉默**。 |