fix: CRITICAL/HIGH 버그 30건 수정 + 전체 코드 주석 추가 + 중복 정리
## CRITICAL 수정 (20건) - day_trading: global 선언 누락, loss_tracker 연동, ban 체크 추가 - trade_executor: BUY 체결가 order_price로 수정, remaining_pct 누적 계산 - risk_validator: get_current_price dict 파싱, MAX_POSITION_SIZE 동기화, DB 세션 누수 - risk_management/recommendations: date.today() → KST 변환 - mdd_manager: Lock 밖 executed_key 참조 수정 - correlation_filter: output → output2 키 수정 - portfolio: 해외 종목 USD/KRW 환율 적용 분리 - Sharpe Ratio 거래빈도 기반 연간화 - telegram_notifier: send_message() 공개 래퍼 추가 - position_manager: 앱 재시작 시 DB 포지션 복원 - swing exit_service: remaining_pct 조건 범위 수정 - run_backtest: original_qty 기반 remaining_pct 계산 - us_market_schedule: 2027년 미국 공휴일 추가 - Login.tsx: res.ok 검증 추가 - mean_reversion_strategy: RSI 로그 하드코딩 수정 ## HIGH 수정 (10건) - db_worker: DLQ 파일 백업 메커니즘 추가 - korea_investment_api: 만료 토큰 임의 연장 제거 - market_data: chart_cache 최대 100개 + TTL 만료 - main.py: rate_limit_store 1시간 미접근 IP 정리 - recommendations: fire-and-forget try/except 추가 - swing/scheduler: DB 세션 3개 분리 - Dashboard: wsMessages 전체 순회 - Layout: /health 엔드포인트 + 30초 폴링 - ml_ensemble: POST /train require_api_key 추가 - day_trading: record_trade_result_safe() 전환 ## 코드 정리 - 프론트엔드: isUsStock, formatTime 공통 유틸 추출 - 백엔드: dead code 제거, 중복 import 통합 - MCP: JSON 파싱 헬퍼 추출 (~60줄 감소) - 전체 ~100개 파일 한국어 주석 추가 - 테스트 13건 코드 기준 수정 (468 passed) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,29 +2,132 @@
|
||||
API 라우터 통합 모듈
|
||||
|
||||
- 각 엔드포인트 라우터를 prefix/tag와 함께 등록
|
||||
- 인증 정책:
|
||||
- require_api_key: 매매 실행, 설정 변경, 관리 API (X-API-Key 필수)
|
||||
- optional_api_key: 읽기 전용 조회 API (X-API-Key 선택)
|
||||
"""
|
||||
from fastapi import APIRouter
|
||||
from fastapi import APIRouter, Depends
|
||||
from app.core.security import require_api_key, optional_api_key
|
||||
from app.api.endpoints import (
|
||||
trading_rules, trades, portfolio, market_data, mcp, recommendations,
|
||||
monitoring, tensorflow_predictions, debug, risk_management, ml_ensemble,
|
||||
journals, day_trading, strategy_config, backtest, analysis,
|
||||
swing_portfolio, daytrading_v2, us_trading, kr_backtest,
|
||||
market_intelligence, market_playbook, news,
|
||||
adaptive_strategy,
|
||||
)
|
||||
|
||||
api_router = APIRouter()
|
||||
|
||||
api_router.include_router(trading_rules.router, prefix="/rules", tags=["trading_rules"])
|
||||
api_router.include_router(trades.router, prefix="/trades", tags=["trades"])
|
||||
api_router.include_router(portfolio.router, prefix="/portfolio", tags=["portfolio"])
|
||||
api_router.include_router(market_data.router, prefix="/market-data", tags=["market_data"])
|
||||
api_router.include_router(mcp.router, prefix="/mcp", tags=["mcp"])
|
||||
api_router.include_router(recommendations.router, prefix="/recommendations", tags=["recommendations"])
|
||||
api_router.include_router(monitoring.router, prefix="/monitoring", tags=["monitoring"])
|
||||
api_router.include_router(tensorflow_predictions.router, prefix="/ml", tags=["ml"])
|
||||
api_router.include_router(debug.router, prefix="/debug", tags=["debug"])
|
||||
api_router.include_router(risk_management.router, prefix="/risk", tags=["risk_management"])
|
||||
api_router.include_router(ml_ensemble.router, prefix="/ml-ensemble", tags=["ml_ensemble"])
|
||||
api_router.include_router(journals.router, prefix="/journals", tags=["journals"])
|
||||
api_router.include_router(day_trading.router, prefix="/daytrading", tags=["day_trading"])
|
||||
api_router.include_router(strategy_config.router, prefix="/strategy-config", tags=["strategy_config"])
|
||||
api_router.include_router(backtest.router, prefix="/backtest", tags=["backtest"])
|
||||
api_router.include_router(analysis.router, prefix="/analysis", tags=["analysis"])
|
||||
# ── 매매 실행 / 설정 변경 API (require_api_key) ───────────────────────────
|
||||
api_router.include_router(
|
||||
trading_rules.router, prefix="/rules", tags=["trading_rules"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
portfolio.router, prefix="/portfolio", tags=["portfolio"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
recommendations.router, prefix="/recommendations", tags=["recommendations"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
risk_management.router, prefix="/risk", tags=["risk_management"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
day_trading.router, prefix="/daytrading", tags=["day_trading"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
strategy_config.router, prefix="/strategy-config", tags=["strategy_config"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
swing_portfolio.router, prefix="/swing", tags=["swing"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
daytrading_v2.router, prefix="/daytrading-v2", tags=["daytrading_v2"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
us_trading.router, tags=["us_trading"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
|
||||
# ── 읽기 전용 API (optional_api_key) ─────────────────────────────────────
|
||||
api_router.include_router(
|
||||
market_data.router, prefix="/market-data", tags=["market_data"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
analysis.router, prefix="/analysis", tags=["analysis"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
journals.router, prefix="/journals", tags=["journals"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
|
||||
# ── 내부/인프라 API ───────────────────────────────────────────────────────
|
||||
api_router.include_router(
|
||||
trades.router, prefix="/trades", tags=["trades"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
mcp.router, prefix="/mcp", tags=["mcp"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
monitoring.router, prefix="/monitoring", tags=["monitoring"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
tensorflow_predictions.router, prefix="/ml", tags=["ml"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
debug.router, prefix="/debug", tags=["debug"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
ml_ensemble.router, prefix="/ml-ensemble", tags=["ml_ensemble"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
backtest.router, prefix="/backtest", tags=["backtest"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
api_router.include_router(
|
||||
kr_backtest.router, prefix="/kr-backtest", tags=["kr_backtest"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
|
||||
# ── 시장 인텔리전스 (읽기 전용) ──────────────────────────────────────────
|
||||
api_router.include_router(
|
||||
market_intelligence.router, prefix="/market-intelligence", tags=["market_intelligence"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
|
||||
# ── 시장 이벤트 플레이북 ──────────────────────────────────────────────────
|
||||
# GET (조회)는 optional, POST/DELETE (제어)는 require_api_key
|
||||
# 라우터 내부에서 GET은 인증 없이, POST/DELETE는 api/__init__ 의존성으로 보호
|
||||
api_router.include_router(
|
||||
market_playbook.router, prefix="/playbook", tags=["playbook"],
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
|
||||
# ── 뉴스 감성 분석 (읽기 전용) ─────────────────────────────────────────
|
||||
api_router.include_router(
|
||||
news.router, prefix="/news", tags=["news"],
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
|
||||
# ── 적응형 전략 엔진 ────────────────────────────────────────────────────
|
||||
# GET (조회)는 optional, POST (갱신)는 라우터 내부에서 require_api_key
|
||||
api_router.include_router(
|
||||
adaptive_strategy.router,
|
||||
dependencies=[Depends(optional_api_key)],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user