5.5 KiB
5.5 KiB
实时监测功能优化说明
修复日期
2025年10月9日
问题描述
问题1:邮件通知未发送
- 现象:邮件测试可以发送接收成功,但实时监控运行后到达价格,网页有通知,但邮件收不到通知
- 原因:监测服务检测到价格触发条件时,只是将通知添加到数据库,但从未调用邮件发送功能
问题2:数据获取过于频繁
- 现象:终端日志显示大量"获取实时数据失败"错误,连接被远程服务器关闭
- 原因:
- 监测循环间隔太短(60秒)
- 多个股票同时请求数据,导致API限流
- 获取失败后没有更新检查时间,导致持续重试
修复内容
1. 邮件通知修复 (monitor_service.py)
修改点:
- 在检测到价格触发条件后,立即调用
notification_service.send_notifications()发送邮件通知 - 触发条件包括:
- 进入进场区间
- 达到止盈位
- 达到止损位
- 量化交易执行
代码示例:
# 检查进场区间
if current_price >= entry_range['min'] and current_price <= entry_range['max']:
if not monitor_db.has_recent_notification(stock['id'], 'entry', minutes=60):
message = f"股票 {stock['symbol']} ({stock['name']}) 价格 {current_price} 进入进场区间"
monitor_db.add_notification(stock['id'], 'entry', message)
# 立即发送通知(包括邮件)
notification_service.send_notifications()
2. 防止重复通知 (monitor_db.py)
新增功能:
- 添加
has_recent_notification()方法 - 检查是否在最近60分钟内已发送过相同类型的通知
- 避免同一个价格触发条件重复发送邮件
代码示例:
def has_recent_notification(self, stock_id: int, notification_type: str, minutes: int = 60) -> bool:
"""检查是否在最近X分钟内已有相同类型的通知"""
# 查询数据库检查重复
3. 优化监测频率 (monitor_service.py)
修改点:
-
增加监测循环间隔
- 从 60秒 → 300秒(5分钟)
- 减少循环次数,降低系统负载
-
增加股票间延迟
- 每个股票请求之间等待3秒
- 避免同时请求多个股票导致API限流
-
智能跳过检查
- 根据每个股票的
check_interval参数判断是否需要更新 - 显示距离下次检查的剩余时间
- 根据每个股票的
-
失败重试优化
- 获取失败时也更新
last_checked时间 - 避免持续重试失败的请求
- 错误后等待60秒再继续
- 获取失败时也更新
代码示例:
def _monitor_loop(self):
"""监测循环"""
print("监测服务已启动")
while self.running:
try:
self._check_all_stocks()
time.sleep(300) # 每5分钟检查一次
except Exception as e:
print(f"监测服务错误: {e}")
time.sleep(60) # 错误后等待1分钟再重试
4. 新增数据库方法 (monitor_db.py)
新增:
def update_last_checked(self, stock_id: int):
"""仅更新最后检查时间(用于获取失败的情况)"""
# 即使价格获取失败,也更新检查时间
# 避免持续重试
使用说明
监测间隔设置
- 在添加或编辑股票监测时,可以设置
check_interval参数 - 建议设置:
- 日内短线:5-15分钟
- 波段交易:30-60分钟
- 长线投资:120分钟或更长
邮件通知配置
确保 .env 文件中配置了以下参数:
EMAIL_ENABLED=true
SMTP_SERVER=smtp.qq.com
SMTP_PORT=587
EMAIL_FROM=your_email@qq.com
EMAIL_PASSWORD=your_authorization_code
EMAIL_TO=receiver@example.com
监测日志查看
监测服务会在终端输出以下信息:
✅ {symbol} 当前价格: ¥{price}- 成功获取价格股票 {symbol} 距离下次检查还有 X 分钟- 跳过检查❌ 更新股票 {symbol} 价格失败- 获取失败✅ 本轮共更新了 X 只股票- 本轮统计
注意事项
-
API限流
- 避免设置过短的监测间隔(建议 ≥ 5分钟)
- 监测股票数量过多时,适当增加间隔
-
邮件通知
- 同一触发条件60分钟内只发送一次
- 测试邮件功能正常不代表监测邮件一定能发送
- 检查邮箱垃圾箱
-
数据准确性
- 非交易时间获取的价格可能不准确
- 建议在交易时间内使用监测功能
-
系统资源
- 监测服务在后台线程运行
- 长时间运行建议定期检查日志
- 可以随时启动/停止监测服务
测试建议
-
邮件通知测试
1. 先发送测试邮件,确认邮件配置正确 2. 添加一只股票,设置较宽的进场区间 3. 等待价格进入区间,查看是否收到邮件 -
频率控制测试
1. 添加2-3只股票,设置不同的监测间隔 2. 启动监测服务 3. 观察终端日志,确认按间隔更新
预期效果
✅ 价格到达触发条件时,同时收到:
- 网页界面通知
- 邮件通知
✅ 监测频率合理:
- 按照设置的间隔获取价格
- 不会频繁请求导致API限流
- 减少"获取实时数据失败"错误
✅ 系统更稳定:
- 获取失败不会持续重试
- 每个股票之间有延迟保护
- 更好的错误处理和日志输出
相关文件
monitor_service.py- 监测服务核心逻辑monitor_db.py- 数据库操作notification_service.py- 邮件通知服务monitor_manager.py- 监测管理界面.env- 邮件配置文件