# 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 ``` ### 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 ` | 启动单个策略 | `python start.py start -n DualModeTrendlineHawkesStrategy2_FG` | | `stop -n ` | 停止单个策略 | `python start.py stop -n DualModeTrendlineHawkesStrategy2_FG` | | `restart -n ` | 重启单个策略 | `python start.py restart -n DualModeTrendlineHawkesStrategy2_FG` | | `logs -n ` | 查看策略日志 | `python start.py logs -n DualModeTrendlineHawkesStrategy2_FG -t 50` | | `whitelist` | 查看白名单 | `python start.py whitelist` | | `whitelist add -n ` | 添加到白名单 | `python start.py whitelist add -n DualModeTrendlineHawkesStrategy2_FG` | | `whitelist remove -n ` | 从白名单移除 | `python start.py whitelist remove -n DualModeTrendlineHawkesStrategy2_FG` | | `whitelist enable -n ` | 启用白名单策略 | `python start.py whitelist enable -n DualModeTrendlineHawkesStrategy2_FG` | | `whitelist disable -n ` | 禁用白名单策略 | `python start.py whitelist disable -n DualModeTrendlineHawkesStrategy2_FG` | | `whitelist auto-start` | 手动触发自动启动 | `python start.py whitelist auto-start` | ### 7. Web Backend(Web 后端) **文件**:`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 ``` #### 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 /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 -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 ` | `POST /api/strategy/{name}/start` | | 停止单个 | `python start.py stop -n ` | `POST /api/strategy/{name}/stop` | | 重启单个 | `python start.py restart -n ` | `POST /api/strategy/{name}/restart` | | 查看日志 | `python start.py logs -n -t 50` | `GET /api/logs/{name}?lines=50` | | 查看白名单 | `python start.py whitelist list` | `GET /api/whitelist` | | 添加白名单 | `python start.py whitelist add -n ` | `POST /api/whitelist/{name}/add` | | 移除白名单 | `python start.py whitelist remove -n ` | `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 ```