Skip to content

Commit 19b8074

Browse files
committed
Enforce platform cash reserve policy
1 parent 6047a54 commit 19b8074

2 files changed

Lines changed: 31 additions & 8 deletions

File tree

application/rebalance_service.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,10 @@ def _runtime_metadata_with_execution_policy(
168168
settings: PlatformRuntimeSettings,
169169
) -> dict[str, Any]:
170170
runtime_metadata = dict(metadata or {})
171-
runtime_metadata.setdefault(
172-
"firstrade_execution_policy",
173-
{
174-
"reserved_cash_floor_usd": float(settings.reserved_cash_floor_usd or 0.0),
175-
"reserved_cash_ratio": float(settings.reserved_cash_ratio or 0.0),
176-
},
177-
)
171+
runtime_metadata["firstrade_execution_policy"] = {
172+
"reserved_cash_floor_usd": float(settings.reserved_cash_floor_usd or 0.0),
173+
"reserved_cash_ratio": float(settings.reserved_cash_ratio or 0.0),
174+
}
178175
return runtime_metadata
179176

180177

tests/test_rebalance_service.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from types import SimpleNamespace
55

66
from application.firstrade_client import FirstradeCredentials
7-
from application.rebalance_service import run_strategy_cycle
7+
from application.rebalance_service import _runtime_metadata_with_execution_policy, run_strategy_cycle
88
from notifications.telegram import I18N, build_translator, render_cycle_summary
99
from quant_platform_kit.strategy_contracts import PositionTarget, StrategyDecision
1010
from runtime_config_support import PlatformRuntimeSettings
@@ -36,6 +36,32 @@ def _runtime_settings_with_persistence(**overrides) -> PlatformRuntimeSettings:
3636
return PlatformRuntimeSettings(**values)
3737

3838

39+
def test_runtime_metadata_uses_platform_execution_policy_over_strategy_metadata():
40+
metadata = {
41+
"signal": "ok",
42+
"firstrade_execution_policy": {
43+
"reserved_cash_floor_usd": 1.0,
44+
"reserved_cash_ratio": 0.0,
45+
},
46+
}
47+
48+
result = _runtime_metadata_with_execution_policy(
49+
metadata,
50+
settings=_runtime_settings_with_persistence(
51+
reserved_cash_floor_usd=250.0,
52+
reserved_cash_ratio=0.03,
53+
),
54+
)
55+
56+
assert result == {
57+
"signal": "ok",
58+
"firstrade_execution_policy": {
59+
"reserved_cash_floor_usd": 250.0,
60+
"reserved_cash_ratio": 0.03,
61+
},
62+
}
63+
64+
3965
class FakeFirstradeClient:
4066
def __init__(self, _credentials, *, live_trading_enabled=False):
4167
self.live_trading_enabled = live_trading_enabled

0 commit comments

Comments
 (0)