first commit
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
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("스케줄러 종료")
|
||||
Reference in New Issue
Block a user