From 7379dd1f4becf54f7676fd9d6005af130c96a6a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Thu, 12 Feb 2026 14:21:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=85=8D=E7=BD=AE=E4=BC=98?= =?UTF-8?q?=E5=85=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/config_manager.py | 41 ++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/backend/config_manager.py b/backend/config_manager.py index 6943157..5f8eb27 100644 --- a/backend/config_manager.py +++ b/backend/config_manager.py @@ -48,10 +48,13 @@ import logging logger = logging.getLogger(__name__) # 平台兜底:策略核心使用全局配置表(global_strategy_config),普通用户账号只允许调整“风险旋钮” -# - 风险旋钮:每个账号独立(仓位/频次等) -# - 其它策略参数:统一从全局配置表读取,避免每个用户乱改导致策略不可控 +# 执行策略合并顺序:普通用户(账号)配置优先,未设置时使用全局配置,允许用户简单控制自己的交易并只影响本人执行 +# - 风险旋钮:每个账号独立(仓位/频次等),账号有则用账号,无则用全局 +# - 其它策略参数:账号有则用账号,无则用全局(管理员可在全局配置设默认,用户可覆盖) # 注意:不再依赖account_id=1,全局配置存储在独立的global_strategy_config表中 +_MISSING = object() # 用于区分“账号未设置”与“值为 None/0/False” + RISK_KNOBS_KEYS = { "MIN_MARGIN_USDT", "MIN_POSITION_PERCENT", @@ -729,19 +732,25 @@ class ConfigManager: def eff_get(key: str, default: Any): """ - 策略核心:从全局配置表读取(global_strategy_config)。 - 风险旋钮:从当前账号读取。 + 执行策略合并:账号(用户)配置优先,未设置时使用全局配置,只影响该账号的交易执行。 + - API key/secret/testnet 仅账号,无全局兜底。 + - 其余项:先读账号,有则用;无则用全局,再无则用 default。 """ - # API key/secret/testnet 永远按账号读取(在 get() 内部已处理) - if key in RISK_KNOBS_KEYS: + value_from_account = False + if key in ("BINANCE_API_KEY", "BINANCE_API_SECRET", "USE_TESTNET"): value = self.get(key, default) + value_from_account = True else: - # 从全局配置表读取 - try: - value = global_config_mgr.get(key, default) - except Exception: - value = self.get(key, default) - + account_val = self.get(key, _MISSING) + if account_val is not _MISSING: + value = account_val + value_from_account = True + else: + try: + value = global_config_mgr.get(key, default) + except Exception: + value = default + # ⚠️ 临时兼容性处理:百分比配置值格式转换 # 如果配置值是百分比形式(>1),转换为比例形式(除以100) # 兼容数据库中可能存在的旧数据(百分比形式,如30表示30%) @@ -769,17 +778,13 @@ class ConfigManager: # 静默转换,不输出警告(用户已确认数据库应存储小数形式) if value > 1: value = value / 100.0 - # 静默更新Redis缓存,避免下次读取时再次触发转换 + # 静默更新缓存:值来自账号则写回账号,否则写回全局 try: - if key in RISK_KNOBS_KEYS: - # 风险旋钮:更新当前账号的Redis缓存 + if value_from_account: self._set_to_redis(key, value) - # 同时更新本地缓存 self._cache[key] = value else: - # 全局配置:更新全局配置的Redis缓存 global_config_mgr._set_to_redis(key, value) - # 同时更新本地缓存 global_config_mgr._cache[key] = value except Exception as e: logger.debug(f"更新Redis缓存失败(不影响使用): {key} = {e}")