Coverage for strategies / first_pullback_types.py: 100%
31 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 15:08 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 15:08 +0000
1# strategies/first_pullback_types.py
2from dataclasses import dataclass
3from strategies.base_strategy_config import BaseStrategyConfig
6@dataclass
7class FirstPullbackConfig(BaseStrategyConfig):
8 """첫 눌림목(Holy Grail) 전략 설정."""
9 # Phase 1: Setup (로켓 발사)
10 surge_lookback_days: int = 20 # 급등 이력 조회 기간
11 upper_limit_pct: float = 29.0 # 상한가 기준 (종가 +29%)
12 rapid_surge_pct: float = 30.0 # 단기 급등 기준 (+30%)
13 rapid_surge_min_days: int = 5 # 급등 최소 기간
14 rapid_surge_max_days: int = 10 # 급등 최대 기간
15 ma_period: int = 20 # 이동평균선 기간
16 ma_rising_days: int = 5 # 20MA 우상향 연속 일수
18 # Phase 2: Pullback (건전한 숨 고르기)
19 pullback_lower_pct: float = -1.0 # 20MA 대비 하한 (-1%)
20 pullback_upper_pct: float = 3.0 # 20MA 대비 상한 (+3%)
21 volume_dryup_ratio: float = 0.5 # 급등일 거래량 대비 50%
22 volume_dryup_days: int = 3 # 거래량 고갈 비교 기간
24 # Phase 3: Trigger (매수 방아쇠)
25 execution_strength_min: float = 100.0 # 체결강도 >= 100%
27 # Phase 4: Exit (기계적 청산)
28 stop_loss_below_ma_pct: float = -2.0 # 20MA -2% 이탈 시 손절
29 take_profit_pct: float = 15.0 # 진입가 대비 +15% 익절 상한
30 take_profit_lower_pct: float = 10.0 # +10% 부터 익절 구간 시작
31 partial_sell_ratio: float = 0.5 # 50% 분할 매도
33 # 자금 관리
34 total_portfolio_krw: int = 10_000_000
35 position_size_pct: float = 5.0
36 min_qty: int = 2 # 분할 매도를 위해 최소 2주
39@dataclass
40class FPPositionState:
41 """첫 눌림목 포지션 추적 상태."""
42 entry_price: int # 진입가
43 entry_date: str # 진입일 (YYYYMMDD)
44 peak_price: int # 진입 후 최고가
45 surge_day_high: int # 급등기 고점 (익절 참조가)
46 partial_sold: bool = False # deprecated (JSON 하위호환용)
47 last_partial_sell_price: int = 0 # 마지막 부분익절 가격 (0=미실행, >0=기준가)