Skip to content

Commit bbc0987

Browse files
committed
Pass reserved cash policy to strategy runtime
1 parent 9261471 commit bbc0987

3 files changed

Lines changed: 34 additions & 1 deletion

File tree

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
flask
22
gunicorn
33
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@b846c9d777a450e95d23c264853997d671f47dd9
4-
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@361338f60900182e3be535cd5fd2be2b9a07b422
4+
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@0cd90a37f3ea5e4b6fe27c9a435834df7df3a25f
55
hk-equity-strategies @ git+https://github.com/QuantStrategyLab/HkEquityStrategies.git@4007746ac21379f7ce7cf8e999d2bb37123f6767
66
pandas
77
requests

strategy_runtime.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ def _default_runtime_settings(profile: str, display_name: str) -> PlatformRuntim
167167

168168
def _build_runtime_overrides(profile: str, runtime_settings: PlatformRuntimeSettings) -> dict[str, Any]:
169169
overrides: dict[str, Any] = {}
170+
reserved_cash_floor_usd = getattr(runtime_settings, "reserved_cash_floor_usd", 0.0)
171+
reserved_cash_ratio = getattr(runtime_settings, "reserved_cash_ratio", None)
172+
if float(reserved_cash_floor_usd or 0.0) > 0.0:
173+
overrides["reserved_cash_floor_usd"] = float(reserved_cash_floor_usd)
174+
if reserved_cash_ratio is not None and float(reserved_cash_ratio or 0.0) > 0.0:
175+
overrides["reserved_cash_ratio"] = float(reserved_cash_ratio)
170176
income_layer_enabled = getattr(runtime_settings, "income_layer_enabled", None)
171177
income_layer_start_usd = getattr(runtime_settings, "income_layer_start_usd", None)
172178
income_layer_max_ratio = getattr(runtime_settings, "income_layer_max_ratio", None)

tests/test_strategy_runtime.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def _build_runtime_settings(
126126
dca_mode: str | None = None,
127127
dca_base_investment_usd: float | None = None,
128128
runtime_execution_window_trading_days: int | None = None,
129+
reserved_cash_floor_usd: float = 0.0,
130+
reserved_cash_ratio: float = 0.0,
129131
) -> PlatformRuntimeSettings:
130132
return PlatformRuntimeSettings(
131133
project_id=None,
@@ -141,6 +143,8 @@ def _build_runtime_settings(
141143
tg_token=None,
142144
tg_chat_id=None,
143145
dry_run_only=False,
146+
reserved_cash_floor_usd=reserved_cash_floor_usd,
147+
reserved_cash_ratio=reserved_cash_ratio,
144148
income_threshold_usd=income_threshold_usd,
145149
qqqi_income_ratio=qqqi_income_ratio,
146150
income_layer_enabled=income_layer_enabled,
@@ -329,6 +333,29 @@ def test_load_strategy_runtime_applies_dca_overrides_from_settings(self):
329333
self.assertTrue(runtime.merged_runtime_config["smart_multiplier_enabled"])
330334
self.assertEqual(runtime.merged_runtime_config["base_investment_usd"], 500.0)
331335

336+
def test_load_strategy_runtime_applies_reserved_cash_policy_overrides_from_settings(self):
337+
entrypoint = _SemiconductorEntrypoint()
338+
339+
with patch.object(strategy_runtime_module, "load_strategy_entrypoint_for_profile", return_value=entrypoint):
340+
with patch.object(
341+
strategy_runtime_module,
342+
"load_strategy_runtime_adapter_for_profile",
343+
return_value=StrategyRuntimeAdapter(portfolio_input_name="portfolio_snapshot"),
344+
):
345+
runtime = strategy_runtime_module.load_strategy_runtime(
346+
"soxl_soxx_trend_income",
347+
runtime_settings=_build_runtime_settings(
348+
"soxl_soxx_trend_income",
349+
reserved_cash_floor_usd=150.0,
350+
reserved_cash_ratio=0.03,
351+
),
352+
)
353+
354+
self.assertEqual(runtime.runtime_overrides["reserved_cash_floor_usd"], 150.0)
355+
self.assertEqual(runtime.runtime_overrides["reserved_cash_ratio"], 0.03)
356+
self.assertEqual(runtime.merged_runtime_config["reserved_cash_floor_usd"], 150.0)
357+
self.assertEqual(runtime.merged_runtime_config["reserved_cash_ratio"], 0.03)
358+
332359
def test_load_strategy_runtime_applies_tech_execution_window_overrides_from_settings(self):
333360
entrypoint = _TechEntrypoint()
334361

0 commit comments

Comments
 (0)