v4.5.38: 实时数据查询硬规则(回复前必查)+ check_account.py封装

This commit is contained in:
2026-07-17 22:14:19 +08:00
parent 629ac197de
commit 533c342305
55 changed files with 5437 additions and 599 deletions
@@ -0,0 +1,51 @@
# OKX Raw API 持仓查询 Pitfall
## 问题
直接调用 OKX REST API `/api/v5/account/positions` 时,在 net_mode 下:
```json
{
"posSide": "net", // ← 不是 "long" 或 "short"
"pos": "10", // ← 正数=多头,负数=空头
"avgPx": "1764.538",
"upl": "12.62",
"liqPx": "1638.69"
}
```
错误解析方式:
```python
side = "long" if pos_side == "long" else "short" # ❌ net_mode 下永远是 "short"
```
正确解析方式:
```python
side = "long" if float(pos) >= 0 else "short" # ✅ 用 pos 值判断
```
## 为什么
- `posSide` 在 net_mode 下固定返回 `"net"`(表示净头寸模式)
- 实际方向由 `pos` 值的正负决定:正=多头,负=空头
- ccxt 的 `fetch_balance()` 和自定义的 `get_account_info()` 已正确处理
- 但直接用 curl/requests 调 API 时需要手动判断
## 影响
- 误报持仓方向(多头显示为空头)
- 可能导致错误的平仓/加仓决策
## 修复
所有直接调用 `/api/v5/account/positions` 的地方,判断方向时用 `pos` 而非 `posSide`
```python
for p in d["data"]:
pos_val = float(p.get("pos", 0))
side = "long" if pos_val >= 0 else "short"
contracts = abs(pos_val)
```
## 实测案例(2026-07-05
用户ETH持仓实际为 long 10张,但原始解析显示 "short 10张",导致误报。