@ -134,6 +134,14 @@ class PaperTradingEngine:
self . _parking_brake_cooldown_remaining : int = 0
self . _parking_brake_cooldown_remaining : int = 0
self . _parking_brake_skip_buy_today : bool = False # skip same-day re-buy after brake fires
self . _parking_brake_skip_buy_today : bool = False # skip same-day re-buy after brake fires
logger . warning (
" paper_trader_scoring_dispatch " ,
session_id = session . session_id ,
session_name = session . session_name ,
scoring_model = self . _config . signal . scoring_model ,
config_path = session . config_path ,
)
def _get_candidate_capital_bucket_id ( self , candidate : Candidate ) - > str | None :
def _get_candidate_capital_bucket_id ( self , candidate : Candidate ) - > str | None :
return candidate . engine_capital_bucket_id
return candidate . engine_capital_bucket_id
@ -438,16 +446,25 @@ class PaperTradingEngine:
)
)
return None , reason
return None , reason
@staticmethod
def _is_market_open ( self ) - > bool :
def _is_market_open ( ) - > bool :
""" Return True if US equity market is currently open.
""" Return True if US equity market is currently open (9:30– 16:00 ET, weekdays). """
import zoneinfo
Authoritative : Alpaca ` get_clock ( ) ` — respects holidays , early closes ,
now_et = dt . datetime . now ( tz = zoneinfo . ZoneInfo ( " America/New_York " ) )
halted markets . Falls back to a weekday 9 : 30 – 16 : 00 ET clock - only check
if now_et . weekday ( ) > = 5 : # Saturday=5, Sunday=6
on any broker error ( better to fail - open during rare API hiccups than
return False
miss an event entirely ; Alpaca will reject rejected orders downstream ) .
market_open = now_et . replace ( hour = 9 , minute = 30 , second = 0 , microsecond = 0 )
"""
market_close = now_et . replace ( hour = 16 , minute = 0 , second = 0 , microsecond = 0 )
try :
return market_open < = now_et < market_close
return self . _broker . get_clock ( ) . is_open
except Exception as exc :
logger . warning ( " paper_engine_clock_fallback " , error = str ( exc ) )
import zoneinfo
now_et = dt . datetime . now ( tz = zoneinfo . ZoneInfo ( " America/New_York " ) )
if now_et . weekday ( ) > = 5 :
return False
market_open = now_et . replace ( hour = 9 , minute = 30 , second = 0 , microsecond = 0 )
market_close = now_et . replace ( hour = 16 , minute = 0 , second = 0 , microsecond = 0 )
return market_open < = now_et < market_close
def _check_kill_switch ( self , drawdown_pct : float , session_st : Any ) - > bool :
def _check_kill_switch ( self , drawdown_pct : float , session_st : Any ) - > bool :
""" Activate kill switch if drawdown exceeds threshold. Returns True if triggered. """
""" Activate kill switch if drawdown exceeds threshold. Returns True if triggered. """