Files
NewQuant/strategy_manager/README.md

1002 lines
29 KiB
Markdown
Raw Normal View History

# 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
```