用户配置优先

This commit is contained in:
薇薇安 2026-02-12 14:21:55 +08:00
parent 42eab75e3e
commit 7379dd1f4b

View File

@ -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}")