@@ -54,6 +54,7 @@ class PlatformRuntimeSettings:
5454 income_threshold_usd : float | None = None
5555 qqqi_income_ratio : float | None = None
5656 income_layer_enabled : bool | None = None
57+ income_layer_start_usd : float | None = None
5758 income_layer_max_ratio : float | None = None
5859 runtime_execution_window_trading_days : int | None = None
5960 feature_snapshot_path : str | None = None
@@ -169,6 +170,7 @@ def load_platform_runtime_settings(
169170 income_threshold_usd = resolve_optional_float_env (os .environ , "INCOME_THRESHOLD_USD" ),
170171 qqqi_income_ratio = _qqqi_income_ratio_env (),
171172 income_layer_enabled = _optional_bool_env ("INCOME_LAYER_ENABLED" ),
173+ income_layer_start_usd = _optional_non_negative_float_env ("INCOME_LAYER_START_USD" ),
172174 income_layer_max_ratio = _optional_ratio_env ("INCOME_LAYER_MAX_RATIO" ),
173175 runtime_execution_window_trading_days = _runtime_execution_window_trading_days_env (
174176 strategy_definition .profile
@@ -301,6 +303,17 @@ def _optional_ratio_env(name: str) -> float | None:
301303 return value
302304
303305
306+ def _optional_non_negative_float_env (name : str ) -> float | None :
307+ value = resolve_optional_float_env (os .environ , name )
308+ if value is None :
309+ return None
310+ if not math .isfinite (value ):
311+ raise ValueError (f"{ name } must be finite, got { value } " )
312+ if value < 0 :
313+ raise ValueError (f"{ name } must be non-negative, got { value } " )
314+ return float (value )
315+
316+
304317def _resolve_non_negative_float_env (name : str , * , default : float ) -> float :
305318 value = resolve_optional_float_env (os .environ , name )
306319 if value is None :
0 commit comments