# 全局配置独立化迁移说明 ## 📋 概述 将全局策略配置从依赖 `account_id=1` 改为独立的配置系统,使用独立的 `global_strategy_config` 表和 Redis 缓存。 ## 🎯 目标 1. ✅ 全局配置不再依赖任何账户(account_id) 2. ✅ 独立的数据库表 `global_strategy_config` 3. ✅ 独立的 Redis 缓存键 `global_strategy_config` 4. ✅ 只有管理员可以查看和修改全局配置 5. ✅ 所有账户自动使用全局配置(通过 `config_manager.py` 读取) --- ## 📦 数据库变更 ### 1. 创建新表 执行迁移脚本: ```bash mysql -u your_user -p auto_trade_sys < backend/database/add_global_strategy_config.sql ``` **新表结构**: ```sql CREATE TABLE `global_strategy_config` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `config_key` VARCHAR(100) NOT NULL, `config_value` TEXT NOT NULL, `config_type` VARCHAR(50) NOT NULL, `category` VARCHAR(50) NOT NULL, `description` TEXT, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `updated_by` VARCHAR(50), UNIQUE KEY `uk_config_key` (`config_key`) ) ``` ### 2. 数据迁移 迁移脚本会自动将 `account_id=1` 的核心策略配置迁移到 `global_strategy_config` 表。 **迁移规则**: - 只迁移非风险旋钮的配置 - 风险旋钮(`MIN_MARGIN_USDT`, `MAX_POSITION_PERCENT` 等)不迁移 - API密钥(`BINANCE_API_KEY`, `BINANCE_API_SECRET`)不迁移 --- ## 🔧 代码变更 ### 1. 数据库模型 (`backend/database/models.py`) **新增**:`GlobalStrategyConfig` 类 - `get_all()` - 获取所有全局配置 - `get(key)` - 获取单个配置 - `set(key, value, ...)` - 设置配置 - `get_value(key, default)` - 获取配置值(自动转换类型) - `delete(key)` - 删除配置 ### 2. 配置管理器 (`backend/config_manager.py`) **新增**:`GlobalStrategyConfigManager` 类 - 独立的 Redis 缓存键:`global_strategy_config` - 独立的数据库表:`global_strategy_config` - 单例模式,确保全局唯一 **修改**:`ConfigManager.get_trading_config()` - 从 `GlobalStrategyConfigManager` 读取全局配置 - 不再依赖 `account_id=1` - 风险旋钮仍从当前账户读取 ### 3. API 路由 (`backend/api/routes/config.py`) **新增端点**: - `GET /api/config/global` - 获取全局配置(仅管理员) - `PUT /api/config/global/{key}` - 更新单个全局配置(仅管理员) - `POST /api/config/global/batch` - 批量更新全局配置(仅管理员) **修改端点**: - `GET /api/config/meta` - 移除 `global_strategy_account_id` 字段 **权限控制**: - 所有全局配置端点都检查管理员权限 - 非管理员访问返回 403 错误 ### 4. 前端 API 服务 (`frontend/src/services/api.js`) **修改**: - `getGlobalConfigs()` - 不再需要 `globalAccountId` 参数 - `updateGlobalConfigsBatch()` - 不再需要 `globalAccountId` 参数 ### 5. 前端组件 (`frontend/src/components/GlobalConfig.jsx`) **移除**: - 所有对 `configMeta.global_strategy_account_id` 的引用 - 所有对 `globalAccountId` 的计算和使用 **简化**: - `loadConfigs()` - 直接调用 `api.getGlobalConfigs()`,无需 account_id - `handleApplyPreset()` - 直接调用 `api.updateGlobalConfigsBatch()`,无需 account_id - `buildConfigSnapshot()` - 直接调用 `api.getGlobalConfigs()`,无需 account_id --- ## 🔄 迁移步骤 ### 步骤1:执行数据库迁移 ```bash cd /path/to/auto_trade_sys mysql -u your_user -p auto_trade_sys < backend/database/add_global_strategy_config.sql ``` ### 步骤2:重启后端服务 ```bash # 重启 FastAPI 后端 systemctl restart your-backend-service # 或 supervisorctl restart backend ``` ### 步骤3:重启交易系统 ```bash # 重启所有交易进程,使新配置生效 supervisorctl restart all ``` ### 步骤4:验证 1. **管理员登录**,进入"全局配置"页面 2. **检查配置项**:应该能看到所有核心策略配置 3. **修改配置**:尝试修改一个配置项,确认保存成功 4. **检查数据库**:确认 `global_strategy_config` 表中有数据 5. **检查 Redis**:确认 `global_strategy_config` 键中有缓存 --- ## ⚠️ 注意事项 ### 1. 向后兼容 - 如果 `global_strategy_config` 表不存在,系统会回退到从 `account_id=1` 读取(兼容旧系统) - 迁移脚本会自动迁移现有配置,不会丢失数据 ### 2. Redis 缓存 - 全局配置使用独立的 Redis 键:`global_strategy_config` - 账户配置仍使用:`trading_config:{account_id}` - 修改全局配置后,会自动更新 Redis 缓存 ### 3. 权限控制 - **管理员**:可以查看和修改全局配置 - **普通用户**:无法访问全局配置 API(返回 403) - 普通用户只能修改自己账户的风险旋钮 ### 4. 配置读取优先级 1. **风险旋钮**:从当前账户的 `trading_config` 表读取 2. **核心策略参数**:从 `global_strategy_config` 表读取 3. **API密钥**:从 `accounts` 表读取(每个账户独立) --- ## 📊 配置分类 ### 全局配置(管理员专用) - `ATR_STOP_LOSS_MULTIPLIER` - `ATR_TAKE_PROFIT_MULTIPLIER` - `RISK_REWARD_RATIO` - `USE_FIXED_RISK_SIZING` - `FIXED_RISK_PERCENT` - `USE_DYNAMIC_ATR_MULTIPLIER` - `MIN_SIGNAL_STRENGTH` - `SCAN_INTERVAL` - `TOP_N_SYMBOLS` - ... 等等所有非风险旋钮的配置 ### 账户配置(每个账户独立) - `MIN_MARGIN_USDT` - `MIN_POSITION_PERCENT` - `MAX_POSITION_PERCENT` - `MAX_TOTAL_POSITION_PERCENT` - `AUTO_TRADE_ENABLED` - `MAX_OPEN_POSITIONS` - `MAX_DAILY_ENTRIES` ### 账号私有配置(每个账户独立) - `BINANCE_API_KEY` - `BINANCE_API_SECRET` - `USE_TESTNET` --- ## 🐛 故障排查 ### 问题1:全局配置无法加载 **检查**: 1. 确认 `global_strategy_config` 表已创建 2. 确认表中有数据(执行迁移脚本) 3. 检查后端日志,查看是否有错误 **解决**: ```sql -- 检查表是否存在 SHOW TABLES LIKE 'global_strategy_config'; -- 检查表中是否有数据 SELECT COUNT(*) FROM global_strategy_config; ``` ### 问题2:管理员无法修改全局配置 **检查**: 1. 确认用户角色是 `admin` 2. 检查 API 返回的错误信息 3. 检查后端日志 **解决**: ```sql -- 检查用户角色 SELECT id, username, role FROM users WHERE username = 'your_username'; ``` ### 问题3:交易系统仍使用旧配置 **检查**: 1. 确认 Redis 缓存已更新 2. 确认交易系统已重启 3. 检查 `config_manager.py` 是否正确读取全局配置 **解决**: ```bash # 清除 Redis 缓存(可选) redis-cli DEL global_strategy_config # 重启交易系统 supervisorctl restart all ``` --- ## ✅ 验证清单 - [ ] 数据库迁移脚本已执行 - [ ] `global_strategy_config` 表已创建 - [ ] 配置数据已迁移 - [ ] 后端服务已重启 - [ ] 交易系统已重启 - [ ] 管理员可以查看全局配置 - [ ] 管理员可以修改全局配置 - [ ] 普通用户无法访问全局配置 - [ ] 所有账户使用相同的全局配置 - [ ] Redis 缓存正常工作 --- ## 📝 总结 全局配置已完全独立化,不再依赖任何账户。所有核心策略参数由管理员统一管理,存储在独立的 `global_strategy_config` 表中,使用独立的 Redis 缓存键。普通用户只能修改自己账户的风险旋钮,无法影响全局策略。