Files
Hermes-Skills/okx-auto-position/references/v4.5.5-pepe-full-cycle-and-close-path-bug.md
T

114 lines
4.9 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.5 (2026-07-08) 实战记录: PEPE 完整周期验证 + close 路径独立 bug
## 完整事件链
**时间**: 2026-07-08 下午-晚上
### Phase 1: 信号来了执行失败
1. 熬鹰 1000PEPE 多单信号连发 10+ 条 (新开仓 + 加仓, 公告价格 0.00288 USDT/1000PEPE, 公告保证金 $300k+)
2. process_signal 推 QQ 成功, 但 advisor SSL 报错, **execute 实际未下单**
3. 用户多次追问"跟单了吗,已经过了2小时了" → "我靠,你为什么不重试,这么久了,还不赶紧推。"
4. agent 重跑 process_signal → advisor 报 `1000PEPE-USDT-SWAP` 不存在 (51001)
### Phase 2: 诊断合约错配
5. raw REST 查 `/api/v5/public/instruments?instType=SWAP` → 真实合约是 `PEPE-USDT-SWAP`
6. 关键发现: ctVal=10,000,000 PEPE/张, OKX 单位 = 1 PEPE
7. X 聚合社区显示 0.00288 USDT/1000PEPE, OKX 显示 0.00000288 USDT/PEPE → 数学一致,只是展示格式不同
### Phase 3: 修复 parse_signal
8. process_signal.py parse_signal() 加归一化:
```python
sym = sym.replace('USDT', '').strip()
if sym == '1000PEPE':
sym = 'PEPE'
fields['symbol'] = sym
```
9. 重跑 → advisor 算出 14.8 张 PEPE long @7x, execute 成功
10. 验证: USDT 从 $81 降到 $21 (冻结 $60+), 持仓确认 14.8 张 @ avgPx 0.000002881 (= 1000PEPE 单价 0.002881, 与信号 0.002888 误差 < 0.5%)
### Phase 4: 平仓触发 bug
11. 熬鹰 6+ 条连续减仓信号 (PEPE 价格下跌) → process_signal dedup 跳过
12. 熬鹰平仓信号来 → process_signal 返回 `✅ 平仓处理: error`
13. **bug 发现**: close_position_raw 用了 `1000PEPE-USDT-SWAP` 仍然查不到合约
### Phase 5: 修复 close 路径
14. close_position_raw 加归一化:
```python
inst_id = f"{symbol_usdt}-USDT-SWAP"
if symbol_usdt == '1000PEPE':
inst_id = 'PEPE-USDT-SWAP'
```
15. 重跑 close_position_raw('1000PEPE', 'long') → PEPE long 14.8 张全平成功
16. order_id: 3745678821289287680
17. 锁亏: -$14.50
### Phase 6: 推送 + commit
18. 推送 QQ 报告平仓结果
19. commit: `v4.5.5: 1000PEPE→PEPE 归一化 (开仓+close路径都修)`
20. git push → 502 Bad Gateway (git.hi6k.com 不稳定, 待重试)
## 核心教训
### 教训 1: 任何 1000xxx 包装币种必须两路都修
- parse_signal 处理开仓/加仓信号 → 归一化
- close_position_raw 处理平仓信号 → **也要归一化**
- 修一处就够会导致"开了平不掉" 或 "信号推了但持仓没记录"
### 教训 2: 修复后必须端到端测试
修复 1000xxx 包装币种的代码后,验证流程:
1. 开仓信号 → execute 成功 → USDT 冻结 + 持仓增加
2. 平仓信号 → execute 成功 → USDT 解冻 + 持仓清零
3. 推送 QQ 验证数据一致性
### 教训 3: 价格单位换算容易出错
| 来源 | 显示 | 实际 |
|---|---|---|
| X 聚合 | 0.00288 USDT/1000PEPE | = 0.00000288 USDT/PEPE |
| OKX | 0.00000288 USDT/PEPE | = 0.00288 USDT/1000PEPE |
**验证公式**: `OKX价格 × 1000 ≈ X聚合价格` (误差 < 1% = 滑点)
### 教训 4: 用户对延迟极不耐烦
**用户原话**:
- "跟单了吗,已经过了2小时了"
- "我靠,你为什么不重试,这么久了,还不赶紧推。"
**强制规则**:
- 用户问"跟单了吗" / "执行了吗" → **立即**重跑 process_signal, **不反问**
- 用户说"重试" / "赶紧推" / "还不跟" → **立即**重跑 + execute + raw REST 反查
- 重试完成 → 简短报"已跟 X 张 @ Yx, USDT Z",不展开
### 教训 5: git push 失败不要 panic
git.hi6k.com 经常 502:
- 本地 commit 就位即可,数据没丢
- sleep 30-60s 重试,通常恢复
- 不需要回滚或重做 commit
## 已知 1000x 包装币种 (扩展)
| 信号格式 | OKX 合约 | 验证状态 |
|---|---|---|
| 1000PEPE | PEPE-USDT-SWAP | ✅ v4.5.5 完整周期验证 |
| 1000SHIB | SHIB-USDT-SWAP | ⚠️ 待测 |
| 1000FLOKI | FLOKI-USDT-SWAP | ⚠️ 待测 |
| 1000LUNC | LUNC-USDT-SWAP | ⚠️ 待测 |
| 1000XEC | XEC-USDT-SWAP | ⚠️ 待测 |
| 1000BONK | BONK-USDT-SWAP | ⚠️ 待测 |
| 1000SATS | SATS-USDT-SWAP | ⚠️ 待测 |
**新币种到来时**: 先查 OKX public/instruments 确认合约名, 再决定是否需要归一化。
## 给下次 session 的 action
- [ ] 本地 commit v4.5.5 已就位 → 重试 git push (sleep 30)
- [ ] 在 process_signal.py 加 `if sym.startswith('1000') and sym[4:] in ('PEPE','SHIB','FLOKI','LUNC','XEC','BONK','SATS'): sym = sym[4:]` (通用模式, 不只写 1000PEPE)
- [ ] 在 close_position_raw 加同样通用归一化
- [ ] 给所有 advisor 错误加 fallback: 用 raw REST `/api/v5/public/instruments` 自动找替代合约
- [ ] 后续遇到 1000SHIB/1000FLOKI 等直接走归一化, 不需要再排查
## 关联
- v4.5.37: 第7次违规 + 1000PEPE execute 漏处理
- v4.5.38: symbol normalization 1000PEPE → PEPE (parse_signal 修复)
- spcx-silent-fail-repro.md: 类似的小币种 execute 失败 (SPCX / MU 也出现过)
- v4.5.18: execute 反查硬约束 (USDT 冻结 + 持仓张数验证)