# source: https://raw.githubusercontent.com/fede0429/freqtrade-config/907aa82b4aee9de06c3a5a880b481906b5f1c094/strategies/experimental/EnsembleFinalStrategy.py
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta


class Github_fede0429_freqtrade_config__EnsembleFinalStrategy__20260312_173224(IStrategy):
    """
    Ensemble 最终版 - 主从增强模式
    
    核心逻辑：
    - 主策略：UniversalMACD（独立触发，胜率 100% 已验证）
    - 辅助：Volume 作为仓位/止盈增强（非必须）
    
    入场：UMACD 信号独立触发
    出场：ROI 阶梯 + UMACD 死叉
    """
    
    INTERFACE_VERSION = 3
    
    timeframe = '15m'
    max_open_trades = 2
    can_short = False
    
    # ROI - 使用 UniversalMACD 验证过的最优参数
    minimal_roi = {
        "0": 0.221,     # 22.1%
        "49": 0.057,    # 5.7%
        "160": 0.015,   # 1.5%
        "394": 0
    }
    
    stoploss = -0.341
    trailing_stop = False
    
    # UMACD 参数（验证过 100% 胜率）
    buy_umacd_min = -0.03273
    buy_umacd_max = -0.01887
    
    startup_candle_count = 200
    
    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # UMACD
        ema12 = ta.EMA(dataframe, timeperiod=12)
        ema26 = ta.EMA(dataframe, timeperiod=26)
        dataframe['umacd'] = (ema12 / ema26) - 1
        dataframe['umacd_signal'] = ta.EMA(dataframe['umacd'], timeperiod=9)
        
        # Volume（仅用于增强分析，非必须）
        dataframe['volume_ma'] = dataframe['volume'].rolling(window=20).mean()
        dataframe['vol_ratio'] = dataframe['volume'] / dataframe['volume_ma']
        
        # RSI
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        
        return dataframe
    
    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """UMACD 独立触发（已验证 100% 胜率）"""
        conditions = []
        
        # UMACD 金叉买入（严格区间）
        conditions.append(
            (dataframe['umacd'] > self.buy_umacd_min) &
            (dataframe['umacd'] < self.buy_umacd_max) &
            (dataframe['umacd'] > dataframe['umacd_signal'])
        )
        
        # RSI 过滤（避免极端超买）
        conditions.append(dataframe['rsi'] < 80)
        
        if conditions:
            dataframe.loc[
                conditions[0] & conditions[1],
                'buy'
            ] = 1
        
        return dataframe
    
    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """UMACD 死叉或 RSI 超买"""
        conditions = []
        
        # UMACD 死叉
        conditions.append(
            (dataframe['umacd'] > -0.02323) &
            (dataframe['umacd'] < -0.00707) &
            (dataframe['umacd'] < dataframe['umacd_signal'])
        )
        
        # RSI 超买
        conditions.append(dataframe['rsi'] > 85)
        
        if conditions:
            dataframe.loc[conditions[0] | conditions[1], 'sell'] = 1
        
        return dataframe
