7.1 KiB
7.1 KiB
钉钉通知功能实现总结
✅ 已完成功能
1. 核心模块开发
notifiers/dingtalk.py
- ✅ 钉钉Markdown消息发送
- ✅ 加签验证(安全增强)
- ✅ 交易信号格式化
- ✅ 错误通知支持
- ✅ 发送统计和重试机制
scheduler.py 集成
- ✅ 自动初始化钉钉通知器
- ✅ 在生成BUY/SELL信号后自动发送
- ✅ HOLD信号不发送(减少噪音)
- ✅ 异常处理和日志记录
2. 配置管理
docker-compose.yml
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 - 详细配置指南
- ✅ 包含钉钉机器人创建步骤
- ✅ 包含故障排查指南
- ✅ 包含消息示例
📊 消息格式特性
支持的消息类型
-
交易信号通知 (BUY/SELL)
- 信号类型和置信度
- 量化分析详情
- AI深度分析(如果启用)
- 交易机会细分:
- 📊 日内交易机会 (Intraday)
- 📈 中长线交易机会 (Swing)
- 📌 埋伏点位 (Ambush)
- 价格位建议(入场/止损/止盈)
- 风险回报比
- 综合建议和警告
-
系统错误通知 (未来支持)
- 错误消息
- 上下文信息
- @所有人
Markdown格式优化
- ✅ 清晰的层级结构(标题/子标题)
- ✅ 信号类型emoji标识(🟢 BUY / 🔴 SELL / 🟡 HOLD)
- ✅ 关键信息加粗
- ✅ 引用格式的AI分析
- ✅ 列表格式的价格位和因素
- ✅ 分隔线划分区块
- ✅ 页脚免责声明
🔐 安全特性
1. 加签验证
# 自动生成时间戳和签名
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服务后,系统会自动:
- 每5分钟生成一次交易信号
- 如果信号为BUY或SELL,自动发送钉钉通知
- 如果信号为HOLD,跳过通知
# 启动自动信号生成
docker compose --profile scheduler up -d
# 查看日志
docker compose logs -f scheduler
手动测试
# 测试钉钉通知
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
📊 预期效果
钉钉群将收到
测试消息
# 🚀 钉钉通知测试
这是一条测试消息,用于验证钉钉webhook配置是否正确。
**测试时间**: 2025-11-30 14:55:00
---
*如果您收到此消息,说明配置成功!*
真实交易信号(示例)
# 🟢 交易信号: 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
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集成
# 初始化
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回调(供第三方系统集成)
✅ 验收清单
- notifiers模块创建完成
- DingTalkNotifier类实现
- 加签验证功能
- Markdown格式化
- scheduler集成
- docker-compose配置
- requirements.txt更新
- 配置文档编写
- 测试消息发送成功
- 模拟信号发送成功
- 用户配置已应用
📞 支持
如有问题,请参考:
- DINGTALK_SETUP.md - 配置指南
- 查看日志:
docker compose logs scheduler - 检查统计: 调用
notifier.get_stats()
状态: ✅ 完全实现并测试通过 版本: 1.0.0 日期: 2025-11-30