# 低价擒牛策略监控功能实现总结

## 实现日期
2024-12-12

## 功能概述
为"低价擒牛"选股板块添加策略监控功能，实现自动监控持仓股票并在满足卖出条件时发送提醒。

## 核心功能

### 1. 策略监控
- ✅ 加入监控：在选出的股票列表中点击"加入策略监控"按钮
- ✅ 自动扫描：每分钟扫描1次（可配置）
- ✅ 持股天数监控：持股满5天第6天开盘提醒卖出
- ✅ 均线监控：MA5下穿MA20提醒卖出
- ✅ 自动移除：提醒卖出后自动移出监控列表

### 2. 数据源集成
- ✅ TDX数据源：读取股票K线数据
- ✅ 均线计算：自动计算MA5和MA20
- ✅ 实时价格：获取最新股票价格

### 3. 通知系统
- ✅ 钉钉通知：自动发送卖出提醒到钉钉群
- ✅ 面板提醒：在监控面板显示待处理提醒
- ✅ 历史记录：保存所有提醒记录

## 新增文件

### 核心模块（3个Python文件）

1. **low_price_bull_monitor.py** (363行)
   - 监控数据库管理
   - 股票添加/移除
   - 提醒生成和管理
   - 持有天数更新

2. **low_price_bull_service.py** (310行)
   - 后台监控服务
   - 定时扫描循环
   - TDX数据获取
   - MA均线检测
   - 钉钉通知发送

3. **low_price_bull_monitor_ui.py** (273行)
   - 监控面板UI
   - 服务控制（启动/停止）
   - 监控列表展示
   - 卖出提醒展示
   - 历史记录查询

### 文档（2个Markdown文件）

1. **低价擒牛策略监控配置说明.md**
   - 环境变量配置
   - TDX数据源配置
   - 使用流程说明
   - 常见问题解答

2. **低价擒牛策略监控功能实现总结.md**
   - 功能概述
   - 技术实现
   - 使用说明

## 修改文件

### low_price_bull_ui.py
- ✅ 添加导入语句
- ✅ 添加"策略监控"按钮（右上角）
- ✅ 在股票详情中添加"加入策略监控"按钮
- ✅ 集成监控面板切换
- ✅ 更新策略说明

## 数据库设计

### 表1: monitored_stocks（监控列表）
```sql
CREATE TABLE monitored_stocks (
    id INTEGER PRIMARY KEY,
    stock_code TEXT NOT NULL,        -- 股票代码
    stock_name TEXT NOT NULL,        -- 股票名称
    buy_price REAL NOT NULL,         -- 买入价格
    buy_date TEXT NOT NULL,          -- 买入日期
    holding_days INTEGER DEFAULT 0,  -- 持有天数
    status TEXT DEFAULT 'holding',   -- 状态（holding/removed）
    add_time TEXT NOT NULL,          -- 加入时间
    remove_time TEXT,                -- 移除时间
    remove_reason TEXT,              -- 移除原因
    UNIQUE(stock_code, status)
)
```

### 表2: sell_alerts（卖出提醒）
```sql
CREATE TABLE sell_alerts (
    id INTEGER PRIMARY KEY,
    stock_code TEXT NOT NULL,      -- 股票代码
    stock_name TEXT NOT NULL,      -- 股票名称
    alert_type TEXT NOT NULL,      -- 提醒类型（holding_days/ma_cross）
    alert_reason TEXT NOT NULL,    -- 提醒原因
    current_price REAL,            -- 当前价格
    ma5 REAL,                      -- MA5值
    ma20 REAL,                     -- MA20值
    holding_days INTEGER,          -- 持有天数
    alert_time TEXT NOT NULL,      -- 提醒时间
    is_sent INTEGER DEFAULT 0      -- 是否已发送
)
```

## 技术实现

### 1. 监控服务架构
```
┌─────────────────────────────────────┐
│  LowPriceBullService                │
│  （后台监控服务）                     │
└──────────────┬──────────────────────┘
               │
        ┌──────▼──────┐
        │  监控循环    │
        │  (每60秒)    │
        └──────┬──────┘
               │
    ┌──────────▼─────────────┐
    │  扫描监控列表            │
    │  - 更新持有天数          │
    │  - 检查卖出条件          │
    └──────────┬──────────────┘
               │
    ┌──────────▼────────────────┐
    │  检测卖出信号               │
    │  1. 持股天数≥5             │
    │  2. MA5 < MA20            │
    └──────────┬─────────────────┘
               │
    ┌──────────▼──────────────┐
    │  生成卖出提醒             │
    │  - 保存到数据库           │
    │  - 发送钉钉通知           │
    │  - 自动移除股票           │
    └───────────────────────────┘
```

### 2. TDX数据获取流程
```python
def _get_stock_data(stock_code):
    # 1. 获取K线数据（30天）
    df = get_stock_kline_data(stock_code, period='daily', count=30)
    
    # 2. 计算均线
    df['MA5'] = df['close'].rolling(window=5).mean()
    df['MA20'] = df['close'].rolling(window=20).mean()
    
    # 3. 返回最新数据
    latest = df.iloc[-1]
    return latest['close'], latest['MA5'], latest['MA20']
```

### 3. 卖出信号检测
```python
def _check_stock(stock):
    # 检查1: 持股天数
    if holding_days >= 5:
        add_sell_alert(type='holding_days')
        return
    
    # 检查2: MA5下穿MA20
    current_price, ma5, ma20 = _get_stock_data(stock_code)
    if ma5 < ma20:
        add_sell_alert(type='ma_cross')
```

## 环境变量配置

### 新增配置项
```bash
# 低价擒牛策略监控
LOW_PRICE_BULL_SCAN_INTERVAL=60    # 扫描间隔（秒）
LOW_PRICE_BULL_HOLDING_DAYS=5      # 持股天数限制
```

### 依赖的配置
```bash
# Webhook通知（建议配置）
WEBHOOK_ENABLED=true
WEBHOOK_URL=https://oapi.dingtalk.com/robot/send?access_token=xxxxx
WEBHOOK_TYPE=dingtalk
WEBHOOK_KEYWORD=aiagents通知
```

## 使用流程

### 1. 启动流程
```
1. 低价擒牛选股
   ↓
2. 查看股票列表
   ↓
3. 点击"➕ 加入策略监控"
   ↓
4. 点击右上角"📊 策略监控"
   ↓
5. 点击"▶️ 启动监控服务"
   ↓
6. 监控服务开始运行
```

### 2. 监控流程
```
监控服务 → 每60秒扫描 → 检测条件 → 生成提醒 → 发送通知 → 自动移除
```

### 3. 提醒流程
```
满足卖出条件
   ↓
生成卖出提醒
   ↓
┌─────────┴─────────┐
│                   │
发送钉钉通知      显示在面板
│                   │
└─────────┬─────────┘
          ↓
   自动移出监控列表
          ↓
     记录到历史
```

## 功能特点

### 1. 自动化监控
- ✅ 无需人工盯盘
- ✅ 定时自动扫描
- ✅ 智能卖出提醒

### 2. 双重条件
- ✅ 时间条件：持股5天
- ✅ 技术条件：MA5下穿MA20
- ✅ 满足任一即提醒

### 3. 灵活配置
- ✅ 可调整扫描间隔
- ✅ 可调整持股天数
- ✅ 可启动/停止服务

### 4. 完整记录
- ✅ 监控历史
- ✅ 提醒记录
- ✅ 操作日志

## 监控面板功能

### 📋 监控列表
- 显示所有监控中的股票
- 实时更新持有天数
- 支持批量移除
- 显示买入价格和日期

### 🔔 卖出提醒
- 显示待处理提醒
- 查看MA5/MA20数据
- 操作选项：
  - ✅ 已处理（移除股票）
  - ❌ 忽略（保留股票）

### 📜 历史记录
- 查看历史提醒
- 筛选已发送/未发送
- 清理旧记录

### ⚙️ 服务控制
- ▶️ 启动服务
- ⏸️ 停止服务
- 配置扫描间隔
- 查看服务状态

## 钉钉通知格式

```markdown
### aiagents通知 - 低价擒牛卖出提醒

**股票代码**: 002259

**股票名称**: 升达林业

**提醒类型**: MA均线死叉

**提醒原因**: MA5下穿MA20，技术信号卖出

**当前价格**: 8.52元

**MA5**: 8.45

**MA20**: 8.67

**持有天数**: 3天

**提醒时间**: 2024-12-12 14:30:00

---

**建议**: 开盘时卖出该股票

_此消息由AI股票分析系统自动发送_
```

## 注意事项

### 1. 服务运行
- ⚠️ 监控服务需要手动启动
- ⚠️ 关闭浏览器后服务停止
- ⚠️ 建议在服务器上运行

### 2. 数据源
- ⚠️ 需要配置TDX数据源
- ⚠️ 建议使用pytdx（无需配置）
- ⚠️ K线数据可能有延迟

### 3. 扫描频率
- ⚠️ 默认60秒扫描1次
- ⚠️ 不建议低于30秒
- ⚠️ 避免API限流

### 4. 持股天数
- ⚠️ 按自然日计算
- ⚠️ 不区分交易日
- ⚠️ 建议预留余地

## 后续优化方向

### 短期
- [ ] 支持后台常驻服务
- [ ] 增加更多技术指标
- [ ] 支持自定义卖出条件

### 中期
- [ ] 集成MiniQMT自动交易
- [ ] 支持止损止盈设置
- [ ] 增加回测功能

### 长期
- [ ] AI智能卖出建议
- [ ] 多策略组合监控
- [ ] 移动端APP推送

## 总结

本次实现为"低价擒牛"选股板块添加了完整的策略监控功能，包括：

- ✅ **3个核心模块**：监控管理、后台服务、UI界面
- ✅ **完整的数据库设计**：监控列表、提醒记录
- ✅ **自动化监控**：定时扫描、智能提醒、自动移除
- ✅ **双重卖出条件**：持股天数 + MA均线
- ✅ **钉钉通知集成**：实时接收卖出提醒
- ✅ **灵活的配置**：可调整扫描间隔和持股天数
- ✅ **完善的文档**：配置说明、使用指南

整个功能已集成到系统中，用户可以立即使用！

---

**实现完成时间**：2024-12-12  
**版本**：v1.0  
**状态**：✅ 已完成并可使用
