Exclude open paper trades from discovery
This commit is contained in:
@@ -35,6 +35,7 @@ async def list_trade_setups(
|
||||
min_confidence=min_confidence,
|
||||
recommended_action=recommended_action,
|
||||
live_recommendation=True,
|
||||
exclude_open_trade_tickers=True,
|
||||
)
|
||||
|
||||
data = []
|
||||
|
||||
@@ -286,7 +286,11 @@ async def _watchlist_tickers(db: AsyncSession) -> list[tuple[int, str]]:
|
||||
async def _qualified_setups(db: AsyncSession) -> list[dict]:
|
||||
# live_recommendation: gate and format on current score/sentiment context,
|
||||
# not the values frozen into the setup at scan time.
|
||||
setups = await get_trade_setups(db, live_recommendation=True)
|
||||
setups = await get_trade_setups(
|
||||
db,
|
||||
live_recommendation=True,
|
||||
exclude_open_trade_tickers=True,
|
||||
)
|
||||
config = await get_activation_config(db)
|
||||
return [s for s in setups if setup_qualifies(SimpleNamespace(**s), config)]
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from app.exceptions import NotFoundError
|
||||
from app.models.fundamental import FundamentalData
|
||||
from app.models.ohlcv import OHLCVRecord
|
||||
from app.models.paper_trade import PaperTrade
|
||||
from app.models.score import CompositeScore, DimensionScore
|
||||
from app.models.sentiment import SentimentScore
|
||||
from app.models.signal_context_snapshot import SignalContextSnapshot
|
||||
@@ -599,6 +600,7 @@ async def get_trade_setups(
|
||||
recommended_action: str | None = None,
|
||||
symbol: str | None = None,
|
||||
live_recommendation: bool = False,
|
||||
exclude_open_trade_tickers: bool = False,
|
||||
) -> list[dict]:
|
||||
"""Get latest stored trade setups, optionally filtered."""
|
||||
stmt = (
|
||||
@@ -615,6 +617,15 @@ async def get_trade_setups(
|
||||
stmt = stmt.where(TradeSetup.confidence_score >= min_confidence)
|
||||
if recommended_action is not None and not live_recommendation:
|
||||
stmt = stmt.where(TradeSetup.recommended_action == recommended_action)
|
||||
if exclude_open_trade_tickers:
|
||||
open_trade_result = await db.execute(
|
||||
select(PaperTrade.ticker_id)
|
||||
.where(PaperTrade.status == "open")
|
||||
.distinct()
|
||||
)
|
||||
open_ticker_ids = {ticker_id for ticker_id, in open_trade_result.all()}
|
||||
if open_ticker_ids:
|
||||
stmt = stmt.where(~TradeSetup.ticker_id.in_(open_ticker_ids))
|
||||
|
||||
stmt = stmt.order_by(TradeSetup.detected_at.desc(), TradeSetup.id.desc())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user