# 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 验证