修复盯盘bug

This commit is contained in:
oficcejo
2025-10-09 11:47:54 +08:00
parent db935809bd
commit ad21672786
7 changed files with 840 additions and 23 deletions
+188
View File
@@ -0,0 +1,188 @@
# 实时监测功能优化说明
## 修复日期
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` - 邮件配置文件