# source: https://raw.githubusercontent.com/joocy75-hash/TradingView-Strategy/6bec559d180e0df1112dde85037b93e21ac5c8f9/freqtrade/user_data/strategies/SampleStrategy.py
"""
SMA Crossover Strategy

Generated by TradingView Strategy Research Lab
Date: 2026-01-13

Simple Moving Average Crossover Strategy
- Fast SMA: 20
- Slow SMA: 50
- Entry: Fast SMA crosses above Slow SMA
- Exit: Fast SMA crosses below Slow SMA
"""

from freqtrade.strategy import IStrategy, IntParameter
from pandas import DataFrame
import talib.abstract as ta


class Github_joocy75_hash_TradingView_Strategy__SampleStrategy__20260113_034943(IStrategy):
    """
    SMA Crossover Strategy
    
    검증된 기본 전략 - 드라이런 테스트용
    """
    
    # 전략 설정
    INTERFACE_VERSION = 3
    
    # 타임프레임
    timeframe = '1h'
    
    # 리스크 관리
    stoploss = -0.05  # -5%
    trailing_stop = True
    trailing_stop_positive = 0.01  # +1%에서 트레일링 시작
    trailing_stop_positive_offset = 0.02  # +2% 오프셋
    trailing_only_offset_is_reached = True
    
    # ROI 테이블
    minimal_roi = {
        "0": 0.10,    # 즉시 10% 수익 시 청산
        "30": 0.05,   # 30분 후 5% 수익 시 청산
        "60": 0.025,  # 1시간 후 2.5% 수익 시 청산
        "120": 0.01,  # 2시간 후 1% 수익 시 청산
    }
    
    # 주문 설정
    order_types = {
        'entry': 'limit',
        'exit': 'limit',
        'stoploss': 'market',
        'stoploss_on_exchange': True
    }
    
    # 최적화 가능한 파라미터
    fast_period = IntParameter(10, 30, default=20, space='buy')
    slow_period = IntParameter(30, 100, default=50, space='buy')
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        지표 계산
        """
        # SMA
        dataframe['sma_fast'] = ta.SMA(dataframe['close'], timeperiod=self.fast_period.value)
        dataframe['sma_slow'] = ta.SMA(dataframe['close'], timeperiod=self.slow_period.value)
        
        # RSI (필터용)
        dataframe['rsi'] = ta.RSI(dataframe['close'], timeperiod=14)
        
        # Volume
        dataframe['volume_mean'] = dataframe['volume'].rolling(20).mean()
        
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        진입 조건
        """
        dataframe.loc[
            (
                # SMA 골든 크로스
                (dataframe['sma_fast'] > dataframe['sma_slow']) &
                (dataframe['sma_fast'].shift(1) <= dataframe['sma_slow'].shift(1)) &
                
                # RSI 필터 (과매수 아닐 때)
                (dataframe['rsi'] < 70) &
                
                # 거래량 필터
                (dataframe['volume'] > dataframe['volume_mean'])
            ),
            'enter_long'] = 1
        
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        청산 조건
        """
        dataframe.loc[
            (
                # SMA 데드 크로스
                (dataframe['sma_fast'] < dataframe['sma_slow']) &
                (dataframe['sma_fast'].shift(1) >= dataframe['sma_slow'].shift(1))
            ),
            'exit_long'] = 1
        
        return dataframe
