81 lines
2.1 KiB
Python
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("스케줄러 종료")
|