fix: grandfather pre-cutover stop episodes
This commit is contained in:
@@ -5,7 +5,7 @@ from __future__ import annotations
|
||||
from collections.abc import Iterable
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy import func, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models.paper_trade import PaperTrade
|
||||
@@ -16,27 +16,35 @@ async def _latest_initial_stop_trades(
|
||||
*,
|
||||
closed_before: datetime | None = None,
|
||||
) -> dict[int, PaperTrade]:
|
||||
"""Return the most recent initial-stop trade for each ticker."""
|
||||
stmt = (
|
||||
select(PaperTrade)
|
||||
"""Return a ticker's latest closed trade only when it was an initial stop."""
|
||||
ranked_stmt = (
|
||||
select(
|
||||
PaperTrade.id.label("trade_id"),
|
||||
func.row_number()
|
||||
.over(
|
||||
partition_by=PaperTrade.ticker_id,
|
||||
order_by=(PaperTrade.closed_at.desc(), PaperTrade.id.desc()),
|
||||
)
|
||||
.label("recency"),
|
||||
)
|
||||
.where(
|
||||
PaperTrade.status == "closed",
|
||||
PaperTrade.close_reason == "stop",
|
||||
PaperTrade.closed_at.is_not(None),
|
||||
)
|
||||
.order_by(
|
||||
PaperTrade.ticker_id.asc(),
|
||||
PaperTrade.closed_at.desc(),
|
||||
PaperTrade.id.desc(),
|
||||
)
|
||||
)
|
||||
if closed_before is not None:
|
||||
stmt = stmt.where(PaperTrade.closed_at <= closed_before)
|
||||
ranked_stmt = ranked_stmt.where(PaperTrade.closed_at <= closed_before)
|
||||
ranked = ranked_stmt.subquery()
|
||||
stmt = (
|
||||
select(PaperTrade)
|
||||
.join(ranked, ranked.c.trade_id == PaperTrade.id)
|
||||
.where(
|
||||
ranked.c.recency == 1,
|
||||
PaperTrade.close_reason == "stop",
|
||||
)
|
||||
)
|
||||
result = await db.execute(stmt)
|
||||
latest: dict[int, PaperTrade] = {}
|
||||
for trade in result.scalars():
|
||||
latest.setdefault(trade.ticker_id, trade)
|
||||
return latest
|
||||
return {trade.ticker_id: trade for trade in result.scalars()}
|
||||
|
||||
|
||||
async def get_reentry_gate_locks(db: AsyncSession) -> dict[int, datetime]:
|
||||
|
||||
Reference in New Issue
Block a user