fix: 하드닝 루프 8회차 — 체결 보정·고아 감지·청산 경보·실시간/차트·리스크 가드 일괄 수정

- 스윙 체결가 확인 전 executed_price NULL + fill_sweep, 진입가 resolve(ActiveTrade↔Portfolio), 0체결/부분체결 매수 장부 원복
- DT 고아 감지(근거 한정)·0체결 매도 복원·stale 점검 확대, 시간손절 -0.3% 원복
- 폴백 손절 ATR 캐시, 거래량부족-차단 신호 매수 차단, 현금 5% 유보 재적용, MDD peak/reset 수정
- KIS 서킷브레이커 청산 우회·경보, db_worker 재큐잉 순서, heartbeat·health-watch 사이드카
- 실시간 WS 재구독·41건 우선순위·다건 프레임 분할, 차트 샘플 제거·당일봉 합성, WS 서브프로토콜 인증
- 프론트: 미관리 그룹·확인 모달·차트 실시간 반영·예수금 표시 정정
- 전문가 에이전트 6종 추가(.claude/agents)
- 유닛 스위트 2667 passed (소켓 차단 하), tsc OK

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y83Za98XsNw9zuA4FTUytN
This commit is contained in:
2026-10-10 12:17:49 +09:00
parent 5c4803b339
commit a264561576
230 changed files with 41160 additions and 2334 deletions

View File

@@ -185,6 +185,14 @@ class Settings(BaseSettings):
# → 매핑 테이블 확충 + 백테스트 검증 후 활성화할 것 (correlation_filter 참고).
SECTOR_CAP_UNMAPPED_ENABLED: bool = False
# 상관 필터 (§5.1) — 기본값은 현행 동작 유지. 켜기 전 운영 DB 로 일봉 결손 빈도 확인 필요.
MAX_STOCKS_PER_SECTOR: int = 3
CORRELATION_THRESHOLD: float = 0.7
# 보유종목 일봉 부족/공통 거래일 부족으로 비교 제외가 생기면 후보 보류(fail-closed)
CORRELATION_FAIL_CLOSED_ON_MISSING_DATA: bool = False
# 후보 종목 일봉 부족 / 상관 계산 불가 시 보류(fail-closed). 거래량 영향 -> 사용자 결정 전 False
CORRELATION_FAIL_CLOSED_ON_CANDIDATE_DATA: bool = False
# 자본 배분 글로벌 가드 — 전 전략 합산 현금 사용 상한
MAX_TOTAL_CAPITAL_USAGE: float = 0.95 # 전체 자본의 95%까지만 투자 (5% 현금 보유)
@@ -387,7 +395,7 @@ class Settings(BaseSettings):
DAY_TRADE_RSI_BB_ATR_MULT: float = 1.5 # RSI_BB ATR 손절 배수
DAY_TRADE_TARGET_MULTIPLIER: float = 1.5 # 목표가 = entry + risk × 1.5R (기존 2.0 → 현실적 목표)
DAY_TRADE_TIME_STOP_MINUTES: int = 30 # 시간 손절 (30분)
DAY_TRADE_TIME_STOP_MIN_GAIN: float = -0.003 # 시간 손절: -0.3% 미만 시 청산 (기존 +0.5% → 수익 중이면 보유 유지)
DAY_TRADE_TIME_STOP_MIN_GAIN: float = -0.003 # 시간 손절: -0.3% 미만 시 청산. 2026-10-09 -0.7% 변경 원복 — 운영 실측(163건) DT 순손익 +31,233원으로 현행이 이익, 변경 효과는 백테스트 전 미확인
DAY_TRADE_ORB_MARGIN_CHECK: float = 0.03 # ORB 목표가 최소 마진 (3%)
DAY_TRADE_TRAILING_DEFAULT: float = 0.02 # 트레일링 기본값 -2% (ATR 없을 때)
DAY_TRADE_TRAILING_MIN_HOLD_SEC: int = 300 # 트레일링 활성화 최소 보유 시간 (초, 5분)
@@ -667,6 +675,15 @@ class Settings(BaseSettings):
DAY_TRADE_STALE_SELL_RETRY_BACKOFF_SEC: float = 60.0
# 업무 거부가 MAX_RETRIES 에 도달한 뒤에도 당일 포기하지 않고 이 간격으로 계속 재시도.
DAY_TRADE_STALE_SELL_EXHAUSTED_RETRY_SEC: float = 600.0
# [2026-10-08] DT 고아 잔고 감지 — Portfolio.strategy_type='daytrading' 수량이 있는데
# 인메모리 포지션·active ActiveTrade(day_trade) 가 없는 종목(예: 10/06 KB금융 EOD 매도
# 접수 후 0체결 → ActiveTrade 만 closed). close_stale_positions 경로로 전량 청산한다.
DAY_TRADE_ORPHAN_DETECT_ENABLED: bool = True
# DT 청산 반영 직후엔 Portfolio 행·KIS 잔고가 아직 이전 수량일 수 있다 → 이 시간 동안 판정 보류
DAY_TRADE_ORPHAN_GRACE_SEC: float = 600.0
# 고아로 판정하려면 이 기간 안에 DT ActiveTrade 행(상태 무관)이 있어야 한다 — 근거 없는
# 'daytrading' 태그(수동 매수가 섞인 행 등)를 팔지 않게. 매도 수량도 그 행 수량이 상한.
DAY_TRADE_ORPHAN_LOOKBACK_DAYS: int = 7
# 청산 주문 1건 응답 대기 상한. 초과 = 결과 불명 → 당일 주문내역으로 접수 확인.
# ⚠️ 이 상한에는 전송 전 대기(분산락·종목 세마포어·토큰)도 포함된다(전송 시점 표식은
# trade_executor/korea_investment_api 쪽 훅이 필요 — 미구현).