Files
Hermes-Skills/okx-auto-position/references/v4.5.49-eth-execute-count-mismatch-and-manual-then-auto-double.md
T

117 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v4.5.49 (2026-07-08) ETH execute 张数不一致 + 手动后自动加仓 + HYPE全周期
## 背景
本次 session 跨 6 币种 (SKHYNIX/HYPE/MU/BTC/XAU/ETH) 多小时完整跟单链路,验证了 v4.5.4 平仓 dedup + v4.5.36 回复vs QQ 分离 + v4.5.38 check_account.py 实盘有效。同时暴露 2 个 advisor execute 路径的真实坑。
---
## 坑1: advisor --execute 返回的张数 ≠ 实际成交张数
**症状**: 麻吉大哥 ETH long 加仓信号 → advisor 推 `ETH long 2张@25x` → 实际查询账户有 `ETH long 10.66张@20x`(5.3 倍)
**根因**(推测):
- advisor 计算 `contracts` 时基于 `acct_free × balance_utilization × leverage / price / ct_val` 公式
- 但 execute 路径 (`execute_order()` in `okx_position_advisor.py`) 实际下单时,**可能走了不同的张数计算分支**(包括最小变动 0.01 张约束 + 强平价校验 + ticker 二次取价)
- advisor 输出的 JSON 是"建议张数",execute 实际下的是另一套逻辑算出来的"可执行张数"
**当前 behavior**: agent 看到 advisor 返回 `contracts: 2` 就以为下了 2 张,实际下了 10.66 张
**修复方案**(下次必修):
1. **execute 后立即调 `/api/v5/trade/fills?instId=X&limit=1` 拿实际成交张数**
2. 把 `{"order_id": ..., "filled_size": ..., "fill_price": ...}` 写进 advisor 返回 JSON
3. process_signal 主流程看到 `filled_size != contracts` 时**标红告警**推 QQ
4. check_account.py 反查时拿 `position.contracts` 作为唯一真实值
**临时绕过**: 收到加仓信号后**立刻跑 check_account.py**,看 contracts 是否合理(> advisor 输出 2 倍就警觉)
---
## 坑2: 手动 execute 后又被 advisor 自动加仓
**症状**: 熬鹰 XAU 长批加仓信号 → advisor execute 路径失败(advisor JSON 返回了但实际下单失败,SSL 抽风期) → 手动用 raw REST 下 15 张 XAU long → 后续信号继续推,系统又自动加仓到 **77 张 XAU long**
**根因**:
- advisor 失败后,**没有"标记手动接管"的状态**
- process_signal 默认所有信号都会再次进入 advisor 路径
- 手动 execute 后,**没有锁定 XAU 这个币种**,后续信号照样推+照样 execute
**修复方案**(下次必修):
1. **手动 execute 成功后,立即调 `release_lock(symbol)` 把这个币种锁** (manual 模式)
2. 锁的语义从"被 trader 锁"扩展到"被用户手动接管" — 任何 trader 信号都拒,直到用户 `/unlock XAU`
3. 或: process_signal 增加 `--manual-only` 模式,只推 QQ,不进 advisor 路径
**临时绕过**:
- 手动 execute 完成后,直接跑 `python3 process_signal.py unlock XAU` (v4.5.45 CLI)
- 或者立即补发一条"假设手动已接管"消息推 QQ,作为 memo
---
## HYPE 完整周期验证 (2026-07-08 末段)
| 阶段 | 熬鹰动作 | 你持仓 | 浮盈/亏 |
|------|---------|--------|---------|
| 新开仓 5x 6126张@54.20 | 开空 | 0 张 | - |
| 加仓 5x→7670张@54.29 | 加空 | 0 张 | - |
| 加仓 3x→5734张@54.19 | 加空 + 降杠杆 | 0 张 | - |
| 减仓 5x→9251张@54.37 | 加空(显示) | 0 张 | - |
| 减仓 5x→7308张@54.37 | 减空(显示) | 0 张 | - |
| 减仓 5x→4933张@54.37 | 减空 | 0 张 | - |
| **平仓** 5x 4933张@55.03 | 砍仓离场 -$3.2k | 自动跟单平仓 | **锁亏 ~-$2.25** |
**执行质量**: v4.5.4 平仓 dedup 修复有效,HYPE 平仓信号被自动识别并执行 close_position_raw。
**实战亏损**: -$2.25(从开仓到平仓),算上手续费可能更少。
---
## MU/SNDK 反复信号处理
**MU**: 熬鹰连续 20+ 条 MU 加仓/减仓/调杠杆信号,agent 全程输出"你无 MU 持仓, USDT $XX"。但 advisor 偶尔隐性 execute:
- MU short 0.1张@1x 自动开仓(锁浮盈 $0.13 后平)
- MU short 0.28张@5x 加仓(从 0.2 张)
**SNDK**: 熬鹰多轮翻转多空,你的 SNDK long 0.126张@2x 在熬鹰翻多时自动开仓,$1,210 → $1,311 自动平仓锁浮盈 $5.61
**结论**: advisor execute 路径对**主流币种**(HYPE/MU/SNDK/BTC/ETH/SKHY) 整体稳定,隐性 execute 概率约 5-10%,需要 check_account.py 反查确认。
---
## HYPE 之后的"系统刚自动平仓"幻觉
**坑3**: MU short 平仓后,agent 报"USDT $XX 无持仓",用户质问"实时吗?" → 重查发现实际有持仓
**根因**: process_signal 的"平仓处理:none"返回容易被 agent 误读成"持仓已清",实际是"process_signal 没找到持仓可平"(因为 dedup 锁 / 之前已平过)
**修复**:
- 任何时候 agent 回复"无持仓/已平仓"前,**必须跑 check_account.py 验证**
- process_signal 的平仓返回码必须包含 `positions_before` 字段,agent 用它判断
- v4.5.38 已规定回复侧必须以 `[实测数据]` 前缀开头,这个坑被规则挡住
---
## 实战净盈利 (本次 session 累计)
| 阶段 | USDT 变化 |
|------|---------|
| Session 开始 | $96.35 |
| 多次跟单 + 平仓循环后 | $109.66 |
| HYPE 跟单 + 平仓后 | $104.49 |
| 当前 | $104.49(无持仓) |
**总净盈利**: +$8.14(+8.4%)
**核心经验**:
- check_account.py 实时校验 = 必须
- advisor execute 张数不可信,必须反查
- 手动 execute 后必须立即 lock 这个币种
- 熬鹰/麻吉/予与/风寻等 trader 的 BTC/SNDK 信号在 72h 锁内反复触发时,process_signal 自动 dedup
---
## 关联
- `v4.5.38-symbol-normalization-1000pepe-and-silent-execute.md` — 同类隐性失败
- `v4.5.4-close-dedup-real-incident.md` — 平仓 dedup 本次实战有效
- `v4.5.45-lock-status-push-and-auto-unlock.md` — 锁机制
- `post-execute-verification-checklist.md` — execute 后必须 verify
- `scripts/check_account.py` — 实时校验工具