Files
aiagents-stock/实时监测优化说明.md
T
2025-10-09 11:47:54 +08:00

5.5 KiB
Raw Blame History

实时监测功能优化说明

修复日期

2025年10月9日

问题描述

问题1:邮件通知未发送

  • 现象:邮件测试可以发送接收成功,但实时监控运行后到达价格,网页有通知,但邮件收不到通知
  • 原因:监测服务检测到价格触发条件时,只是将通知添加到数据库,但从未调用邮件发送功能

问题2:数据获取过于频繁

  • 现象:终端日志显示大量"获取实时数据失败"错误,连接被远程服务器关闭
  • 原因
    1. 监测循环间隔太短(60秒)
    2. 多个股票同时请求数据,导致API限流
    3. 获取失败后没有更新检查时间,导致持续重试

修复内容

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)

修改点:

  1. 增加监测循环间隔

    • 从 60秒 → 300秒(5分钟)
    • 减少循环次数,降低系统负载
  2. 增加股票间延迟

    • 每个股票请求之间等待3秒
    • 避免同时请求多个股票导致API限流
  3. 智能跳过检查

    • 根据每个股票的 check_interval 参数判断是否需要更新
    • 显示距离下次检查的剩余时间
  4. 失败重试优化

    • 获取失败时也更新 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 只股票 - 本轮统计

注意事项

  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 - 邮件配置文件