5.1 KiB
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 完全不同源, 不能跟。
修复:
# 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+) 抓目标值:
# 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。
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 字符串必须精确匹配)