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