feat: add runtime dynamic team controls
This commit is contained in:
@@ -17,6 +17,14 @@ NYSE_TZ = ZoneInfo("America/New_York")
|
||||
NYSE_CALENDAR = mcal.get_calendar("NYSE")
|
||||
|
||||
|
||||
def normalize_schedule_mode(mode: str | None) -> str:
|
||||
"""Normalize schedule mode to the current public vocabulary."""
|
||||
value = str(mode or "daily").strip().lower()
|
||||
if value == "intraday":
|
||||
return "interval"
|
||||
return value or "daily"
|
||||
|
||||
|
||||
class Scheduler:
|
||||
"""
|
||||
Market-aware scheduler for live trading.
|
||||
@@ -31,7 +39,7 @@ class Scheduler:
|
||||
heartbeat_interval: Optional[int] = None,
|
||||
config: Optional[dict] = None,
|
||||
):
|
||||
self.mode = mode
|
||||
self.mode = normalize_schedule_mode(mode)
|
||||
self.trigger_time = trigger_time or "09:30" # NYSE timezone
|
||||
self.trigger_now = self.trigger_time == "now"
|
||||
self.interval_minutes = interval_minutes or 60
|
||||
@@ -107,7 +115,7 @@ class Scheduler:
|
||||
|
||||
if self.mode == "daily":
|
||||
self._task = asyncio.create_task(self._run_daily(self._callback))
|
||||
elif self.mode == "intraday":
|
||||
elif self.mode == "interval":
|
||||
self._task = asyncio.create_task(
|
||||
self._run_intraday(self._callback),
|
||||
)
|
||||
@@ -124,8 +132,13 @@ class Scheduler:
|
||||
"""Update scheduler parameters in-place and restart its timing loop."""
|
||||
changed = False
|
||||
|
||||
if mode and mode != self.mode:
|
||||
self.mode = mode
|
||||
if mode:
|
||||
normalized_mode = normalize_schedule_mode(mode)
|
||||
else:
|
||||
normalized_mode = None
|
||||
|
||||
if normalized_mode and normalized_mode != self.mode:
|
||||
self.mode = normalized_mode
|
||||
changed = True
|
||||
|
||||
if trigger_time and trigger_time != self.trigger_time:
|
||||
@@ -233,13 +246,13 @@ class Scheduler:
|
||||
await callback(date=current_date)
|
||||
|
||||
async def _run_intraday(self, callback: Callable):
|
||||
"""Run every N minutes (for future use)"""
|
||||
"""Run every N minutes in interval mode."""
|
||||
while self.running:
|
||||
now = self._now_nyse()
|
||||
current_date = now.strftime("%Y-%m-%d")
|
||||
|
||||
if self._is_trading_day(now):
|
||||
logger.info(f"Triggering intraday cycle for {current_date}")
|
||||
logger.info(f"Triggering interval cycle for {current_date}")
|
||||
await callback(date=current_date)
|
||||
|
||||
await asyncio.sleep(self.interval_minutes * 60)
|
||||
|
||||
Reference in New Issue
Block a user