tradingview-alert-dispatcher/README.md
2026-05-26 21:10:06 +08:00

110 lines
3.5 KiB
Markdown
Raw Permalink 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.

# TradingView Alert Dispatcher
接收 TradingView webhook alert`timeframe / symbol / strategy` 等条件路由到飞书 webhook并提供管理控制台。
## Run Locally
```bash
python3 -m app
```
默认地址:`http://localhost:8000`
默认登录:
- 用户名:`admin`
- 密码:由 `ADMIN_PASSWORD` 决定,`.env.example` 中示例为 `12345678`
首次启动会把 `ADMIN_PASSWORD` 写入数据库并保存为哈希。之后请在管理台的「账号安全」页面修改密码;修改后环境变量不会覆盖数据库中的新密码。
Docker Compose 会自动读取同目录 `.env`。示例:
```env
ADMIN_USERNAME=admin
ADMIN_PASSWORD=12345678
SESSION_SECRET=DBUwycvdxjSUZX4LMvUKa0xMzWKzFJmg
WEBHOOK_TOKEN=vvyVmc33aC0I85LkH4yrd6ojvkqmyrb1
```
## Docker
```bash
docker compose up --build
```
Compose 会启动两个服务:`dispatcher` 负责 Web/API/管理台,`worker` 负责周期性处理失败重试。
## Delivery Reliability
系统采用“先入库、后发送”的至少一次投递模型:
- TradingView webhook 命中规则后,会先写入 `alerts``deliveries`,再异步发送飞书。
- 未发送的飞书会保留在 `deliveries`,状态为 `pending`、`processing`、`retry` 或 `failed`
- 每次实际发送尝试都会写入 `delivery_attempts`,包括 HTTP 状态、飞书返回体、错误原因和下次重试时间。
- 发送失败会按 `RETRY_BACKOFF_SECONDS` 延迟重试,直到达到 `MAX_DELIVERY_ATTEMPTS`
- 飞书 HTTP 200 但响应体业务码非 0 时,也会按失败处理并进入重试。
- 管理台「日志」页面可以查看未发送、重试中、失败的分发记录,并可手动立即重发。
## TradingView Payload
```json
{
"timeframe": "5m",
"symbol": "BTCUSDT",
"strategy": "breakout",
"action": "buy",
"price": 68000
}
```
发送到:
```text
POST /webhook/tradingview
Content-Type: application/json
```
如果设置了 `WEBHOOK_TOKEN`TradingView 需要使用以下任一方式携带 token
```text
POST /webhook/tradingview?token=your-shared-secret
X-Webhook-Token: your-shared-secret
```
`docker-compose.yml` 默认已经设置了占位 token生产使用前请替换本地临时调试如果不想校验 token可以把 `WEBHOOK_TOKEN` 置为空。
## Feishu Webhooks
「飞书 Webhook」页面只维护目标名称和机器人地址。目标一旦被路由规则选中就会发送不再提供启用/停用状态。
## Feishu Message Templates
路由规则统一发送飞书 interactive card。可以先在「飞书模板」页面维护常用卡片模板再在新增或编辑路由规则时从下拉框一键套用。
标题和正文模板支持 `{{field}}` 占位符,字段来自 TradingView alert JSON。嵌套字段可以写成 `{{order.id}}`
每条路由规则通过「发送到」多选框选择一个或多个飞书 Webhook。`timeframe`、`symbol`、`strategy` 至少填写一个,空字段表示不限。例如只填 `symbol=BTCUSDT` 会匹配所有 BTCUSDT 信号。当前默认路由逻辑只匹配最高优先级的规则,但这条规则可以同时分发到多个飞书目标。
示例正文模板:
```text
**品种**: {{symbol}}
**周期**: {{timeframe}}
**策略**: {{strategy}}
**动作**: {{action}}
**价格**: {{price}}
```
## Environment
- `ADMIN_USERNAME`
- `ADMIN_PASSWORD`
- `SESSION_SECRET`
- `WEBHOOK_TOKEN`
- `DATABASE_PATH`
- `RETENTION_DAYS`
- `MAX_DELIVERY_ATTEMPTS`
- `RETRY_BACKOFF_SECONDS`
- `FEISHU_TIMEOUT_SECONDS`
- `WORKER_INTERVAL_SECONDS`