fix: grandfather pre-cutover stop episodes

This commit is contained in:
2026-07-17 20:28:42 +02:00
parent d858475ddb
commit d13c54e3c7
5 changed files with 179 additions and 16 deletions
+32 -1
View File
@@ -24,6 +24,7 @@ def _stopped_trade(
ticker_id: int,
*,
closed_at: datetime,
close_reason: str = "stop",
gate_failed_at: datetime | None = None,
gate_requalified_at: datetime | None = None,
) -> PaperTrade:
@@ -39,7 +40,7 @@ def _stopped_trade(
opened_at=closed_at - timedelta(days=5),
close_price=95.0,
closed_at=closed_at,
close_reason="stop",
close_reason=close_reason,
reentry_gate_failed_at=gate_failed_at,
reentry_gate_requalified_at=gate_requalified_at,
)
@@ -126,3 +127,33 @@ async def test_latest_stop_starts_a_new_gate_reset_episode(session):
await session.commit()
assert ticker.id in await get_reentry_gate_locks(session)
async def test_newer_non_stop_exit_supersedes_historical_stop(session):
session.add(User(id=1, username="u", password_hash="x", role="user", has_access=True))
ticker = Ticker(symbol="LATEREXIT")
session.add(ticker)
await session.flush()
stopped_at = datetime.now(timezone.utc) - timedelta(days=20)
old_stop = _stopped_trade(ticker.id, closed_at=stopped_at)
later_manual_exit = _stopped_trade(
ticker.id,
closed_at=stopped_at + timedelta(days=10),
close_reason="manual",
)
session.add_all([old_stop, later_manual_exit])
await session.commit()
assert ticker.id not in await get_reentry_gate_locks(session)
observed_at = datetime.now(timezone.utc)
updated = await observe_reentry_gate_transitions(
session,
evaluated_ticker_ids={ticker.id},
qualified_ticker_ids=set(),
observed_at=observed_at,
)
assert updated == set()
assert old_stop.reentry_gate_failed_at is None