Files
Hermes-Skills/okx-auto-position/references/v2.6-trader-and-price-fix.md
T

121 lines
3.7 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.
---
name: v2.6-trader-and-price-fix
description: "v2.6 修复: trader fallback + 价格格式化 (用户原话: 之前是有消息模板的)"
version: 2.6.0
type: reference
---
# 🔧 OKX Signal Push 修复 (2026-07-13)
## 🐛 问题 1: Trader 字段 = "币种"
**症状**: 推送显示 `信号源: 币种 ? SKHY(价值$?)`
**根因**: `parse_signal` L41 用 `re.search(r'【([^】]+)】', text)` 抓**第一个**方括号 → `【币种】` 被当成 trader。
**修复 (3 层 fallback)**:
```python
def parse_signal(text):
fields = {}
# 1. 优先: 【交易员】标签
m = re.search(r'【交易员】\s*[:]?\s*([^【\n]{1,20})', text)
if m_trader:
fields['trader'] = m_trader.group(1).strip()
else:
# 2. Fallback: 👉 跟单就选 X
m_follow = re.search(r'👉\s*跟单就选\s*(\S+)', text)
if m_follow:
fields['trader'] = m_follow.group(1).strip()
else:
# 3. 第一个【xx】但跳过字段名
FIELD_NAMES = {'币种', '方向', '杠杆', '仓位大小', '仓位价值',
'开仓价', '当前价', '未实现盈亏', '收益额'}
m_first = re.search(r'【([^】]{1,20})】', text)
if m_first and m_first.group(1) not in FIELD_NAMES:
fields['trader'] = m_first.group(1).strip()
else:
fields['trader'] = 'unknown'
return fields
```
**测试 SKHY**:
```
原始: 【币种】: SKHYUSDT|5x 【方向】做空 👉 跟单就选 X聚合社区
修复后: trader = 'X聚合社区' ✅
```
**实战 2026-07-15 二次修正**: 部分信号(如 🚨已平仓提醒 + 收益额格式)**无 trader 标签也无 👉尾缀**,三层 fallback 全 miss → trader='unknown' → 推送 `unknown ? BTC(价值$?)` 用户看不到头。
**v2.6.1 追加 fallback** (默认 X聚合社区,用户 TG 唯一信号源):
```python
if m_first and m_first.group(1) not in FIELD_NAMES:
fields['trader'] = m_first.group(1).strip()
else:
# 实在找不到 → 默认 X聚合社区 (用户 TG 唯一信号源, 比 'unknown' 有用)
fields['trader'] = 'X聚合社区'
```
**测试信号** (无 trader 信息):
```
🚨 已平仓提醒
【币种】: SKHYNIX
【方向】: 做多
【收益额】: +11.53%
→ trader = 'X聚合社区' (不再 'unknown')
```
## 🐛 问题 2: 价格 18 位小数
**症状**: `入场: $161.01076124567473` (OKX 浮点×比率算出 18 位)
**修复**: `_fmt()` helper:
```python
def _fmt(x, n=4):
"""数字 round 到 n 位,字符串保留原样"""
try:
return f"{float(x):.{n}f}"
except (ValueError, TypeError):
return str(x)
# 模板里所有 ${...} 替换:
入场: ${_fmt(entry_price)} | 当前: ${_fmt(current)}
SL: ${_fmt(rec['sl_price'])} 预亏 -{_fmt(sl_pnl)} USDT
```
⚠️ **value 字段** (`价值 $?`) 空时, `_fmt(?)` 抛异常 → catch 后保留原 `?`
## 📋 之前模板参考
```python
msg = f"""⚡ 跟单建议 | {symbol} {side_cn} {emoji} {leverage}x
📊 信号源: {trader}
入场: ${_fmt(entry_price)} | 当前: ${_fmt(current)}
浮盈: {pnl_sign}{pnl:.0f} {pnl_emoji}
📊 仓位变化
{comparison}
{trader_rating}
📐 性价比
• 你的仓位: {contracts}张 (保证金{_fmt(margin)} USDT)
• SL: ${_fmt(sl_price)} → 预亏 -{_fmt(sl_pnl)} USDT
• TP: ${_fmt(tp_price)} → 预盈 +{_fmt(tp_pnl)} USDT
• 盈亏比: {rr}:1 {rating_emoji} {rating_text}"""
```
## 🔧 测试用例
```python
test = """📈 大佬加仓
【币种】: SKHYUSDT|永续|5x
【方向】: 做空 🟥
【仓位】: 528.16 SKHY
【开仓价】: 161.90000
👉 跟单就选 X聚合社区"""
parse_signal(test)
# → {'trader': 'X聚合社区', 'symbol': 'SKHY', 'side': '做空', ...}
```