Files
NewQuant/strategy_manager/README.md

1002 lines
29 KiB
Markdown
Raw Permalink 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.
# Strategy Manager - 策略管理系统
## 项目概述
Strategy Manager 是一个用于批量管理交易策略的 Python 系统,支持命令行和 Web 界面两种操作方式。该系统通过进程管理的方式实现策略的启动、停止、重启,以及白名单自动启动等核心功能。
### 核心特性
- **多策略管理**:支持同时管理多个交易策略,统一监控运行状态
- **进程隔离**:每个策略运行在独立子进程中,互不影响
- **白名单机制**:支持设置期望自动启动的策略列表
- **定时任务**:内置定时重启和白名单自动启动功能
- **双接口支持**提供命令行CLI和 Web API 两种操作方式
- **日志管理**:自动为每个策略生成专属日志文件
- **状态持久化**:策略状态自动保存到 JSON 文件,重启后可恢复
- **Git 版本追踪**Web 界面实时显示当前 Git 提交版本信息
### 功能概览
| 功能类别 | 具体功能 | 说明 |
|----------|----------|------|
| **策略生命周期管理** | 启动/停止/重启 | 支持单个策略和批量操作 |
| | 进程监控 | 实时检测策略运行状态 |
| | 优雅终止 | 超时后强制kill避免僵尸进程 |
| **白名单系统** | 添加/移除 | 管理自动启动策略列表 |
| | 启用/禁用 | 灵活控制白名单策略状态 |
| | 自动启动 | 每日定时启动白名单策略 |
| **定时任务** | 定时重启 | 每日 08:58 和 20:58 重启所有策略 |
| | 白名单自动启动 | 每日 08:58 执行(仅一次) |
| **状态监控** | 实时状态 | 获取所有策略运行状态 |
| | 日志查看 | 实时查看策略日志 |
| | 版本信息 | 显示 Git 提交版本 |
| **接口方式** | CLI 命令行 | 完整的命令行操作支持 |
| | REST API | FastAPI 构建的 Web 接口 |
| | 前端界面 | Vue.js 构建的可视化界面 |
### 高级特性
#### Git 版本信息集成
Web 后端自动获取并展示当前 Git 仓库的最新提交信息,便于版本追踪和问题排查。
```python
# API 响应示例
{
"timestamp": "2024-01-01T10:00:00",
"total": 5,
"running": 3,
"git_info": "abc1234 - 修复日志重定向问题 (2 hours ago)",
...
}
```
#### 前端静态文件服务
Web 后端集成了 Vue.js 构建的前端应用,提供可视化操作界面:
```python
# 挂载前端静态文件
app.mount("/static", StaticFiles(directory="frontend/dist"), name="static")
@app.get("/")
def serve_frontend():
return FileResponse("frontend/dist/index.html")
```
访问 `http://localhost:8000` 即可使用图形化界面管理策略。
#### 进程守护与优雅关闭
- **守护进程模式**:策略启动时自动脱离终端会话,关闭终端不会影响策略运行
- **优雅终止**:停止策略时先发送 SIGTERM 信号,超时(默认 30 秒)后使用 SIGKILL
- **资源清理**:停止后自动清理 PID 文件和状态记录
```python
# 启动配置
subprocess.Popen(
[sys.executable, "launcher.py", "--config", str(config_file)],
stdout=f,
stderr=subprocess.STDOUT,
stdin=devnull, # 从 /dev/null 读取输入
cwd=Path.cwd()
)
# 停止配置
process.terminate() # SIGTERM
process.wait(timeout=30) # 等待优雅终止
process.kill() # 超时后强制终止
```
#### 状态持久化
策略状态自动保存到 `status.json` 文件,系统重启后可恢复策略状态信息:
```json
{
"timestamp": "2024-01-01T10:00:00",
"total": 5,
"running": 3,
"strategies": {
"StrategyName_Symbol": {
"strategy_name": "策略名称",
"symbol": "交易品种",
"status": "running",
"pid": 12345,
"started_at": "2024-01-01T10:00:00",
"uptime": "00:30:00",
"in_whitelist": true,
"whitelist_enabled": true
}
}
}
```
## 目录结构
```
strategy_manager/
├── config/ # 配置文件目录
│ ├── main.json # 主配置文件
│ └── whitelist.json # 白名单配置
├── core/ # 核心业务模块
│ ├── manager.py # 策略管理器
│ ├── whitelist_manager.py # 白名单管理器
│ └── path_utils.py # 路径工具函数
├── launcher.py # 策略启动器
├── restart_daemon.py # 重启守护进程
├── start.py # CLI 入口
├── web_backend.py # Web 后端服务
├── frontend/ # 前端 Vue.js 应用
│ └── dist/ # 构建后的静态文件
├── strategies/ # 策略配置文件目录
│ └── {策略名}/
│ └── {品种}.py # 策略配置
├── logs/ # 日志目录(运行时生成)
└── pids/ # PID 文件目录(运行时生成)
```
## 核心模块详解
### 1. StrategyManager策略管理器
**文件**`core/manager.py`
`StrategyManager` 是整个系统的核心类,负责策略的加载、状态管理、启动停止等操作。
#### 主要方法
| 方法名 | 功能描述 | 返回值 |
|--------|----------|--------|
| `__init__(config_path)` | 初始化管理器,加载配置和扫描策略 | - |
| `load_strategies()` | 递归扫描 strategies 目录,动态加载所有 .py 配置文件 | - |
| `get_status()` | 获取所有策略的运行状态,包含白名单信息 | `Dict[str, Any]` |
| `start_strategy(name)` | 启动单个策略(守护进程模式) | `bool` |
| `stop_strategy(name, timeout)` | 停止单个策略,支持优雅终止 | `bool` |
| `restart_strategy(name)` | 重启单个策略 | `bool` |
| `start_all()` | 启动所有已启用的策略 | - |
| `stop_all()` | 停止所有运行中的策略 | - |
| `add_to_whitelist(name)` | 添加策略到白名单 | `bool` |
| `remove_from_whitelist(name)` | 从白名单移除策略 | `bool` |
| `set_whitelist_enabled(name, enabled)` | 设置策略在白名单中的启用状态 | `bool` |
| `auto_start_whitelist_strategies()` | 自动启动白名单中所有未运行的策略 | `Dict[str, bool]` |
#### 策略数据结构
每个策略的信息结构如下:
```python
{
"strategy_name": "策略名称",
"symbol": "交易品种",
"config_file": "配置文件路径",
"config": {
"name": "显示名称",
"strategy_class": "策略类路径",
"enabled": True,
"engine_params": {...},
"strategy_params": {...}
},
"status": "running" | "stopped",
"pid": 进程ID,
"started_at": "启动时间戳",
"uptime": "运行时长",
"in_whitelist": True | False,
"whitelist_enabled": True | False
}
```
#### 状态刷新机制
策略管理器采用双重验证机制确保状态准确性:
1. **PID 文件检查**:检查 `pids/{策略名}.pid` 是否存在
2. **进程存在验证**:使用 `psutil.pid_exists()` 验证进程是否存活
3. **进程名验证**:确认进程是否为 Python 进程
4. **资源清理**:进程不存在时自动清理 PID 文件
```python
def _refresh_status(self):
"""刷新进程状态 - 双重验证"""
for name, info in self.strategies.items():
pid_file = self.pid_dir / "{}.pid".format(name)
if pid_file.exists():
try:
with open(pid_file, 'r') as f:
pid = int(f.read().strip())
if psutil.pid_exists(pid):
try:
proc = psutil.Process(pid)
if "python" in proc.name().lower():
info["status"] = "running"
# ... 更新其他状态
continue
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
self._cleanup_stopped_strategy(name, pid_file)
except Exception as e:
self.logger.warning("⚠️ 刷新状态失败 %s: %s", name, e)
```
### 2. WhitelistManager白名单管理器
**文件**`core/whitelist_manager.py`
`WhitelistManager` 负责管理白名单策略列表,实现策略的持久化和自动启动控制。
#### 主要方法
| 方法名 | 功能描述 |
|--------|----------|
| `add(strategy_key, enabled)` | 添加策略到白名单 |
| `remove(strategy_key)` | 从白名单移除策略 |
| `set_enabled(strategy_key, enabled)` | 设置策略的启用状态 |
| `get_all()` | 获取所有白名单策略 |
| `get(strategy_key)` | 获取单个策略的配置 |
| `is_in_whitelist(strategy_key)` | 检查策略是否在白名单中 |
| `is_enabled_in_whitelist(strategy_key)` | 检查策略是否在白名单中且已启用 |
| `should_auto_start_today()` | 检查今天是否应该执行自动启动 |
| `get_auto_start_status()` | 获取自动启动状态信息 |
#### 白名单配置结构
```python
{
"version": "1.0",
"last_auto_start_date": "2024-01-01",
"strategies": {
"StrategyName_Symbol": {
"enabled": True,
"added_at": "2024-01-01T10:00:00",
"added_by": "web"
}
}
}
```
### 3. PathUtils路径工具
**文件**`core/path_utils.py`
提供路径相关的工具函数,处理项目根路径和策略根路径的动态获取。
#### 主要函数
| 函数名 | 功能描述 |
|--------|----------|
| `get_project_root()` | 获取项目根路径strategy_manager 的父目录) |
| `get_strategy_root(config_path)` | 动态获取策略代码根路径 |
| `add_project_root_to_path()` | 将项目根路径添加到 sys.path |
| `add_strategy_root_to_path()` | 将策略根路径添加到 sys.path |
### 4. Launcher策略启动器
**文件**`launcher.py`
`launcher.py` 是策略的实际执行入口,负责通过配置文件启动单个策略。
#### 工作流程
1. 解析命令行参数,获取配置文件路径
2. 动态加载配置文件(.py 文件)
3. 配置策略专属日志logs/{策略名}/{品种}.log
4. 重定向 print 输出到日志文件
5. 动态加载策略类
6. 创建 TqsdkEngine 并执行策略
7. 处理信号实现优雅关闭
#### 使用方式
```bash
python launcher.py --config <config_file>
```
### 5. RestartDaemon重启守护进程
**文件**`restart_daemon.py`
`RestartDaemon` 是一个独立的守护进程,负责定时重启所有运行中的策略。
#### 核心特性
- 定时重启:每日 08:50 和 20:50 自动重启所有策略
- 进程监控:通过 PID 文件管理策略进程
- 优雅停止:先尝试 SIGTERM 终止,超时后使用 SIGKILL
- 自动恢复:重启后自动启动策略
#### 工作流程
1. 每分钟检查一次当前时间
2. 到达重启时间点时,扫描所有 PID 文件
3. 停止所有运行中的策略进程
4. 等待资源释放2秒
5. 根据 PID 文件名推导配置路径
6. 重新启动所有策略
### 6. Start命令行入口
**文件**`start.py`
提供命令行界面CLI操作策略。
#### 支持的命令
| 命令 | 功能 | 示例 |
|------|------|------|
| `status` | 查看所有策略状态 | `python start.py status` |
| `start --all` | 启动所有策略 | `python start.py start --all` |
| `start -n <name>` | 启动单个策略 | `python start.py start -n DualModeTrendlineHawkesStrategy2_FG` |
| `stop -n <name>` | 停止单个策略 | `python start.py stop -n DualModeTrendlineHawkesStrategy2_FG` |
| `restart -n <name>` | 重启单个策略 | `python start.py restart -n DualModeTrendlineHawkesStrategy2_FG` |
| `logs -n <name>` | 查看策略日志 | `python start.py logs -n DualModeTrendlineHawkesStrategy2_FG -t 50` |
| `whitelist` | 查看白名单 | `python start.py whitelist` |
| `whitelist add -n <name>` | 添加到白名单 | `python start.py whitelist add -n DualModeTrendlineHawkesStrategy2_FG` |
| `whitelist remove -n <name>` | 从白名单移除 | `python start.py whitelist remove -n DualModeTrendlineHawkesStrategy2_FG` |
| `whitelist enable -n <name>` | 启用白名单策略 | `python start.py whitelist enable -n DualModeTrendlineHawkesStrategy2_FG` |
| `whitelist disable -n <name>` | 禁用白名单策略 | `python start.py whitelist disable -n DualModeTrendlineHawkesStrategy2_FG` |
| `whitelist auto-start` | 手动触发自动启动 | `python start.py whitelist auto-start` |
### 7. Web BackendWeb 后端)
**文件**`web_backend.py`
基于 FastAPI 构建的 Web 后端服务,提供 RESTful API 接口和可视化前端。
#### 定时任务
| 任务 | 执行时间 | 功能 | 说明 |
|------|----------|------|------|
| scheduled_restart_task | 08:58, 20:58 | 重启所有运行中的策略 | 使用 CronTrigger |
| scheduled_whitelist_auto_start | 08:58 | 自动启动白名单中的策略 | 每天仅执行一次 |
#### API 接口
##### 策略管理接口
| 方法 | 路径 | 功能 | 请求参数 | 响应示例 |
|------|------|------|----------|----------|
| GET | `/api/status` | 获取所有策略状态 | 无 | 详见下方 |
| POST | `/api/strategy/{name}/start` | 启动策略 | name: 策略标识符 | `{"success": true}` |
| POST | `/api/strategy/{name}/stop` | 停止策略 | name: 策略标识符 | `{"success": true}` |
| POST | `/api/strategy/{name}/restart` | 重启策略 | name: 策略标识符 | `{"success": true}` |
| GET | `/api/logs/{name}` | 获取策略日志 | name: 策略标识符, lines: 行数(默认50) | `{"lines": [...]}` |
##### 白名单管理接口
| 方法 | 路径 | 功能 | 请求参数 | 响应示例 |
|------|------|------|----------|----------|
| GET | `/api/whitelist` | 获取白名单列表 | 无 | 详见下方 |
| POST | `/api/whitelist/{name}/add` | 添加策略到白名单 | name: 策略标识符 | `{"success": true, "message": "..."}` |
| POST | `/api/whitelist/{name}/remove` | 从白名单移除策略 | name: 策略标识符 | `{"success": true, "message": "..."}` |
| POST | `/api/whitelist/{name}/enable` | 启用白名单中的策略 | name: 策略标识符 | `{"success": true, "message": "..."}` |
| POST | `/api/whitelist/{name}/disable` | 禁用白名单中的策略 | name: 策略标识符 | `{"success": true, "message": "..."}` |
| POST | `/api/whitelist/auto-start` | 手动触发白名单自动启动 | 无 | 详见下方 |
#### API 响应示例
**GET /api/status 响应:**
```json
{
"timestamp": "2024-01-01T10:00:00",
"total": 5,
"running": 3,
"whitelist_auto_start_today": true,
"whitelist_last_date": "2024-01-01",
"whitelist_total": 2,
"whitelist_enabled": 2,
"git_info": "abc1234 - 修复日志重定向问题 (2 hours ago)",
"strategies": {
"DualModeTrendlineHawkesStrategy2_FG": {
"strategy_name": "DualModeTrendlineHawkesStrategy2",
"symbol": "FG",
"config_file": "strategies/dual_mode_trendline_hawkes/FG.py",
"status": "running",
"pid": 12345,
"started_at": "2024-01-01T09:30:00",
"uptime": "00:30:00",
"in_whitelist": true,
"whitelist_enabled": true,
"config": {...}
}
}
}
```
**GET /api/whitelist 响应:**
```json
{
"whitelist": {
"DualModeTrendlineHawkesStrategy2_FG": {
"enabled": true,
"added_at": "2024-01-01T10:00:00",
"added_by": "web"
}
},
"auto_start_status": {
"should_auto_start": true,
"last_auto_start_date": "2024-01-01",
"whitelist_count": 2,
"enabled_count": 2
}
}
```
**POST /api/whitelist/auto-start 响应:**
```json
{
"success": true,
"results": {
"StrategyName_Symbol": true,
"AnotherStrategy_RB": false
},
"count": 2,
"success_count": 1,
"fail_count": 1
}
```
#### Git 版本信息
Web 后端自动获取 Git 仓库的最新提交信息,返回格式:
```
{git_commit_hash} - {commit_message} ({relative_time})
```
示例:`abc1234 - 修复日志重定向问题 (2 hours ago)`
此功能便于在 Web 界面快速确认当前部署的代码版本。
#### 前端集成
Web 后端集成了 Vue.js 构建的前端应用:
```python
# 静态文件挂载
app.mount("/static", StaticFiles(directory="frontend/dist"), name="static")
# SPA 路由支持
@app.get("/")
def serve_frontend():
return FileResponse("frontend/dist/index.html")
```
访问 http://localhost:8000 可使用可视化界面,包括:
- 策略状态总览
- 一键启动/停止/重启
- 日志实时查看
- 白名单管理
- Git 版本信息显示
## 依赖说明
### Python 依赖
```
fastapi>=0.100.0
uvicorn>=0.22.0
apscheduler>=3.10.0
psutil>=5.9.0
```
### 依赖说明
| 依赖包 | 用途 |
|--------|------|
| fastapi | Web 后端框架,提供 RESTful API |
| uvicorn | ASGI 服务器,用于运行 FastAPI 应用 |
| apscheduler | 定时任务调度器,支持 CronTrigger |
| psutil | 进程监控获取进程状态和PID信息 |
### 安装依赖
```bash
pip install -r requirements.txt
```
## 故障排查
### 常见问题
#### 1. 策略启动失败
**症状**:调用 `/api/strategy/{name}/start` 返回失败
**排查步骤**
1. 检查策略配置文件是否存在:`strategies/{策略名}/{品种}.py`
2. 查看管理器日志:`logs/manager.log`
3. 检查策略专属日志:`logs/{策略名}/{品种}.log`
4. 确认配置文件包含正确的 `CONFIG` 变量
**常见原因**
- 策略配置文件路径错误
- CONFIG 变量定义不正确
- 策略类路径不存在
- 端口被占用(如果是网络相关错误)
#### 2. 策略状态不正确
**症状**:策略显示已停止但实际在运行,或相反
**排查步骤**
1. 检查 PID 文件:`pids/{策略名}.pid`
2. 验证进程是否存在:`ps aux | grep python`
3. 查看状态刷新日志
**解决方案**
```bash
# 查看进程
ps aux | grep python
# 查看 PID 文件
cat pids/StrategyName_Symbol.pid
# 手动清理僵尸进程
kill -9 <pid>
```
#### 3. 白名单自动启动未执行
**症状**:每日 08:58 白名单策略未自动启动
**排查步骤**
1. 检查 Web 服务是否运行
2. 查看调度器日志
3. 确认白名单配置:`config/whitelist.json`
4. 检查今日是否已执行
**解决方案**
```bash
# 手动触发自动启动
python start.py whitelist auto-start
# 检查白名单状态
python start.py whitelist list
```
#### 4. 端口被占用
**症状**`Web 服务启动失败,端口 8000 已被占用`
**解决方案**
```bash
# 查看占用端口的进程
netstat -ano | findstr :8000
# 终止占用进程
taskkill /PID <pid> /F
# 或使用其他端口启动
uvicorn web_backend:app --host 0.0.0.0 --port 8001
```
#### 5. 日志文件不生成
**症状**:策略日志文件未创建
**排查步骤**
1. 检查日志目录权限
2. 确认 logs 目录存在
3. 查看 launch.py 日志配置
**解决方案**
```bash
# 手动创建日志目录
mkdir -p logs
# 检查目录权限
ls -la logs/
```
### 日志级别配置
默认日志级别为 INFO可通过环境变量调整
```bash
# 设置调试日志
export LOG_LEVEL=DEBUG
# Windows
set LOG_LEVEL=DEBUG
```
### 性能监控
#### 查看系统资源
```bash
# CPU 和内存使用
top
# 进程详细信息
ps -p <pid> -o %cpu,%mem,etime
```
#### 策略进程监控
```bash
# 查看所有策略进程
ps aux | grep launcher.py
# 查看特定策略
ps aux | grep FG2305
```
## 最佳实践
### 1. 策略配置
- 为每个策略创建独立的配置文件
- 使用有意义的策略名称
- 合理设置 `enabled` 状态
### 2. 白名单管理
- 仅将需要长期运行的策略加入白名单
- 定期检查白名单策略状态
- 禁用不再使用的策略而非直接移除
### 3. 定时任务
- 定时重启时间建议设置在交易时段外
- 白名单自动启动建议在开市前执行
- 监控重启任务的执行日志
### 4. 日志管理
- 定期清理过期日志文件
- 使用日志聚合工具(如 ELK进行集中管理
- 设置合适的日志级别减少磁盘占用
### 5. 进程监控
- 定期检查策略运行状态
- 设置告警机制(如进程异常停止时发送通知)
- 监控服务器资源使用情况
## 配置文件
### 主配置文件config/main.json
主配置文件位于 `config/main.json`,控制策略管理器的核心行为:
```json
{
"strategy_root": "AUTO_DETECT",
"logs_dir": "logs",
"status_file": "status.json",
"pid_dir": "pids"
}
```
| 配置项 | 说明 | 默认值 | 允许值 |
|--------|------|--------|--------|
| strategy_root | 策略代码根路径 | AUTO_DETECT | 目录路径或 "AUTO_DETECT" |
| logs_dir | 日志目录 | logs | 目录路径 |
| status_file | 状态文件 | status.json | 文件路径 |
| pid_dir | PID 文件目录 | pids | 目录路径 |
#### strategy_root 说明
- **AUTO_DETECT**(推荐):自动检测策略根目录,扫描 `strategies/` 目录下的所有 `.py` 文件
- **自定义路径**:指定具体的策略目录路径,例如 `"D:/trading_strategies"`
### 白名单配置config/whitelist.json
白名单配置位于 `config/whitelist.json`,管理自动启动的策略列表:
```json
{
"version": "1.0",
"last_auto_start_date": null,
"strategies": {
"StrategyName_Symbol": {
"enabled": true,
"added_at": "2024-01-01T10:00:00",
"added_by": "web"
}
}
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| version | string | 配置版本号 |
| last_auto_start_date | string \| null | 上次自动启动日期ISO 格式 |
| strategies | object | 策略配置字典 |
| strategies.{key}.enabled | boolean | 是否启用自动启动 |
| strategies.{key}.added_at | string | 添加时间 |
| strategies.{key}.added_by | string | 添加方式web/cli |
### 策略配置文件strategies/{策略名}/{品种}.py
策略配置文件定义单个策略的运行参数,位于 `strategies/{策略名}/{品种}.py`
```python
from src.strategies.dual_mode_trendline_hawkes import DualModeTrendlineHawkesStrategy2
CONFIG = {
"name": "双模趋势线霍克斯策略2",
"strategy_class": "strategies.dual_mode_trendline_hawkes.DualModeTrendlineHawkesStrategy2",
"enabled": True,
"engine_params": {
"symbol": "FG2305",
"duration_seconds": 0.5,
"roll_over_mode": "daily",
"history_length": 120,
"close_bar_delta": 1
},
"strategy_params": {
# 策略参数...
}
}
```
#### 策略配置字段说明
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | 是 | 策略显示名称 |
| strategy_class | string | 是 | 策略类路径import 路径) |
| enabled | boolean | 是 | 是否启用该策略 |
| engine_params | object | 是 | 引擎参数 |
| engine_params.symbol | string | 是 | 交易品种代码 |
| engine_params.duration_seconds | number | 是 | K线周期 |
| engine_params.roll_over_mode | string | 否 | 展期模式 |
| engine_params.history_length | number | 否 | 历史K线数量 |
| engine_params.close_bar_delta | number | 否 | 收盘K线增量 |
| strategy_params | object | 是 | 策略具体参数 |
## 使用指南
### 快速开始
1. **启动 Web 服务**(推荐)
```bash
cd strategy_manager
python start.py
```
Web 服务将在 `http://localhost:8000` 启动。
2. **使用命令行管理策略**
```bash
# 查看所有策略状态
python start.py status
# 启动所有策略
python start.py start --all
# 启动单个策略
python start.py start -n StrategyName_Symbol
# 停止单个策略
python start.py stop -n StrategyName_Symbol
```
3. **启动重启守护进程**
```bash
python restart_daemon.py
```
### 白名单管理
1. **添加策略到白名单**
```bash
python start.py whitelist add -n StrategyName_Symbol
```
2. **启用/禁用白名单中的策略**
```bash
# 启用
python start.py whitelist enable -n StrategyName_Symbol
# 禁用
python start.py whitelist disable -n StrategyName_Symbol
```
3. **手动触发自动启动**
```bash
python start.py whitelist auto-start
```
### 查看日志
```bash
# 查看最近50行日志
python start.py logs -n StrategyName_Symbol -t 50
```
## 架构设计
### 进程模型
```
┌─────────────────────────────────────────────────────────┐
│ Strategy Manager │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Strategy1 │ │ Strategy2 │ │ StrategyN │ │
│ │ (subprocess)│ │ (subprocess)│ │ (subprocess)│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
```
### 数据流向
```
配置文件 (.py)
┌──────────────────┐
│ StrategyManager │◄──── WhitelistManager
│ load_strategies()│
└────────┬─────────┘
┌──────────────────┐
│ 状态管理 │──► status.json
│ (psutil) │
└────────┬─────────┘
┌──────────────────┐
│ 子进程管理 │──► launcher.py
│ (subprocess) │──► pids/*.pid
└──────────────────┘
```
### 模块依赖关系
```
start.py
├──► core/manager.py
│ │
│ ├──► core/whitelist_manager.py
│ └──► core/path_utils.py
├──► web_backend.py
│ │
│ └──► core/manager.py
└──► launcher.py
└──► core/path_utils.py
restart_daemon.py
└──► launcher.py
```
## 日志系统
### 日志目录结构
```
logs/
├── manager.log # 策略管理器日志
├── restart_daemon.log # 重启守护进程日志
└── {策略名}/
└── {品种}.log # 策略专属日志
```
### 日志格式
```
2024-01-01 10:00:00,000 [INFO] [策略名称] 正在启动...
2024-01-01 10:00:00,001 [INFO] 日志文件: logs/StrategyName/Symbol.log
```
## 注意事项
1. **进程独立性**:每个策略运行在独立子进程中,关闭终端不会影响策略运行
2. **白名单限制**自动启动每天只执行一次08:58
3. **定时重启**:每日 08:50 和 20:50 自动重启所有策略(由 restart_daemon.py 执行)
4. **配置路径**:策略配置文件需放在 `strategies/{策略名}/{品种}.py`
5. **日志重定向**:策略内的 print 语句会自动写入日志文件
## 扩展开发
### 添加新的策略
1.`strategies/` 目录下创建策略目录
2. 编写策略配置文件 `{品种}.py`
3. 定义 `CONFIG` 变量
4. 策略将自动被加载
### 添加新的 API 接口
`web_backend.py` 中添加新的路由:
```python
@app.get("/api/new-endpoint")
def new_endpoint():
# 实现逻辑
return {"result": "data"}
```
### 自定义定时任务
`web_backend.py``lifespan` 函数中添加:
```python
scheduler.add_job(
your_task_function,
CronTrigger(hour=XX, minute=XX),
id="your_task_id",
replace_existing=True
)
```
## 快速参考
### 常用命令速查
| 操作 | CLI 命令 | API 调用 |
|------|----------|----------|
| 查看状态 | `python start.py status` | `GET /api/status` |
| 启动所有 | `python start.py start --all` | - |
| 启动单个 | `python start.py start -n <name>` | `POST /api/strategy/{name}/start` |
| 停止单个 | `python start.py stop -n <name>` | `POST /api/strategy/{name}/stop` |
| 重启单个 | `python start.py restart -n <name>` | `POST /api/strategy/{name}/restart` |
| 查看日志 | `python start.py logs -n <name> -t 50` | `GET /api/logs/{name}?lines=50` |
| 查看白名单 | `python start.py whitelist list` | `GET /api/whitelist` |
| 添加白名单 | `python start.py whitelist add -n <name>` | `POST /api/whitelist/{name}/add` |
| 移除白名单 | `python start.py whitelist remove -n <name>` | `POST /api/whitelist/{name}/remove` |
| 手动触发启动 | `python start.py whitelist auto-start` | `POST /api/whitelist/auto-start` |
### 定时任务时间表
| 任务 | 执行时间 | 说明 |
|------|----------|------|
| 白名单自动启动 | 每日 08:58 | 仅执行一次 |
| 策略定时重启 | 每日 08:58, 20:58 | 重启所有运行中的策略 |
### 文件路径速查
| 用途 | 路径 |
|------|------|
| 主配置 | `config/main.json` |
| 白名单配置 | `config/whitelist.json` |
| 管理器日志 | `logs/manager.log` |
| 策略日志 | `logs/{策略名}/{品种}.log` |
| PID 文件 | `pids/{策略名}.pid` |
| 状态文件 | `status.json` |
| 策略配置 | `strategies/{策略名}/{品种}.py` |
### 端口与服务
| 服务 | 地址 | 说明 |
|------|------|------|
| Web 服务 | http://localhost:8000 | FastAPI 后端 + Vue.js 前端 |
| API 基础路径 | /api | RESTful API 根路径 |
| 静态资源 | /static | 前端静态资源 |
### 策略标识符格式
策略标识符由策略名和品种组合而成,格式为:`{策略名}_{品种}`
示例:`DualModeTrendlineHawkesStrategy2_FG`
获取策略标识符:
```bash
# 通过 CLI 查看
python start.py status
# 通过 API 获取
curl http://localhost:8000/api/status
```