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

1# strategies/first_pullback_types.py 

2from dataclasses import dataclass 

3from strategies.base_strategy_config import BaseStrategyConfig 

4 

5 

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 우상향 연속 일수 

17 

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 # 거래량 고갈 비교 기간 

23 

24 # Phase 3: Trigger (매수 방아쇠) 

25 execution_strength_min: float = 100.0 # 체결강도 >= 100% 

26 

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% 분할 매도 

32 

33 # 자금 관리 

34 total_portfolio_krw: int = 10_000_000 

35 position_size_pct: float = 5.0 

36 min_qty: int = 2 # 분할 매도를 위해 최소 2주 

37 

38 

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=기준가)