trading skills: 文档同步 (单币上限规则/平仓盈亏字段/静默规则/推送模板)

This commit is contained in:
2026-09-25 01:25:13 +08:00
parent c83161d87e
commit f46abb8ca3
111 changed files with 12151 additions and 224 deletions
@@ -0,0 +1,117 @@
# TG Forwarder `enable_rule=0` Silent Killer (2026-08-06 实战)
## 症状
- `signal_queue.db` 几小时到几天没有新信号
- `signal-queue-retry` cron 每 5 分钟跑 (silent / empty output — 没有 pending)
- 用户问"为什么没跟单"——以为是 bug
- 实际上 **TG forwarder 收到源频道信号**,但 **rule disabled**,所以不转发到目标群
- `signal_queue.db` 没有数据,因为数据来源(target group)从未收到消息
## 误诊路径(我犯过的)
1. **看 signal_queue.db pending=0** → "没信号,正常"
2. **看 process_signal 输出** → "一切正常"
3. **看 mihomo / Telegram forwarder 容器** → "running"
4. **看 cron output** → "silent OK"
**全对,但链路在最上游断**。
## 真凶: `forward_rules.enable_rule=0`
`/app/db/forward.db` 表 `forward_rules.enable_rule` 字段是 boolean。
规则存在 + enable=0 = **完全不匹配,不转发,不报错**。
### 诊断命令
```bash
docker exec telegram-forwarder python3 -c "
import sqlite3
conn = sqlite3.connect('/app/db/forward.db')
for r in conn.execute('SELECT id, source_chat_id, target_chat_id, enable_rule, add_mode FROM forward_rules').fetchall():
print(f'rule {r[0]}: src={r[1]} -> tgt={r[2]} enable={r[3]} add_mode={r[4]}')
"
```
### 修复
```bash
# 1. 找到 enable=0 的规则
docker exec telegram-forwarder python3 -c "
import sqlite3
conn = sqlite3.connect('/app/db/forward.db')
for r in conn.execute('SELECT id FROM forward_rules WHERE enable_rule=0').fetchall():
print(r[0])
"
# 2. 批量 enable
docker exec telegram-forwarder python3 -c "
import sqlite3
conn = sqlite3.connect('/app/db/forward.db')
conn.execute('UPDATE forward_rules SET enable_rule=1 WHERE enable_rule=0')
conn.commit()
print(f'updated {conn.total_changes} rows')
"
# 3. 重启 forwarder 加载新规则
docker restart telegram-forwarder
```
## 何时 enable_rule 被禁用?
- 手动通过 bot 命令 (`/sw` / `/off`) 关闭
- Web UI 误操作
- **forwarder 升级/migration 时的默认值变更**
- 数据迁移时未保留 enable 字段
## 预防 — 加 cron 守护
**加 cron 每小时检查一次** `enable_rule=0` 的规则 → **告警** (推 QQ) 但不自动改:
```bash
# cron: forwarder-rule-guardian (每小时)
#!/bin/bash
DISABLED=$(docker exec telegram-forwarder python3 -c "
import sqlite3
conn = sqlite3.connect('/app/db/forward.db')
print(len(conn.execute('SELECT 1 FROM forward_rules WHERE enable_rule=0').fetchall()))
" 2>/dev/null)
if [ "$DISABLED" != "0" ]; then
echo "⚠️ forwarder rule disabled count: $DISABLED"
fi
```
## 通用诊断流程(下次"信号没了")
```bash
# 1. signal_queue.db 最后一条
sqlite3 ~/.hermes/trading/signal_queue.db "SELECT MAX(created_at) FROM queue"
# 2. forwarder 收到消息没?(telethon log)
docker logs telegram-forwarder --since 6h 2>&1 | grep -E "message_listener|规则.*未启用" | tail -10
# 3. forwarder 规则 enabled?
docker exec telegram-forwarder python3 -c "
import sqlite3
conn = sqlite3.connect('/app/db/forward.db')
for r in conn.execute('SELECT id, source_chat_id, target_chat_id, enable_rule FROM forward_rules').fetchall(): print(r)
"
# 4. source chat 是否在用?源 chat_id 对应到 target chat_id?
# 5. forwarder 容器 health
docker ps | grep telegram-forwarder
```
## 关键差异 vs `tg_signal_monitor.py` 表名错 (v4.5.39)
- **v4.5.39**: 监听器代码 bug,完全不读消息 → **forwarder 自己没问题**
- **本节**: 监听器正常,消息已到 forwarder → **forwarder rule disabled,不转发**
两种都让 `signal_queue.db` 没新数据,但**根因完全不同**。
## 关联
- `references/v4.5.39-tg-monitor-forwarder-table-bug-and-cron-disconnects.md` — 监听器层 bug
- `references/tg-forwarder-ops.md` — forwarder 基础运维
- `references/v4.5.41-signal-queue-done-but-no-order-execute.md` — 下游执行层 bug
- `references/v4.5.42-insufficient-funds-explicit-notify.md` — 下单失败通知