auto_trade_sys/docs/配置值格式统一方案_简化版.md
薇薇安 9fe028d704 a
2026-01-27 10:36:56 +08:00

6.0 KiB
Raw Permalink Blame History

配置值格式统一方案(简化版)

🎯 统一原则

核心原则:前端和后端使用相同的值(比例形式),只在显示时转换

数据格式

  • 数据库存储比例形式0.30表示30%
  • 前端显示百分比形式30%,用户看到)
  • 前端存储比例形式0.30,直接存储,不做转换)
  • 后端使用比例形式0.30,直接使用,不做转换)

🔧 当前前端逻辑分析

ConfigPanel.jsx

显示逻辑getInitialDisplayValue

// 从数据库读取0.30显示为30%
const percent = numVal <= 1 ? numVal * 100 : numVal
return formatPercent(percent)  // 显示30

存储逻辑handleSave

// 用户输入30转换为0.30存储
if (processedValue < 0 || processedValue > 100) {
    return
}
processedValue = processedValue / 100  // 30 -> 0.30
onUpdate(processedValue)  // 存储0.30

问题

  • 显示逻辑正确0.30 -> 30%
  • 存储逻辑正确30 -> 0.30
  • ⚠️ 但代码中有 numVal <= 1 ? numVal * 100 : numVal 的逻辑如果数据库中有旧数据30会显示为30而不是3000

简化方案

方案:统一为比例形式,前端只做显示转换

原则

  1. 数据库统一存储比例形式0.30表示30%
  2. 前端显示时转换0.30 -> 30%用户看到30%
  3. 前端输入时转换用户输入30 -> 0.30存储)
  4. 后端直接使用0.30,不需要转换)

优势

  • 数据格式统一数据库、前端、后端都是0.30
  • 代码逻辑简单(不需要到处做格式转换)
  • 减少出错(避免格式不一致)

🔧 需要修改的地方

1. 前端显示逻辑(保持不变)

当前逻辑

// 从数据库读取0.30显示为30%
const percent = numVal <= 1 ? numVal * 100 : numVal
return formatPercent(percent)

说明

  • 如果数据库存储0.30显示为30%(正确)
  • ⚠️ 如果数据库存储30旧数据显示为30需要数据迁移

2. 前端存储逻辑(保持不变)

当前逻辑

// 用户输入30转换为0.30存储
if (processedValue < 0 || processedValue > 100) {
    return
}
processedValue = processedValue / 100  // 30 -> 0.30
onUpdate(processedValue)  // 存储0.30

说明

  • 用户输入30转换为0.30存储(正确)
  • 后端验证只接受0-1之间的值正确

3. 后端代码(移除格式转换)

当前代码backend/config_manager.py:735-758

# ⚠️ 关键修复:百分比配置值格式转换
if isinstance(value, (int, float)) and value is not None:
    if key in percent_keys:
        if value > 1:
            value = value / 100.0  # 格式转换

建议

  • 数据迁移完成后,可以移除格式转换逻辑
  • 或者保留作为兼容性处理(标记为临时方案)

4. 数据迁移(必须执行)

目的将数据库中的百分比形式30转换为比例形式0.30

脚本backend/database/migrate_percent_configs_to_ratio.sql

执行后

  • 数据库统一存储比例形式0.30
  • 前端显示为30%(用户看到)
  • 前端存储为0.30(直接存储)
  • 后端使用0.30(直接使用)

📊 数据流

当前流程(有格式转换)

用户输入30
  ↓
前端转换30 -> 0.30
  ↓
存储到数据库0.30
  ↓
后端读取0.30
  ↓
代码中格式转换0.30 -> 0.30(如果>1才转换
  ↓
使用0.30

统一后流程(无格式转换)

用户输入30
  ↓
前端转换30 -> 0.30(仅前端输入时转换)
  ↓
存储到数据库0.30
  ↓
后端读取0.30
  ↓
直接使用0.30(不需要转换)

实施步骤

步骤1执行数据迁移

# 执行SQL迁移脚本
mysql -u username -p database_name < backend/database/migrate_percent_configs_to_ratio.sql

步骤2清除Redis缓存

# 清除Redis缓存让系统重新加载配置
redis-cli DEL "config:trading_config:*"
redis-cli DEL "config:global_strategy_config:*"

步骤3验证数据格式

-- 验证所有百分比配置项应该在0-1之间
SELECT config_key, config_value
FROM trading_config
WHERE config_key IN (
    'TRAILING_STOP_ACTIVATION',
    'TRAILING_STOP_PROTECT',
    'MIN_VOLATILITY',
    'TAKE_PROFIT_PERCENT',
    'STOP_LOSS_PERCENT'
)
AND config_type = 'number'
AND (CAST(config_value AS DECIMAL(10, 4)) < 0 OR CAST(config_value AS DECIMAL(10, 4)) > 1);
-- 应该返回0行

步骤4保留格式转换作为兼容性处理可选

建议:数据迁移完成后,保留格式转换逻辑作为兼容性处理,但标记为临时方案

代码

# ⚠️ 临时兼容性处理:如果数据库中有旧数据(百分比形式),自动转换
# 数据迁移完成后,可以移除此逻辑
if isinstance(value, (int, float)) and value is not None:
    if key in percent_keys:
        if value > 1:
            value = value / 100.0
            logger.warning(f"配置值格式转换(临时兼容): {key} = {value*100:.2f}% (从百分比形式转换为比例形式)")

📝 总结

统一方案

  1. 数据库存储比例形式0.30表示30%
  2. 前端显示百分比形式30%,用户看到)
  3. 前端存储比例形式0.30,直接存储)
  4. 后端使用比例形式0.30,直接使用)

优势

  • 数据格式统一数据库、前端、后端都是0.30
  • 代码逻辑简单:不需要到处做格式转换
  • 减少出错避免格式不一致导致的bug
  • 易于维护:统一的格式,更容易理解和维护

实施建议

  1. 立即执行数据迁移:统一数据格式
  2. 保留格式转换作为兼容性处理:标记为临时方案
  3. 后续可以移除格式转换:数据格式统一后,可以移除