Files
stockautomtion/app/engine/scheduler.py
2026-07-16 23:55:16 +09:00

81 lines
2.1 KiB
Python

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("스케줄러 종료")