99 lines
3.5 KiB
Markdown
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 成功** — 错误立即暴露
|