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:
@@ -1,57 +1,115 @@
|
||||
# Database Configuration
|
||||
DATABASE_URL=postgresql://user:password@localhost:5432/auto_stock
|
||||
DB_POOL_SIZE=10
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# Auto Stock Trading System — 환경 설정 템플릿
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# 이 파일을 복사하여 .env 파일을 만드세요:
|
||||
# cp .env.example .env
|
||||
#
|
||||
# ⚠️ 운영 환경 필수 체크리스트:
|
||||
# 1. SECRET_KEY를 강력한 랜덤 문자열로 변경 (최소 64자)
|
||||
# python -c "import secrets; print(secrets.token_urlsafe(64))"
|
||||
# 2. POSTGRES_PASSWORD를 강력한 비밀번호로 변경
|
||||
# 3. REDIS_PASSWORD를 설정하고 REDIS_URL에 반영
|
||||
# 4. DEBUG=false 설정
|
||||
# 5. CORS_ORIGINS를 실제 도메인만 허용
|
||||
# 6. BACKEND_HOST=127.0.0.1 (리버스 프록시 사용 시)
|
||||
# 7. MCP_API_KEY를 강력한 키로 변경
|
||||
#
|
||||
# 설정 참조 문서: CLAUDE.md 섹션 1.2, 4.3
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
# Redis Configuration
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
# ─── 서버 & 환경 ──────────────────────────────────────────────────────────────
|
||||
BACKEND_HOST=0.0.0.0
|
||||
BACKEND_PORT=8000
|
||||
DEBUG=false
|
||||
LOG_LEVEL=info
|
||||
|
||||
# RabbitMQ Configuration
|
||||
# ─── Telegram 알림 (빈 문자열이면 비활성화) ──────────────────────────────────────
|
||||
TELEGRAM_BOT_TOKEN=
|
||||
TELEGRAM_CHAT_ID=
|
||||
|
||||
# ─── 보안 ─────────────────────────────────────────────────────────────────────
|
||||
# ⚠️ 반드시 변경! python -c "import secrets; print(secrets.token_urlsafe(64))"
|
||||
SECRET_KEY=CHANGE_ME_USE_python_secrets_token_urlsafe_64
|
||||
ALGORITHM=HS256
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=30
|
||||
|
||||
# ─── 데이터베이스 (PostgreSQL 15) ─────────────────────────────────────────────
|
||||
# docker-compose에서 사용하는 변수 (⚠️ 비밀번호 변경 필수)
|
||||
POSTGRES_USER=stock
|
||||
POSTGRES_PASSWORD=CHANGE_ME_STRONG_PASSWORD
|
||||
POSTGRES_DB=stock
|
||||
# SQLAlchemy Async URL (Docker 환경에서는 localhost→postgres 자동 변환)
|
||||
DATABASE_URL=postgresql+asyncpg://stock:CHANGE_ME_STRONG_PASSWORD@localhost:5432/stock
|
||||
|
||||
# ─── Redis 7 ──────────────────────────────────────────────────────────────────
|
||||
# ⚠️ 운영 환경에서 반드시 비밀번호를 설정하세요
|
||||
REDIS_PASSWORD=CHANGE_ME_REDIS_PASSWORD
|
||||
REDIS_URL=redis://:CHANGE_ME_REDIS_PASSWORD@localhost:6379/0
|
||||
|
||||
# ─── RabbitMQ 3 ───────────────────────────────────────────────────────────────
|
||||
RABBITMQ_DEFAULT_USER=guest
|
||||
RABBITMQ_DEFAULT_PASS=guest
|
||||
RABBITMQ_URL=amqp://guest:guest@localhost:5672/
|
||||
|
||||
# Korea Investment Securities API - Mode Selection
|
||||
KIS_MODE=virtual # virtual (모의투자) 또는 real (실전투자)
|
||||
# ─── KIS API (한국투자증권) ───────────────────────────────────────────────────
|
||||
# KIS_MODE: "virtual" (모의투자) 또는 "real" (실전투자)
|
||||
KIS_MODE=virtual
|
||||
|
||||
# 모의투자 (Virtual Trading)
|
||||
KIS_VIRTUAL_APP_KEY=your_virtual_app_key_here
|
||||
KIS_VIRTUAL_APP_SECRET=your_virtual_app_secret_here
|
||||
KIS_VIRTUAL_ACCOUNT_NO=your_virtual_account_number_here
|
||||
KIS_VIRTUAL_URL=https://openapivts.koreainvestment.com:29443
|
||||
KIS_WS_VIRTUAL_URL=wss://openapivts.koreainvestment.com:29443/websocket
|
||||
|
||||
# 실전투자 (Real Trading)
|
||||
KIS_REAL_APP_KEY=your_real_app_key_here
|
||||
KIS_REAL_APP_SECRET=your_real_app_secret_here
|
||||
KIS_REAL_ACCOUNT_NO=your_real_account_number_here
|
||||
KIS_REAL_URL=https://openapi.koreainvestment.com:9443
|
||||
KIS_WS_REAL_URL=wss://openapi.koreainvestment.com:21000/websocket
|
||||
|
||||
# 현재 활성 설정 (KIS_MODE에 따라 자동 선택됨)
|
||||
KIS_APP_KEY=your_virtual_app_key_here
|
||||
KIS_APP_SECRET=your_virtual_app_secret_here
|
||||
KIS_ACCOUNT_NO=your_virtual_account_number_here
|
||||
KIS_BASE_URL=https://openapivts.koreainvestment.com:29443
|
||||
|
||||
# MCP Server Configuration
|
||||
MCP_SERVER_URL=http://localhost:8001
|
||||
MCP_API_KEY=your_mcp_api_key_here
|
||||
|
||||
# Claude AI Configuration (for MCP Server)
|
||||
# ─── AI & MCP ─────────────────────────────────────────────────────────────────
|
||||
# AI_PROVIDER: "gemini" 또는 "claude" (CLAUDE.md 섹션 1.2)
|
||||
AI_PROVIDER=gemini
|
||||
ANTHROPIC_API_KEY=your_anthropic_api_key_here
|
||||
GEMINI_API_KEY=your_gemini_api_key_here
|
||||
GEMINI_MODEL=gemini-2.0-flash
|
||||
CLAUDE_MODEL=claude-3-5-sonnet-20241022
|
||||
CLAUDE_MAX_TOKENS=4096
|
||||
|
||||
# Server Configuration
|
||||
SERVER_HOST=0.0.0.0
|
||||
SERVER_PORT=8000
|
||||
DEBUG=false
|
||||
LOG_LEVEL=info
|
||||
# MCP 서버 (⚠️ MCP_API_KEY 변경 필수)
|
||||
MCP_SERVER_URL=http://localhost:8001
|
||||
MCP_SERVER_HOST=0.0.0.0
|
||||
MCP_SERVER_PORT=8001
|
||||
MCP_API_KEY=CHANGE_ME_MCP_API_KEY
|
||||
MCP_VALIDATION_ENABLED=true
|
||||
|
||||
# Security
|
||||
SECRET_KEY=your_secret_key_here_change_in_production
|
||||
ALGORITHM=HS256
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=30
|
||||
# ─── 외부 API ─────────────────────────────────────────────────────────────────
|
||||
DATAGOKR_API_KEY=your_data_go_kr_api_key_here
|
||||
NEWS_API_KEY=
|
||||
NEWS_ENABLED=true
|
||||
NEWS_COLLECT_INTERVAL=1800
|
||||
NEWS_CACHE_TTL=1800
|
||||
NEWS_BLOCK_SCORE=-0.5
|
||||
NEWS_REDUCE_SCORE=-0.3
|
||||
NEWS_MAX_ARTICLES=20
|
||||
|
||||
# CORS
|
||||
# ─── 토큰 절약 모드 ──────────────────────────────────────────────────────────
|
||||
# true: JSON 압축 + 차트 데이터 30일 제한 (AI 프롬프트 토큰 절약)
|
||||
TOKEN_SAVE_MODE=true
|
||||
|
||||
# ─── 자동매매 ─────────────────────────────────────────────────────────────────
|
||||
AUTO_TRADE_ENABLED=true
|
||||
US_TRADING_ENABLED=false
|
||||
|
||||
# ─── CORS ─────────────────────────────────────────────────────────────────────
|
||||
CORS_ORIGINS=http://localhost:3000,http://localhost:5173
|
||||
|
||||
# WebSocket
|
||||
# ─── WebSocket ────────────────────────────────────────────────────────────────
|
||||
WS_HEARTBEAT_INTERVAL=30
|
||||
WS_MESSAGE_QUEUE_SIZE=1000
|
||||
|
||||
# ─── 프론트엔드 (Vite 빌드 시 주입) ──────────────────────────────────────────
|
||||
VITE_API_URL=http://localhost:8000
|
||||
VITE_WS_URL=ws://localhost:8000
|
||||
|
||||
Reference in New Issue
Block a user