| app | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| requirements.txt | ||
TradingView Alert Dispatcher
接收 TradingView webhook alert,按 timeframe / symbol / strategy 等条件路由到飞书 webhook,并提供管理控制台。
Run Locally
python3 -m app
默认地址:http://localhost:8000
默认登录:
- 用户名:
admin - 密码:由
ADMIN_PASSWORD决定,.env.example中示例为12345678
首次启动会把 ADMIN_PASSWORD 写入数据库并保存为哈希。之后请在管理台的「账号安全」页面修改密码;修改后环境变量不会覆盖数据库中的新密码。
Docker Compose 会自动读取同目录 .env。示例:
ADMIN_USERNAME=admin
ADMIN_PASSWORD=12345678
SESSION_SECRET=DBUwycvdxjSUZX4LMvUKa0xMzWKzFJmg
WEBHOOK_TOKEN=vvyVmc33aC0I85LkH4yrd6ojvkqmyrb1
Docker
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
{
"timeframe": "5m",
"symbol": "BTCUSDT",
"strategy": "breakout",
"action": "buy",
"price": 68000
}
发送到:
POST /webhook/tradingview
Content-Type: application/json
如果设置了 WEBHOOK_TOKEN,TradingView 需要使用以下任一方式携带 token:
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 信号。当前默认路由逻辑只匹配最高优先级的规则,但这条规则可以同时分发到多个飞书目标。
示例正文模板:
**品种**: {{symbol}}
**周期**: {{timeframe}}
**策略**: {{strategy}}
**动作**: {{action}}
**价格**: {{price}}
Environment
ADMIN_USERNAMEADMIN_PASSWORDSESSION_SECRETWEBHOOK_TOKENDATABASE_PATHRETENTION_DAYSMAX_DELIVERY_ATTEMPTSRETRY_BACKOFF_SECONDSFEISHU_TIMEOUT_SECONDSWORKER_INTERVAL_SECONDS