114 lines
4.9 KiB
Markdown
114 lines
4.9 KiB
Markdown
# 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 冻结 + 持仓张数验证) |