# source: https://raw.githubusercontent.com/joocy75-hash/TradingView-Strategy/4fe4fc89d84f2c311fa332d5cd3221760826df2a/freqtrade/user_data/strategies/RsiOversoldBounceStrategy.py
"""
RSI Oversold Bounce Strategy - Buy when RSI < 30

Generated by TradingView Strategy Research Lab
Date: 2026-01-19 13:42:17
Original Strategy: RSI Oversold Bounce

Backtest Results:
- Win Rate: 60.0%
- Profit Factor: 2.10
- Max Drawdown: 8.0%
"""

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


class Github_joocy75_hash_TradingView_Strategy__RsiOversoldBounceStrategy__20260124_154927(IStrategy):
    """
    RSI Oversold Bounce Strategy - Buy when RSI < 30
    """
    
    # 전략 설정
    INTERFACE_VERSION = 3
    
    # 타임프레임
    timeframe = '1h'
    
    # 리스크 관리
    stoploss = -0.03
    trailing_stop = True
    trailing_stop_positive = 0.01
    trailing_stop_positive_offset = 0.02
    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
    }
    
    # 최적화 가능한 파라미터
    rsi_period = IntParameter(5, 34, default=14, space='buy')
    sma_period = IntParameter(190, 220, default=200, space='buy')
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        지표 계산
        """
        dataframe['rsi'] = ta.RSI(dataframe["close"], timeperiod=14)
        dataframe['sma'] = ta.SMA(dataframe["close"], timeperiod=200)
        
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        진입 조건
        """
        dataframe.loc[
            (dataframe['rsi'] < 30)
            & (dataframe['rsi'].shift(1) >= 30)
            & (dataframe['close'] > dataframe['sma'])
            ,
            'enter_long'] = 1
        
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        청산 조건
        """
        dataframe.loc[
            (dataframe['rsi'] > 70)
            ,
            'exit_long'] = 1
        
        return dataframe
