Files
Hermes-Skills/okx-auto-position/references/advisor-fuzzy-symbol-match-and-error-surfacing.md
T

99 lines
3.5 KiB
Markdown

---
name: advisor-fuzzy-symbol-match-and-error-surfacing
description: "币种找不到时自动模糊匹配 (ETH / ETHUSDT / 1000PEPE 多格式), 不要默默 fail — 立即推送用户可读错误"
version: 1.0.0
type: reference
---
# 🔍 advisor 币种匹配 + 错误暴露实战教训 (2026-07-15)
## 问题: advisor silent fail
**症状**: TG 信号原文 `【币种】: ETHUSDT|永续|5x`,advisor 接 `--symbol ETH` 找不到 inst, **错误信息是英文**, 用户看不到 / QQ 不推, **默默 retry 死循环**
**用户原话** (2026-07-15): "找不到你是不是该早点通知我呢, 这也需要我来完善skill吗。能不能用了。"
**根因**: advisor 硬编码拼接 `f"{base}-USDT-SWAP"`, 没考虑:
- `1000PEPE` (meme, USDC pair)
- `1000PEPEUSDT` (原始 OKX 内部格式)
- `ETHUSDT` (无 - 分隔符格式)
- 网络抽风时直接 NetworkError
## ✅ 修复: 三层 fallback (2026-07-15)
`okx_position_advisor.py` `recommend_position()`:
```python
# 1000PEPE 等 meme 是 USDC pair, 所以也要试
base = symbol.split('/')[0].replace(':USDT', '').replace(':USD', '').replace('1000', '') # 1000PEPE -> PEPE
base_alt = symbol.split('/')[0].replace(':USDT', '').replace(':USD', '') # 保留 1000PEPE 原样
inst_id = None
candidates = [
f"{base}-USDT-SWAP", # PEPE-USDT-SWAP (去 1000)
f"{base_alt}-USDT-SWAP", # 1000PEPE-USDT-SWAP (原样)
f"{base_alt}USDT-USDT-SWAP", # 1000PEPEUSDT-USDT-SWAP
f"{base}-USDC-SWAP", # PEPE-USDC-SWAP (meme)
f"{base_alt}-USDC-SWAP", # 1000PEPE-USDC-SWAP
]
spec = None
tried = []
for inst in candidates:
try:
spec = get_instrument(exchange, inst)
inst_id = inst
break
except Exception as e:
tried.append(f"{inst}({e})")
# 终极 fallback: 查 OKX 所有 instrument, 模糊匹配 base
if not spec:
try:
all_inst = exchange.public_get_public_instruments({'instType': 'SWAP'})
for item in all_inst.get('data', []):
if item.get('baseCcy', '').upper() == base.upper() and item.get('quoteCcy') == 'USDT':
inst_id = item['instId']
spec = get_instrument(exchange, inst_id)
break
except Exception as e:
tried.append(f"all_inst({e})")
if not spec:
return {'error': f'找不到币种 {base} (尝试: {", ".join(tried[:3])})'}
```
**关键**:
- `tried` 列表记录每次失败的 candidate + 错误, 用户可见
- 终极 fallback 查 OKX 全部 SWAP inst, 模糊匹配 base
- 全部失败 → 返回中文错误信息, `format_message` 会推到 QQ
## 测试用例 (实际跑过, 2026-07-15)
| symbol 输入 | 实际匹配 | 状态 |
|-------------|---------|------|
| `ETH` | `ETH-USDT-SWAP` | ✅ |
| `ETHUSDT` | `ETH-USDT-SWAP` | ✅ |
| `BTC` | `BTC-USDT-SWAP` | ✅ |
| `1000PEPE` | `1000PEPE-USDC-SWAP` | ✅ (新) |
| `DOGE` | `DOGE-USDT-SWAP` | ✅ |
| `XXX` (无效) | 全部失败 → 错误信息 | ✅ (推送 QQ) |
## 运行模式: **必须用 proxychains4**
```bash
# ❌ 直接 python3 → 国内 VPS 网络抽风, NetworkError
python3 okx_position_advisor.py --symbol ETH --side long
# ✅ proxychains4 + Clash 香港出口
proxychains4 -f ~/.proxychains/proxychains.conf \
python3 ~/.hermes/skills/trading/okx-auto-position/scripts/okx_position_advisor.py \
--symbol ETH --side long --leverage 7 --json
```
## 相关 Pitfall (2026-07-15)
**用户原话**: "你是说币种找不到吗。那你模糊匹配啊"
- advisor silent fail 浪费 30+ 分钟
- 用户**已经急**
- **永远不要假设 advisor 成功** — 错误立即暴露