# source: https://raw.githubusercontent.com/sanweisg/jadebot/7f10332553b784bf5846ebc7056b2d4c7d04c917/user_data/strategies/OptimizedRSI.py
# directory_url: https://github.com/sanweisg/jadebot/blob/main/user_data/strategies/
# User: sanweisg
# Repository: jadebot
# --------------------from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta


class Github_sanweisg_jadebot__OptimizedRSI__20261025_174729(IStrategy):
    """
    优化的RSI策略 - 用于Hyperopt调参
    """
    
    # 策略参数范围（供Hyperopt优化）
    buy_rsi_fast = 30
    buy_rsi = 35
    
    sell_rsi = 70
    sell_rsi_fast = 80
    
    buy_ma_offset = 97
    sell_ma_offset = 100
    
    buy_ma_time = 3
    sell_ma_time = 3
    
    buy_rsi_time = 4
    sell_rsi_time = 4
    
    stoploss = -0.10
    trailing_stop = False
    timeframe = '1h'
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # RSI计算
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=self.buy_rsi_time)
        dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=self.buy_rsi_time // 2)
        
        # 移动平均线
        dataframe['ma{}'.format(self.buy_ma_time)] = ta.SMA(dataframe, timeperiod=self.buy_ma_time)
        dataframe['ma{}'.format(self.sell_ma_time)] = ta.SMA(dataframe, timeperiod=self.sell_ma_time)
        
        return dataframe
    
    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['rsi'] < self.buy_rsi) &
                (dataframe['rsi_fast'] < self.buy_rsi_fast) &
                (dataframe['close'] < dataframe['ma{}'.format(self.buy_ma_time)] * (self.buy_ma_offset / 100))
            ),
            'buy'] = 1
        
        return dataframe
    
    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['rsi'] > self.sell_rsi) &
                (dataframe['rsi_fast'] > self.sell_rsi_fast) &
                (dataframe['close'] > dataframe['ma{}'.format(self.sell_ma_time)] * (self.sell_ma_offset / 100))
            ),
            'sell'] = 1
        
        return dataframe
