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

7.2 KiB
Raw Blame History

全局配置独立化迁移说明

📋 概述

将全局策略配置从依赖 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. 创建新表

执行迁移脚本:

mysql -u your_user -p auto_trade_sys < backend/database/add_global_strategy_config.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执行数据库迁移

cd /path/to/auto_trade_sys
mysql -u your_user -p auto_trade_sys < backend/database/add_global_strategy_config.sql

步骤2重启后端服务

# 重启 FastAPI 后端
systemctl restart your-backend-service
# 或
supervisorctl restart backend

步骤3重启交易系统

# 重启所有交易进程,使新配置生效
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. 检查后端日志,查看是否有错误

解决

-- 检查表是否存在
SHOW TABLES LIKE 'global_strategy_config';

-- 检查表中是否有数据
SELECT COUNT(*) FROM global_strategy_config;

问题2管理员无法修改全局配置

检查

  1. 确认用户角色是 admin
  2. 检查 API 返回的错误信息
  3. 检查后端日志

解决

-- 检查用户角色
SELECT id, username, role FROM users WHERE username = 'your_username';

问题3交易系统仍使用旧配置

检查

  1. 确认 Redis 缓存已更新
  2. 确认交易系统已重启
  3. 检查 config_manager.py 是否正确读取全局配置

解决

# 清除 Redis 缓存(可选)
redis-cli DEL global_strategy_config

# 重启交易系统
supervisorctl restart all

验证清单

  • 数据库迁移脚本已执行
  • global_strategy_config 表已创建
  • 配置数据已迁移
  • 后端服务已重启
  • 交易系统已重启
  • 管理员可以查看全局配置
  • 管理员可以修改全局配置
  • 普通用户无法访问全局配置
  • 所有账户使用相同的全局配置
  • Redis 缓存正常工作

📝 总结

全局配置已完全独立化,不再依赖任何账户。所有核心策略参数由管理员统一管理,存储在独立的 global_strategy_config 表中,使用独立的 Redis 缓存键。普通用户只能修改自己账户的风险旋钮,无法影响全局策略。