87 lines
2.3 KiB
Python
87 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI, Request
|
|
from fastapi.responses import HTMLResponse
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
from app.core.config import settings
|
|
from app.core.database import init_db
|
|
from app.core.logger import setup_logger
|
|
from app.core.auth import token_manager
|
|
from app.engine.scheduler import start_scheduler, stop_scheduler
|
|
from app.services.market_data import market_data_service
|
|
from app.services.trading import trading_service
|
|
from app.services.account import account_service
|
|
from app.services.realtime import realtime_service
|
|
|
|
from app.routers import stocks, trading, strategies, websocket, dashboard
|
|
|
|
logger = setup_logger("main", level=settings.app.log_level)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
logger.info("=== Stock Automation 시작 ===")
|
|
logger.info("서버 모드: %s", settings.kis.server_mode)
|
|
|
|
init_db()
|
|
logger.info("데이터베이스 초기화 완료")
|
|
|
|
try:
|
|
await token_manager.get_access_token()
|
|
logger.info("KIS 인증 완료")
|
|
except Exception as e:
|
|
logger.warning("KIS 인증 실패 (API 키를 확인하세요): %s", e)
|
|
|
|
start_scheduler()
|
|
|
|
yield
|
|
|
|
logger.info("=== Stock Automation 종료 ===")
|
|
stop_scheduler()
|
|
await realtime_service.disconnect()
|
|
await market_data_service.close()
|
|
await trading_service.close()
|
|
await account_service.close()
|
|
await token_manager.close()
|
|
|
|
|
|
app = FastAPI(
|
|
title="Stock Automation",
|
|
description="한국투자증권 API 기반 자동매매 시스템",
|
|
version="0.1.0",
|
|
lifespan=lifespan,
|
|
)
|
|
|
|
app.include_router(stocks.router)
|
|
app.include_router(trading.router)
|
|
app.include_router(strategies.router)
|
|
app.include_router(websocket.router)
|
|
app.include_router(dashboard.router)
|
|
|
|
templates = Jinja2Templates(directory="app/templates")
|
|
|
|
|
|
@app.get("/", response_class=HTMLResponse)
|
|
async def index(request: Request):
|
|
return templates.TemplateResponse("index.html", {"request": request})
|
|
|
|
|
|
@app.get("/health")
|
|
async def health():
|
|
return {"status": "ok", "mode": settings.kis.server_mode}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
|
|
uvicorn.run(
|
|
"app.main:app",
|
|
host=settings.app.host,
|
|
port=settings.app.port,
|
|
reload=settings.app.debug,
|
|
)
|