Files
Hermes-Skills/okx-auto-position/references/v4.5.74-2026-09-02-advisor-safety-factor-1.07.md

98 lines
3.8 KiB
Markdown
Raw Permalink 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.74 — 2026-09-02 advisor 加 SAFETY_FACTOR 1.07 防 51008
## 1. 实战现场 (2026-09-03 02:35 北京时间)
### 用户看到的错误
推送连续 2 条:
```
⚠️ 订单错误 (2 条新增)
• 2026-09-03T02:35:20 place_order SKHYNIX/USDT:USDT buy 0.324张 4x
❌ [51008] 保证金不足
💬 Order failed. Insufficient USDT margin in account
• 2026-09-03T02:35:52 place_order SKHYNIX/USDT:USDT buy 0.324张 4x
❌ [51008] 保证金不足
```
用户原话: "这个失败是为什么, 后面能不能推送原因出来?"
→ 同时推动 2 件事: (1) 推送带原因 (parse_order_errors.py 已修), (2) **根本原因** advisor 估算逻辑错了。
## 2. 根本原因诊断
### 当时账户状态
- SPCX short 1.65 张 @ 4x (已占 $57.96 保证金)
- Free 显示 $98.41
- SKHYNIX 想加仓 0.324 张 @ 4x = 392.83 / 4 = **$98.21 保证金**
- advisor 推算 Free $98 ≥ 需 $98.21 → 看似够 → 下单 → **51008 失败**
### 为什么 Free $98 加仓 $98 会失败?
OKX 实际冻结 = 名义/杠杆 **+ 维持保证金 0.5% + taker 手续费 0.05% + funding 缓冲**
| 项目 | 金额 |
|---|---|
| 仓位保证金 | $98.21 |
| 维持保证金 (0.5%) | $1.96 |
| taker 手续费 | $0.20 |
| funding (1 次) | $0.10 |
| **实际冻结** | **~$100.5** |
**实际冻结 ≈ 名义/杠杆 × 1.07**, 但 advisor 用 `min(usdt_free, single_coin_avail)` 直接对比保证金, **漏算 7% 缓冲**,所以 51008 反复发生。
## 3. 修复方案
### 改 `~/.hermes/skills/trading/okx-auto-position/scripts/okx_position_advisor.py`
```python
# 同时考虑 free 余额 (不能超过 free)
# 2026-09-02: 加 1.07 缓冲 (OKX 实际冻结 = 保证金 + 维持 0.5% + 手续费 + funding),
# 不加会复现 SKHYNIX 加仓 51008 失败 (Free $98 + 实际冻结 $105 = 差 $7)
SAFETY_FACTOR = 1.07
avail_margin = min(acct_info['usdt_free'] / SAFETY_FACTOR,
single_coin_avail / SAFETY_FACTOR)
margin_per_contract = ct_val * price / leverage
```
### 修复前后对比
| 场景 | 旧 advisor | 新 advisor |
|---|---|---|
| Free=$98, 加仓需 $98 | ✓ 可以 (实际失败 51008) | ✗ **不会建议** (98/1.07=$91.6 < $98) |
| Free=$110, 加仓需 $98 | ✓ 可以 | ✓ 可以 (110/1.07=$102.8 > $98) |
| Free=$98, 加仓需 $90 | ✓ 可以 | ✓ 可以 (98/1.07=$91.6 > $90) |
## 4. 铁律 (新)
**加仓所需 Free ≈ 名义价值 / 杠杆 × 1.07** (含 7% 缓冲: 维持保证金 + 手续费 + funding)
- advisor 估算时必须用 `usdt_free / 1.07` 作为有效可用余额
- 不要只看 `usdt_free >= margin`, 这样会 51008
- 同理 apply 到 single_coin_cap (75% × total), 也要除 1.07
## 5. 关联改
- `okx_position_advisor.py` 加 `SAFETY_FACTOR = 1.07` 乘到 avail_margin
- 这个 7% 系数也可以加到 `format_signal` 的"预计占用"显示 (optional)
- 推送的"净盈利"已经包含手续费和 funding, 不需要再算
## 6. 后续待做 (offer 给用户, 待确认)
- 调 SKHYNIX 杠杆到 3x: 保证金 = 392/3 = $130 (占用更大但抗爆仓能力强)
- 减少 SKHYNIX 张数: 0.324 → 0.2 张 @ 4x = $60 保证金
- 先减 SPCX 0.5 张, 释放 $18 保证金
- 不动, 抗过去 (当前账户健康, Free $98.95, 占用 37%)
## 7. 实战教训
- ❌ 不要只看 `free >= required_margin` 就下单 — OKX 实际冻结 = 理论 × 1.07
- ❌ 不要忽略"手续费 + funding"在加仓瞬间就产生 — 不是只在平仓收
- ✅ advisor 加 SAFETY_FACTOR, 让推荐更保守
- ✅ 用户问"需要多少保证金"时, 直接给公式 + 7% 缓冲
- ✅ push 错误带 sCode 翻译后, 用户能立刻诊断 (本次 51008 → 保证金不足 → 看顾问算法)
## 8. 关联 reference
- `references/v4.5.73-2026-09-02-order-errors-scode-translation.md` — 推送 sCode 翻译
- `references/parse-order-errors-scode-dict.md` — sCode 字典 (待建)
- memory.md 不需要记录 (此条已经写进 advisor 代码注释 + SKILL.md)