90 lines
3.8 KiB
Markdown
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)。 |