diff --git a/lib/env/env_schema.py b/lib/env/env_schema.py index bc817d5..8ce3bfc 100644 --- a/lib/env/env_schema.py +++ b/lib/env/env_schema.py @@ -70,7 +70,10 @@ HOT_RELOAD_EXACT = frozenset({ "MONITOR_POLL_SECONDS", "AUTO_TRANSFER_ENABLED", "AUTO_TRANSFER_AMOUNT", + "AUTO_TRANSFER_FROM", + "AUTO_TRANSFER_TO", "AUTO_TRANSFER_BJ_HOUR", + "TRANSFER_CCY", "FORCE_CLOSE_ENABLED", "FORCE_CLOSE_BJ_HOUR", "BTC_LEVERAGE", @@ -126,6 +129,17 @@ SELECT_OPTIONS: dict[str, tuple[tuple[str, str], ...]] = { ("long_only", "仅做多"), ("short_only", "仅做空"), ), + "AUTO_TRANSFER_FROM": ( + ("funding", "funding 资金账户"), + ("swap", "swap 交易账户"), + ("spot", "spot 现货"), + ), + "AUTO_TRANSFER_TO": ( + ("swap", "swap 交易账户"), + ("funding", "funding 资金账户"), + ("spot", "spot 现货"), + ), + "TRANSFER_CCY": (("USDT", "USDT"),), "HEDGE_PLAN_OO_BIAS_SPLIT_BY": ( ("budget", "预算金额"), ("sheets", "张数"), @@ -136,6 +150,7 @@ _SELECT_ALIASES: dict[str, dict[str, str]] = { "OKX_TD_MODE": {"cross_margin": "cross", "isolated_margin": "isolated"}, "BINANCE_MARGIN_MODE": {"cross_margin": "cross", "isolated_margin": "isolated"}, "GATE_TD_MODE": {"cross_margin": "cross", "isolated_margin": "isolated"}, + "TRANSFER_CCY": {"usdt": "USDT"}, } @@ -159,10 +174,13 @@ def normalize_select_value(key: str, value: Optional[str]) -> str: if low in aliases: return aliases[low] allowed = {v for v, _ in (SELECT_OPTIONS.get(key) or ())} + allowed_by_lower = {v.lower(): v for v in allowed} if low in allowed: return low if raw in allowed: return raw + if low in allowed_by_lower: + return allowed_by_lower[low] return raw diff --git a/lib/env/env_ui_manifest.py b/lib/env/env_ui_manifest.py index dc70170..4d001de 100644 --- a/lib/env/env_ui_manifest.py +++ b/lib/env/env_ui_manifest.py @@ -103,10 +103,10 @@ _SHARED_SECTIONS: list[dict[str, Any]] = [ "fields": [ ("AUTO_TRANSFER_ENABLED", "启用自动划转", ""), ("AUTO_TRANSFER_AMOUNT", "目标余额(U)", "交易账户目标 USDT"), - ("AUTO_TRANSFER_FROM", "划出账户", "funding 或 swap"), - ("AUTO_TRANSFER_TO", "划入账户", "swap 或 funding"), + ("AUTO_TRANSFER_FROM", "划出账户", "余额不足时从此账户划入交易账户"), + ("AUTO_TRANSFER_TO", "划入账户", "目标余额所在账户,一般为 swap"), ("AUTO_TRANSFER_BJ_HOUR", "执行整点(北京时间)", ""), - ("TRANSFER_CCY", "划转币种", "默认 USDT"), + ("TRANSFER_CCY", "划转币种", ""), ], }, { @@ -200,6 +200,9 @@ _RUNTIME_ENV_DEFAULTS: dict[str, str] = { "RISK_MANUAL_CLOSE_DAILY_LIMIT": "2", "RISK_DAILY_LOSS_LIMIT": "2", "RISK_MOOD_ISSUES_DAILY_FREEZE": "true", + "AUTO_TRANSFER_FROM": "funding", + "AUTO_TRANSFER_TO": "swap", + "TRANSFER_CCY": "USDT", "HEDGE_PLAN_SHOW_PERP_OPTIONS": "true", "HEDGE_PLAN_SHOW_OPTIONS_OPTIONS": "true", "OKX_OPTIONS_CHAIN_ASK_LIQ_FILTER_ENABLED": "true", @@ -214,7 +217,9 @@ _RUNTIME_ENV_DEFAULTS: dict[str, str] = { def _effective_env_value(key: str, file_values: dict[str, str], schema_default: str = "") -> str: if key in file_values: - return file_values[key] + file_val = str(file_values.get(key) or "").strip() + if file_val: + return file_val runtime = os.getenv(key) if runtime is not None and str(runtime).strip() != "": return str(runtime).strip()