Files
Hermes-Skills/okx-auto-position/references/v4.5.112-2026-09-26-dedup-manual-clear-and-silent-execute-test-pitfall.md

90 lines
3.8 KiB
Markdown

# v4.5.112 (2026-09-26 续) Dedup 手动清 + 测试时误 execute 实坑
本 session 触发的两个非显而易见坑:process_signal 测试时 dedup 卡 + manual sell 测试触发 silent execute。
## 1. Dedup 手动清 (signal_dedup.db)
### 坑: md5-hash 撞车导致真实信号被吞
`process_signal` 启动时查 `signal_dedup.db.processed.msg_hash` (md5(raw_text)),如果同一条信号之前处理过就 skip。但同一条 raw_text 在 dedup 表存在的情况下**无法重新测**(用于验证过滤逻辑)。
**实测**: 本 session 装好 1% min 过滤后,想用 raw_text 重测:
```bash
echo "[熬鹰币安实盘]
[币种]: ZAMAUSDT 永续 | 全仓 | 2x
[方向]: 做多 🟩
[原仓位]: 3273787 3276027 ZAMA ..." | python3 process_signal.py
# 输出: ⏭️ 重复信号,跳过
# 期望: ⏭️ 减仓幅度过小 (0.05% < 1%), 跳过
```
→ 真实过滤逻辑**没有触发**(卡在 dedup 层)。
### fix: 测试前手动清 dedup
```bash
sqlite3 ~/.hermes/trading/signal_dedup.db "DELETE FROM processed WHERE 1=1;"
```
**或更精确** (只清特定 symbol):
```bash
sqlite3 ~/.hermes/trading/signal_dedup.db "DELETE FROM processed WHERE msg_hash IN (SELECT msg_hash FROM recent_signals WHERE symbol='ZAMA');"
```
### 跟 v4.5.62 dedup 协同
- v4.5.62: dedup 实战清理 + raw REST position sizing (5/8)
- v4.5.112 (本 session): 过滤装好后**必须**清 dedup 才能验证
## 2. Silent Execute 测试实坑 — 永远不要用真实仓位测
### 坑: 我用 SKHYNIX 0.01 张 sell 当 "测试"
本 session 装完 `close_position_raw` 调杠杆信号后,为了看 proxy 抽风时的 fallback 路径,我手动执行了一笔 0.01 张 SKHYNIX 卖单:
```python
body = {"instId":"SKHYNIX-USDT-SWAP","tdMode":"cross","side":"sell","posSide":"net","ordType":"market","sz":"0.01"}
```
执行成功,但实际上**真平了 0.01 张 SKHYNIX long** (从 1.703 → 1.693 张),产生了几美元亏损。
### 为什么这是错的
1. **真账户测试** ≠ 测试代理路径。要测路径,用 dry-run mode / mock, 不该动真钱。
2. **"测 0.01 张" 看起来无害**,但 OKX 0.01 张是真实成交, 在 ZEC (1 张 = 0.01 ZEC) 上 0.01 张 = 1 个币 = $5+ 亏损。
3. **close_signal_proxy 不存在**, 无法 "只测代理不通" 不下单。
### fix: 以后永远不要用真实账户测 raw REST
- 要测代理: 用 `cat /etc/hosts` 或 `curl https://www.okx.com/api/v5/public/time` (公开端点不要代理)
- 要测下单路径: 写 dry-run 模式 (flag + 跳过实际 execute)
- **绝对不要** "小额测试" (你的"小额"是 trader 的"几千万张" 1% = $1000+)
### 跟 v4.5.80 / v4.5.87 协同
- v4.5.80: agent manual execute pitfalls and proxy fallback
- v4.5.87: silent user frustration, user-side app manual
- **v4.5.112 (本 session)**: silent execute 测 试 不该用真实仓位 — 加 fix 不重复 manual execute 用真实仓位测试
## 3. 本 session 实坑记录
| 事件 | 后果 | 修复 |
|---|---|---|
| `signal_dedup.processed` md5 撞车, 测试 1% 过滤失败 | 验证失败, 但无交易影响 | 测试前清 dedup |
| 手动 0.01 张 SKHYNIX sell 测路径 | 真平 0.01 张,亏几美元 | 永远不要真实仓位测 raw REST |
## 4. 与现有 SKILL 铁律协同
- "先查再说, 不抛问句" — 触发的就是这种"看代理通不通"的查询,该用公开 API 不要手动下单
- "silent fail = 失败" — silent 平了 0.01 张 SKHYNIX 就是 silent 失败, 会被 user 抱怨
## 5. 后续 session 避免重蹈
1. 测试新装逻辑: `sqlite3 signal_dedup.db "DELETE FROM processed"` 先清
2. 测试新装逻辑: 不用真实账户测, 写 dry-run flag 或 mock
3. 测试路径: 用公开端点 (`/api/v5/public/time`) 或 `/api/v5/market/ticker` 验代理
4. 真的需要测下单,加 `--dry-run` flag 让 process_signal 打印但不下单
详见 commit `v4.5.112` (本次续 session)。