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

189 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实时监测功能优化说明
## 修复日期
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` - 邮件配置文件