# v4.5.81 — Trader 严格等值匹配 + 杠杆信号目标值解析 + 4 个熬鹰变体识别 **日期**: 2026-09-09 **会话**: ZEC 暴跌场景, 4 个熬鹰变体 trader 同时活跃 ## 关键教训 (本次 session 新增) ### 1. Trader 名必须严格等值匹配 (集合 in 检查), 禁止 startswith / contains **实际场景** (2026-09-09): 4 个"熬鹰*"变体 trader 全部都用了 startswith('熬鹰') 检查, 结果 `熬鹰资本`(白名单) / `熬鹰FOMO合约实盘` / `熬鹰交易信号` / `熬鹰币安实盘` 全部进了白名单闸。但用户的原意是: **只跟"熬鹰资本"**, 其他三个 trader 完全不同源, 不能跟。 **修复**: ```python # whitelist.json { "trader_whitelist": ["熬鹰资本"] # 严格等值, 不允许 startswith 兜底 } # process_signal.py _TRADER_WHITELIST = {'熬鹰资本'} # fallback 默认值(防配置文件损坏) try: _wl = json.loads(_WL_PATH.read_text()) if isinstance(_wl, dict) and isinstance(_wl.get('trader_whitelist'), list): _TRADER_WHITELIST = set(_wl['trader_whitelist']) except Exception: pass # 严格等值检查 if _sig_type_for_gate in ('open', 'add', 'reduce', 'adjust_leverage', 'close') and trader not in _TRADER_WHITELIST: return f"⏭️ 跳过: trader [{trader}] 不在白名单" ``` **实战确认**: 9/9 session 后续 4 个熬鹰变体的信号全部被闸拦住 (`⏭️ 跳过: trader [...] 不在白名单`)。 **反模式** (禁止): - `trader.startswith('熬鹰')` → 4 个变体全过 - `'熬鹰' in trader` → 4 个变体全过 - `trader == '熬鹰'` (无通配但容易漏) → 实际可用 (当前解) ### 2. 信号里"修改了杠杆 X→Y" 的 Y 必须 parse 出来, 不能凭印象 **反模式**: agent 看到 `3→5` 自己 echo 成 `4x` (凭印象取中间值)。实战: agent 把"3→5"读成"4", 实际 OKX set-leverage 调到5x; user 自己手动验后指正。 **正解**: parse_signal 直接提取 `→N` 后面的 N, 推送消息必须包含杠杆值供 user 核对。 **修复**: leverage 字段 parse regex 必须用 `→(\d+)` 抓目标值: ```python # parse_signal.py m_lev = re.search(r'【杠杆】\s*[::]?\s*(\d+)', text) if m_lev: fields['leverage'] = m_lev.group(1) # 调杠杆信号场景 m_target_lev = re.search(r'(\d+)\s*→\s*(\d+)', text): fields['target_leverage'] = m_target_lev.group(2) # 必须用 group(2), 不是 group(1) ``` ### 3. 调杠杆信号不要走 advisor "性价比低" 跳过路径 **反模式**: `修改了杠杆 3→4` 类信号 → advisor 报"性价比低" → 跳过 → 熬鹰节奏跟丢。 **正解**: `adjust_leverage` 分类单独走 `adjust_leverage_raw` 直调 set-leverage, 不走 advisor。 **实战确认**: - ✅ 调杠杆: ETH → 4x (5x → 4x 自动跟进) - ✅ 调杠杆: ZEC → 5x (4x → 5x 自动跟进) - ✅ 调杠杆: TRUMP → 2x (1x → 2x 自动跟进) - ❌ 调杠杆失败: SKHYNIX 5→2 (cross模式账户余额不够, OKX 59108 错误, 跳过即可) **坑**: `adjust_leverage_raw` 调用 `_okx_raw_request` 必须用 `body=body` 关键字参数, 不是位置参数。 ### 4. 📊 仓位实时更新 必须单独分类 update_only (不execute) **反模式**: "📊 仓位实时更新" 信号被classify成 `open` → 默认execute → SKHYNIX long 0.293 张被误开 (9/1 session 事件)。 **正解**: `classify_signal` 加 `update_only` 类型 → 白名单闸直接skip。 ```python def classify_signal(text): if '平仓' in text or '止盈' in text or '止损' in text: return 'close' if '减仓' in text: return 'reduce' if '加仓' in text or '追仓' in text: return 'add' if '修改了杠杆' in text or '调整了杠杆' in text or '调杠杆' in text: return 'adjust_leverage' if '仓位实时更新' in text or '实时更新' in text: return 'update_only' # 新增: 状态推送不execute return 'open' ``` ## 实战 trader 变体识别清单 (2026-09-09 当日活跃) | Trader | 是否白名单 | 备注 | |---|---|---| | 熬鹰资本 | ✅ 是 | 唯一跟单的 trader | | 熬鹰FOMO合约实盘 | ❌ 否 | FOMO 心态的变体, 高频且仓位大, 不能跟 | | 熬鹰交易信号 | ❌ 否 | 同一人的另一个账号, 不能跟 | | 熬鹰币安实盘 | ❌ 否 | 币安交易所账号, OKX API 不能平仓, 不能跟 | | 巨鲸内幕哥ca88 | ❌ 否 | 完全不同的人, 不能跟 | **识别方法**: trader 名严格等值匹配, 任何包含/前缀匹配都会导致变体绕过白名单闸。 ## 配合铁律 - v4.5.77 close 闸白名单 (本次 session 再次强化, 所有信号类型都过闸) - v4.5.71 先查再说 (不要反问) - v4.5.79 4 个熬鹰变体识别 (本次固化进清单) - v4.5.75 memory.md 只装硬规则 (Qdrant 存细节) ## 反模式 (本次 session 再强化) - ❌ `trader.startswith('熬鹰')` → 4 个熬鹰变体全过闸 - ❌ `trader == '熬鹰'` (忘 `.strip()` 导致空格绕过) - ❌ 调杠杆信号走 advisor (被"性价比低"跳过) - ❌ 凭印象读杠杆目标值 (3→5 读成 4) - ❌ "📊 仓位实时更新" 当成 open (误开 SKHYNIX) - ❌ 把 4 个熬鹰变体当同一个人 (trader 字符串必须精确匹配)