119 lines
5.1 KiB
Markdown
119 lines
5.1 KiB
Markdown
# 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 字符串必须精确匹配) |