feat(signal_v2-phase4-task3): integrate signal_generator into poll_loop
poll_loop now accepts dedup + settings kwargs (backwards-compatible defaults). After each in-window cycle (stock pull + minute momentum + optional post-close), generate_signals is called to populate state.signals for downstream Phase 5 pickup. main.py lifespan wires _ctx.dedup + settings into the poll_loop task. 1 integration test added (anomaly-free stop_loss path via direct generate_signals call, exercises the same code path that poll_loop runs). 56 tests pass.
This commit is contained in:
@@ -19,6 +19,8 @@ async def poll_loop(
|
||||
client: StockClient, state: PollState, shutdown: asyncio.Event,
|
||||
kis_client: KISClient | None = None,
|
||||
chronos=None,
|
||||
dedup=None,
|
||||
settings=None,
|
||||
) -> None:
|
||||
"""FastAPI lifespan 에서 asyncio.create_task 로 시작."""
|
||||
logger.info("poll_loop started")
|
||||
@@ -40,6 +42,13 @@ async def poll_loop(
|
||||
await _run_post_close_cycle(kis_client, chronos, state)
|
||||
except Exception:
|
||||
logger.exception("post-close cycle failed")
|
||||
# Phase 4: generate signals
|
||||
if dedup is not None and settings is not None:
|
||||
try:
|
||||
from signal_v2.signal_generator import generate_signals
|
||||
generate_signals(state, dedup, settings)
|
||||
except Exception:
|
||||
logger.exception("generate_signals failed")
|
||||
interval = _next_interval(now)
|
||||
try:
|
||||
await asyncio.wait_for(shutdown.wait(), timeout=interval)
|
||||
|
||||
Reference in New Issue
Block a user