340 lines
7.1 KiB
Markdown
340 lines
7.1 KiB
Markdown
# 钉钉通知功能实现总结
|
||
|
||
## ✅ 已完成功能
|
||
|
||
### 1. 核心模块开发
|
||
|
||
#### notifiers/dingtalk.py
|
||
- ✅ 钉钉Markdown消息发送
|
||
- ✅ 加签验证(安全增强)
|
||
- ✅ 交易信号格式化
|
||
- ✅ 错误通知支持
|
||
- ✅ 发送统计和重试机制
|
||
|
||
#### scheduler.py 集成
|
||
- ✅ 自动初始化钉钉通知器
|
||
- ✅ 在生成BUY/SELL信号后自动发送
|
||
- ✅ HOLD信号不发送(减少噪音)
|
||
- ✅ 异常处理和日志记录
|
||
|
||
### 2. 配置管理
|
||
|
||
#### docker-compose.yml
|
||
```yaml
|
||
scheduler:
|
||
environment:
|
||
- DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=...
|
||
- DINGTALK_SECRET=SEC...
|
||
```
|
||
|
||
#### requirements.txt
|
||
- ✅ 添加 requests==2.31.0 依赖
|
||
|
||
### 3. 文档完善
|
||
|
||
- ✅ DINGTALK_SETUP.md - 详细配置指南
|
||
- ✅ 包含钉钉机器人创建步骤
|
||
- ✅ 包含故障排查指南
|
||
- ✅ 包含消息示例
|
||
|
||
---
|
||
|
||
## 📊 消息格式特性
|
||
|
||
### 支持的消息类型
|
||
|
||
1. **交易信号通知** (BUY/SELL)
|
||
- 信号类型和置信度
|
||
- 量化分析详情
|
||
- AI深度分析(如果启用)
|
||
- 交易机会细分:
|
||
- 📊 日内交易机会 (Intraday)
|
||
- 📈 中长线交易机会 (Swing)
|
||
- 📌 埋伏点位 (Ambush)
|
||
- 价格位建议(入场/止损/止盈)
|
||
- 风险回报比
|
||
- 综合建议和警告
|
||
|
||
2. **系统错误通知** (未来支持)
|
||
- 错误消息
|
||
- 上下文信息
|
||
- @所有人
|
||
|
||
### Markdown格式优化
|
||
|
||
- ✅ 清晰的层级结构(标题/子标题)
|
||
- ✅ 信号类型emoji标识(🟢 BUY / 🔴 SELL / 🟡 HOLD)
|
||
- ✅ 关键信息加粗
|
||
- ✅ 引用格式的AI分析
|
||
- ✅ 列表格式的价格位和因素
|
||
- ✅ 分隔线划分区块
|
||
- ✅ 页脚免责声明
|
||
|
||
---
|
||
|
||
## 🔐 安全特性
|
||
|
||
### 1. 加签验证
|
||
```python
|
||
# 自动生成时间戳和签名
|
||
timestamp = int(time.time() * 1000)
|
||
sign = hmac_sha256(f"{timestamp}\n{secret}", secret)
|
||
url = f"{webhook}×tamp={timestamp}&sign={sign}"
|
||
```
|
||
|
||
### 2. 敏感信息保护
|
||
- ✅ Webhook和密钥通过环境变量配置
|
||
- ✅ 不硬编码在代码中
|
||
- ✅ 建议使用 .env.local 文件
|
||
|
||
### 3. 请求限流
|
||
- ✅ 只在BUY/SELL信号时发送
|
||
- ✅ HOLD信号不发送
|
||
- ✅ 避免频繁通知骚扰
|
||
|
||
---
|
||
|
||
## 📱 当前配置状态
|
||
|
||
### 已配置信息
|
||
```
|
||
Webhook: https://oapi.dingtalk.com/robot/send?access_token=9438788...
|
||
Secret: SEC88678d8970f0882a1cca36476b92947409fea5f562a09db4cd03524...
|
||
状态: ✅ 已启用
|
||
```
|
||
|
||
### 测试结果
|
||
```
|
||
✅ 测试消息发送成功
|
||
✅ 模拟交易信号发送成功
|
||
✅ 统计信息正常
|
||
- 发送成功: 2次
|
||
- 发送失败: 0次
|
||
- 成功率: 100%
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 使用方式
|
||
|
||
### 自动发送(推荐)
|
||
|
||
启动scheduler服务后,系统会自动:
|
||
1. 每5分钟生成一次交易信号
|
||
2. 如果信号为BUY或SELL,自动发送钉钉通知
|
||
3. 如果信号为HOLD,跳过通知
|
||
|
||
```bash
|
||
# 启动自动信号生成
|
||
docker compose --profile scheduler up -d
|
||
|
||
# 查看日志
|
||
docker compose logs -f scheduler
|
||
```
|
||
|
||
### 手动测试
|
||
|
||
```bash
|
||
# 测试钉钉通知
|
||
docker compose exec ingestion python -c "
|
||
from notifiers.dingtalk import DingTalkNotifier
|
||
import os
|
||
notifier = DingTalkNotifier(
|
||
webhook_url=os.getenv('DINGTALK_WEBHOOK'),
|
||
secret=os.getenv('DINGTALK_SECRET')
|
||
)
|
||
notifier.send_markdown('测试', '# 测试消息\n\n这是一条测试消息')
|
||
"
|
||
|
||
# 手动生成信号(会自动发送通知)
|
||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 预期效果
|
||
|
||
### 钉钉群将收到
|
||
|
||
#### 测试消息
|
||
```markdown
|
||
# 🚀 钉钉通知测试
|
||
|
||
这是一条测试消息,用于验证钉钉webhook配置是否正确。
|
||
|
||
**测试时间**: 2025-11-30 14:55:00
|
||
|
||
---
|
||
|
||
*如果您收到此消息,说明配置成功!*
|
||
```
|
||
|
||
#### 真实交易信号(示例)
|
||
```markdown
|
||
# 🟢 交易信号: BUY
|
||
|
||
**时间**: 2025-11-30 14:55:28
|
||
**置信度**: 75.0%
|
||
**共识**: QUANT_LLM_AGREE
|
||
|
||
---
|
||
|
||
## 📊 量化分析
|
||
- **信号**: BUY
|
||
- **综合得分**: 51.5
|
||
- **置信度**: 75.0%
|
||
- **趋势得分**: 99.0
|
||
- **动量得分**: 75.0
|
||
- **订单流得分**: -7.8
|
||
|
||
## 🤖 AI深度分析
|
||
- **信号**: BUY
|
||
- **置信度**: 60.0%
|
||
- **风险等级**: MEDIUM
|
||
|
||
### 📊 日内交易机会
|
||
- **方向**: LONG
|
||
- **入场**: $91,128.00
|
||
- **止损**: $91,000.00
|
||
- **止盈**: $91,342.00
|
||
- **说明**: 5分钟和15分钟周期呈现上涨趋势,MACD金叉扩大...
|
||
|
||
### 📌 埋伏点位
|
||
- **埋伏价位**: $90,612.00
|
||
- **说明**: 等待价格回调至4小时支撑位90612附近...
|
||
|
||
### 💡 AI分析
|
||
> 当前市场呈现多周期趋势分歧,日线下跌但短周期上涨...
|
||
|
||
**关键因素**:
|
||
- 多周期趋势分歧
|
||
- 成交量萎缩
|
||
- RSI中性区域
|
||
|
||
## 💰 价格位
|
||
- **当前价格**: $91,650.10
|
||
- **入场价**: $91,650.10
|
||
- **止损价**: $90,985.52
|
||
- **目标价1**: $92,646.96
|
||
- **目标价2**: $93,311.54
|
||
- **目标价3**: $94,308.40
|
||
- **风险回报比**: 1:1.50
|
||
|
||
## 📝 综合建议
|
||
> 量化和AI分析一致看多,建议在回调时逢低做多
|
||
|
||
## ⚠️ 风险提示
|
||
- 市场波动较大,注意风险控制
|
||
|
||
---
|
||
|
||
*本信号由AI量化系统自动生成,仅供参考,不构成投资建议*
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 日志示例
|
||
|
||
### 成功发送
|
||
```
|
||
📱 发送钉钉通知...
|
||
✅ 钉钉消息发送成功: 🚨 交易信号: BUY (置信度: 75%)
|
||
✅ 钉钉通知发送成功
|
||
```
|
||
|
||
### 跳过发送
|
||
```
|
||
ℹ️ HOLD信号,跳过钉钉通知
|
||
```
|
||
|
||
### 未配置
|
||
```
|
||
⚠️ 钉钉通知发送失败或未配置
|
||
```
|
||
|
||
---
|
||
|
||
## 🛠️ 技术实现细节
|
||
|
||
### 依赖库
|
||
- requests==2.31.0 - HTTP请求
|
||
- hmac, hashlib, base64 - 加签验证(内置库)
|
||
|
||
### 关键类和方法
|
||
|
||
#### DingTalkNotifier
|
||
```python
|
||
class DingTalkNotifier:
|
||
def __init__(webhook_url, secret, enabled)
|
||
def send_markdown(title, text, at_mobiles, at_all) -> bool
|
||
def send_signal(aggregated_signal) -> bool
|
||
def send_error(error_msg, context) -> bool
|
||
def get_stats() -> dict
|
||
```
|
||
|
||
#### SignalScheduler集成
|
||
```python
|
||
# 初始化
|
||
self.dingtalk = DingTalkNotifier(
|
||
webhook_url=os.getenv('DINGTALK_WEBHOOK'),
|
||
secret=os.getenv('DINGTALK_SECRET')
|
||
)
|
||
|
||
# 发送
|
||
if final_signal in ['BUY', 'SELL']:
|
||
self.dingtalk.send_signal(aggregated)
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 下一步优化建议
|
||
|
||
### 短期
|
||
- ✅ 基础功能已完成
|
||
- ⏳ 添加消息去重(避免短时间内重复发送相同信号)
|
||
- ⏳ 添加@特定人员功能
|
||
- ⏳ 支持自定义消息模板
|
||
|
||
### 中期
|
||
- ⏳ 每日交易汇总报告
|
||
- ⏳ 系统错误实时告警
|
||
- ⏳ 重要市场事件推送(如大幅波动)
|
||
- ⏳ 信号准确率统计和回测结果推送
|
||
|
||
### 长期
|
||
- ⏳ 支持企业微信
|
||
- ⏳ 支持Telegram
|
||
- ⏳ 支持邮件通知
|
||
- ⏳ 支持Webhook回调(供第三方系统集成)
|
||
|
||
---
|
||
|
||
## ✅ 验收清单
|
||
|
||
- [x] notifiers模块创建完成
|
||
- [x] DingTalkNotifier类实现
|
||
- [x] 加签验证功能
|
||
- [x] Markdown格式化
|
||
- [x] scheduler集成
|
||
- [x] docker-compose配置
|
||
- [x] requirements.txt更新
|
||
- [x] 配置文档编写
|
||
- [x] 测试消息发送成功
|
||
- [x] 模拟信号发送成功
|
||
- [x] 用户配置已应用
|
||
|
||
---
|
||
|
||
## 📞 支持
|
||
|
||
如有问题,请参考:
|
||
1. DINGTALK_SETUP.md - 配置指南
|
||
2. 查看日志: `docker compose logs scheduler`
|
||
3. 检查统计: 调用 `notifier.get_stats()`
|
||
|
||
---
|
||
|
||
**状态**: ✅ 完全实现并测试通过
|
||
**版本**: 1.0.0
|
||
**日期**: 2025-11-30
|