from __future__ import annotations from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger from app.core.config import settings from app.core.database import SessionLocal from app.core.logger import setup_logger from app.engine.collector import price_collector from app.engine.strategy_engine import strategy_engine logger = setup_logger("scheduler") scheduler = AsyncIOScheduler(timezone="Asia/Seoul") async def collect_job() -> None: db = SessionLocal() try: count = await price_collector.collect_all(db) if count > 0: logger.debug("가격 수집 완료: %d개 종목", count) finally: db.close() async def strategy_job() -> None: db = SessionLocal() try: signals = await strategy_engine.evaluate_all(db) if signals: await strategy_engine.execute_signals(signals, db) finally: db.close() async def reset_daily_count_job() -> None: strategy_engine.reset_daily_count() logger.info("일일 매매 카운트 초기화") def start_scheduler() -> None: scheduler.add_job( collect_job, trigger=IntervalTrigger(seconds=settings.collector.interval_seconds), id="price_collector", name="주가 수집", replace_existing=True, ) scheduler.add_job( strategy_job, trigger=IntervalTrigger(seconds=settings.strategy.check_interval_seconds), id="strategy_engine", name="전략 실행", replace_existing=True, ) scheduler.add_job( reset_daily_count_job, trigger="cron", hour=0, minute=0, id="daily_reset", name="일일 카운트 초기화", replace_existing=True, ) scheduler.start() logger.info( "스케줄러 시작 - 수집: %d초 간격, 전략: %d초 간격", settings.collector.interval_seconds, settings.strategy.check_interval_seconds, ) def stop_scheduler() -> None: if scheduler.running: scheduler.shutdown(wait=False) logger.info("스케줄러 종료")