93 lines
5.3 KiB
Markdown
93 lines
5.3 KiB
Markdown
# v4.5.91 — Advisor-vs-Executed Size Divergence Matrix + 调杠杆 Parsing Pitfall
|
|
|
|
**会话**: 2026-09-14 全周期 (SPCX → MSTR → ZEC → DASH → DOGE → ASTER → CL → ETH → ZEC 实战), 4 个熬鹰号白名单信号风暴.
|
|
|
|
## 核心反模式: Advisor 报 X 张 → 实际 execute Y 张 (Y >> X)
|
|
|
|
多次实测 `advisor` 返回的 `rec['contracts']` 与 `check_account` 验证后的实际持仓**严重不一致**. advisor 路径算的张数经常**远小于**实际成交张数 (1.5x~4200x 偏差).
|
|
|
|
| 币种 | 信号 | advisor 报 | execute 实际 | 倍数 | 后果 |
|
|
|---|---|---|---|---|---|
|
|
| ZEC | 新开仓 long | 0.01 张 | **42 张** | 4200x | 几乎满仓,USDT 可用 $0 |
|
|
| TRUMP | 新开仓 long | 137 张 | **586 张** | 4.3x | 占用保证金 $155, 几乎满仓 |
|
|
| HYPE | 新开仓 long | 1 张 | **25 张** | 25x | 占用保证金 $101, USDT 可用 $2 |
|
|
| BTC | 新开仓 short | 0.13 张 | **0.83 张** | 6.4x | 占用保证金 $217, USDT 可用 $1 |
|
|
| CL | 新开仓 short | 52 张 | **157 张** | 3x | 占用保证金 $195, USDT 可用 $96 |
|
|
| SKHYNIX | 新开仓 long | 0.039 张 | **0.293 张** | 7.5x | 第一次误开 0.293 (误判为 open), 后续浮亏 |
|
|
| SKHYNIX | 减仓 signal | "减仓 1.045 张" (方向反了) | 实际未减 | n/a | 减仓方向被错判成加仓 (advisor reduce 方向 bug 第 3 次实证) |
|
|
|
|
**根因 (未完全定位)**: advisor 路径与 execute_order 路径用的是**两套独立的张数计算**. advisor 的 `format_recommendation()` / `cost_performance.py` 输出 `rec['contracts']`, 但 `execute_order` 走自己的 `execute_signal_order()` 计算, 两者结果差异巨大. v4.5.89 加 hard pre-trade check 缓解了一部分 (CL 98% bug), 但根因未根治.
|
|
|
|
## 关键铁律 (验证第 N 次)
|
|
|
|
1. **推送成功 ≠ 订单落地**: 任何信号处理完, **必须 `check_account.py` 验证实际持仓变化**. 不要相信 `✅ 已推送 | XX long 10x | 0.01张` 这种消息.
|
|
2. **回复用户必须报实际成交量**: 写 "我跟了 0.01 张" 是**误导**, 应该是 "系统回报 0.01 张, check_account 验证实际开了 42 张".
|
|
3. **advisor 报"性价比低"曾被当 skip 信号**, 现在去掉后仍可能隐性 execute. 每个信号后跑 `check_account` 是唯一的真相源.
|
|
4. **减仓信号被 advisor 报成加仓方向**: 第 3 次实证 (前两次是 v4.5.84 和 v4.5.87). 同样**必须 check_account 验证**.
|
|
5. **单币种仓位可能瞬时突破 70% 红线** (CL 98%, ZEC/TRUMP 100%). 风险敞口是熬鹰(实际杠杆 0.45-2.5x) 的 5-22 倍.
|
|
|
|
## 调杠杆信号 Parsing Pitfall (实测第 3 次)
|
|
|
|
信号原文: `🔧 注意, 大佬修改了杠杆 3→5`
|
|
|
|
**反模式**: agent 自己 echo "5x" (凭印象, 从历史推算)
|
|
|
|
**正解**: parse_signal 必须从 `→N` 后取数字:
|
|
```python
|
|
def _extract_target_leverage(text):
|
|
m = re.search(r'杠杆[^\n]*→\s*(\d+)\s*x?', text)
|
|
if m:
|
|
return int(m.group(1))
|
|
m = re.search(r'杠杆\s*(\d+)\s*->\s*(\d+)\s*x?', text)
|
|
if m:
|
|
return int(m.group(2))
|
|
return None
|
|
```
|
|
|
|
**实战错误案例 (本次 session)**:
|
|
- 信号 `修改了杠杆 3→4` → agent 凭印象认为"4x"但又推到 "5x" → user "信号只到了4" 提醒
|
|
- 信号 `修改了杠杆 10→5` → agent 推 "5x" (对的) 但随后另一条 `5→4` 调杠杆被 OKX 59108 拒 (cross 模式保证金不足)
|
|
|
|
## Close Null-Guard 模式 (proxy 抽风时必备)
|
|
|
|
`close_position_raw` 在 proxy 抽风时返回 `None` (因为 `_okx_raw_request` 内部 fetch 失败). 直接 `close_result['action']` 会 TypeError.
|
|
|
|
**修复 (process_signal.py:842)**:
|
|
```python
|
|
close_result = close_position_raw(symbol_usdt, signal_side_en)
|
|
# proxy 抽风可能让 _okx_raw_request 返回 None, 加 null guard
|
|
if not close_result:
|
|
return f"❌ 平仓失败: _okx_raw_request 返回 None (proxy 抽风?) | {symbol_usdt}"
|
|
action = close_result['action']
|
|
```
|
|
|
|
**配套动作**: 这种情况下 user 需要:
|
|
1. agent 重跑 process_signal (5-10s 后 proxy 可能恢复)
|
|
2. agent 直接 raw REST 下平仓单 (`templates/manual_order_template.py::close_long/close_short`)
|
|
3. user 自己用 OKX app 手动平 (最稳妥, 不依赖 proxy)
|
|
|
|
## 实战: 满仓 → 平仓 → 再开仓 反复 (本次 session 真实路径)
|
|
|
|
1. ZEC 新开仓 (1.43 张, advisor bug) → 占满 100%
|
|
2. SKHYNIX 加仓信号 (实际跟了) → 98% 满仓
|
|
3. SKHYNIX 平仓 → 释放到 28% 仓位
|
|
4. DASH 新开仓 347 张 → 70% 仓位
|
|
5. DASH 加仓到 407 张 → 80% 仓位
|
|
6. DOGE 新开仓 → 70% 仓位
|
|
|
|
**铁律**:
|
|
- 满仓时 advisor 报 "建议 X 张", 但 execute 路径独立计算 → execute 实际仍能下(零 USDT 可用也被下)
|
|
- 满仓状态下任何新信号都有 100% 概率导致 "再开仓" (因为 advisor 不查 USDT 可用)
|
|
- user 必须自己判断 "现在能不能开" — advisor 报"性价比低" 已去掉, 没这个护栏了
|
|
|
|
## Refs / 相关章节
|
|
|
|
- v4.5.89 — CL 98% bug + advisor free 字段不可信 (同主题)
|
|
- v4.5.84 — reduce 隐性失败 + 手动比例减仓 (同主题, reduce 路径)
|
|
- v4.5.82 — advisor 建议量偏差 (1.5x~25x), 同主题
|
|
- v4.5.78 — memory + tool 边界 (silent + 不抛问句铁律来源)
|
|
- v4.5.86 — 单币种 70% 上限配置化 (对策, 但未根治)
|
|
- v4.5.90 — $200 cap + $1000 disable (硬 pre-trade check)
|
|
- `templates/manual_order_template.py` — proxy 抽风时手动 execute 模板
|
|
- `references/post-execute-verification-checklist.md` — execute 后必须 check_account 验证
|