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

3.8 KiB

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 重测:

echo "[熬鹰币安实盘]
[币种]: ZAMAUSDT 永续 | 全仓 | 2x
[方向]: 做多 🟩
[原仓位]: 3273787 3276027 ZAMA ..." | python3 process_signal.py

# 输出: ⏭️ 重复信号,跳过
# 期望: ⏭️ 减仓幅度过小 (0.05% < 1%), 跳过

→ 真实过滤逻辑没有触发(卡在 dedup 层)。

fix: 测试前手动清 dedup

sqlite3 ~/.hermes/trading/signal_dedup.db "DELETE FROM processed WHERE 1=1;"

或更精确 (只清特定 symbol):

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 卖单:

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)。