auto_trade_sys/GLOBAL_CONFIG_MIGRATION.md
薇薇安 1032295052 a
2026-01-25 09:16:16 +08:00

267 lines
7.2 KiB
Markdown
Raw 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.

# 全局配置独立化迁移说明
## 📋 概述
将全局策略配置从依赖 `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 缓存键。普通用户只能修改自己账户的风险旋钮,无法影响全局策略。