98 lines
3.8 KiB
Markdown
98 lines
3.8 KiB
Markdown
# 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)
|