# source: https://raw.githubusercontent.com/bflc888/crypto-grid-trading-bot/b6aa4789ccdefba720c45159844d8b0155de4400/user_data/strategies/GridStrategy.py
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta
from datetime import timedelta

class Github_bflc888_crypto_grid_trading_bot__GridStrategy__20260704_214202(IStrategy):
    """
    网格交易策略 - 自动高抛低吸
    """
    INTERFACE_VERSION = 3
    
    # 买入信号参数
    minimal_roi = {
        "0": 0.10  # 目标收益 10%
    }
    
    # 止损
    stoploss = -0.05  # 止损 5%
    
    # 时间框架
    timeframe = '5m'
    
    # 交易对
    can_short = False
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        计算技术指标
        """
        # 计算 RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        
        # 计算移动平均线
        dataframe['sma_20'] = ta.SMA(dataframe, timeperiod=20)
        dataframe['sma_50'] = ta.SMA(dataframe, timeperiod=50)
        
        # 计算 Bollinger Band（布林带）
        dataframe['bb_lower'] = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2, nbdevdn=2)[0]
        dataframe['bb_middle'] = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2, nbdevdn=2)[1]
        dataframe['bb_upper'] = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2, nbdevdn=2)[2]
        
        return dataframe
    
    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        网格买入信号 - 价格触及下轨时买入
        """
        dataframe.loc[
            (
                (dataframe['close'] < dataframe['bb_lower']) &  # 价格低于布林带下轨
                (dataframe['rsi'] < 30) &  # RSI 超卖
                (dataframe['volume'] > 0)
            ),
            'enter_long'] = 1
        
        return dataframe
    
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        网格卖出信号 - 价格触及上轨时卖出
        """
        dataframe.loc[
            (
                (dataframe['close'] > dataframe['bb_upper']) |  # 价格高于布林带上轨
                (dataframe['rsi'] > 70)  # RSI 超买
            ),
            'exit_long'] = 1
        
        return dataframe