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