# 全局配置独立化迁移说明

## 📋 概述

将全局策略配置从依赖 `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 缓存键。普通用户只能修改自己账户的风险旋钮，无法影响全局策略。
