@@ -176,6 +176,8 @@ class PlatformRuntimeSettings:
176176 income_layer_enabled : bool | None = None
177177 income_layer_start_usd : float | None = None
178178 income_layer_max_ratio : float | None = None
179+ dca_mode : str | None = None
180+ dca_base_investment_usd : float | None = None
179181 account_group : str = DEFAULT_ACCOUNT_GROUP
180182 service_name : str | None = None
181183 account_ids : tuple [str , ...] = ()
@@ -378,6 +380,8 @@ def load_platform_runtime_settings(
378380 income_layer_enabled = resolve_optional_bool_env ("INCOME_LAYER_ENABLED" ),
379381 income_layer_start_usd = resolve_optional_non_negative_float_env ("INCOME_LAYER_START_USD" ),
380382 income_layer_max_ratio = resolve_optional_ratio_env ("INCOME_LAYER_MAX_RATIO" ),
383+ dca_mode = resolve_optional_dca_mode_env ("DCA_MODE" ),
384+ dca_base_investment_usd = resolve_optional_positive_float_env ("DCA_BASE_INVESTMENT_USD" ),
381385 account_group = account_group ,
382386 service_name = group_config .service_name ,
383387 account_ids = group_config .account_ids ,
@@ -519,6 +523,33 @@ def resolve_optional_non_negative_float_env(name: str) -> float | None:
519523 return resolve_non_negative_float_env (name , default = 0.0 )
520524
521525
526+ def resolve_optional_positive_float_env (name : str ) -> float | None :
527+ raw_value = os .getenv (name )
528+ if raw_value is None or str (raw_value ).strip () == "" :
529+ return None
530+ value = resolve_non_negative_float_env (name , default = 0.0 )
531+ if value <= 0.0 :
532+ raise ValueError (f"{ name } must be positive, got { value } " )
533+ return value
534+
535+
536+ def resolve_optional_dca_mode_env (name : str ) -> str | None :
537+ raw_value = os .getenv (name )
538+ if raw_value is None or str (raw_value ).strip () == "" :
539+ return None
540+ value = str (raw_value ).strip ().lower ()
541+ aliases = {
542+ "ordinary" : "fixed" ,
543+ "ordinary_dca" : "fixed" ,
544+ "fixed_dca" : "fixed" ,
545+ "smart_dca" : "smart" ,
546+ }
547+ mode = aliases .get (value , value )
548+ if mode not in {"fixed" , "smart" }:
549+ raise ValueError (f"{ name } must be fixed or smart, got { raw_value !r} " )
550+ return mode
551+
552+
522553def resolve_optional_bool_env (name : str ) -> bool | None :
523554 raw_value = os .getenv (name )
524555 if raw_value is None or str (raw_value ).strip () == "" :
0 commit comments