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


class LQ45OptimizedStrategy(IStrategy):
    """
    Reference Freqtrade strategy for the CuanTrade LQ45-Optimized framework.

    Signals:
      - Trend filter: EMA fast crosses above EMA slow
      - Momentum confirmation: RSI above neutral
      - Participation filter: volume above its moving average

    Risk notes:
      - This is a reference implementation for research and backtesting.
      - Tune timeframe, ROI table, and protections for your venue and pair list.
    """

    timeframe = "1h"
    process_only_new_candles = True
    startup_candle_count = 200

    minimal_roi = {
        "0": 0.04,
        "60": 0.025,
        "180": 0.012,
        "360": 0.0,
    }

    stoploss = -0.08

    trailing_stop = True
    trailing_stop_positive = 0.015
    trailing_stop_positive_offset = 0.03
    trailing_only_offset_is_reached = True

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe["ema_fast"] = ta.EMA(dataframe, timeperiod=21)
        dataframe["ema_slow"] = ta.EMA(dataframe, timeperiod=55)
        dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
        dataframe["atr"] = ta.ATR(dataframe, timeperiod=14)
        dataframe["volume_sma"] = ta.SMA(dataframe["volume"], timeperiod=20)
        dataframe["trend_strength"] = (dataframe["ema_fast"] - dataframe["ema_slow"]) / dataframe["close"]
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions = []
        conditions.append(dataframe["ema_fast"] > dataframe["ema_slow"])
        conditions.append(dataframe["rsi"] > 55)
        conditions.append(dataframe["volume"] > dataframe["volume_sma"])
        conditions.append(dataframe["close"] > dataframe["ema_slow"])

        if conditions:
            dataframe.loc[
                conditions[0] & conditions[1] & conditions[2] & conditions[3],
                "enter_long",
            ] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions = []
        conditions.append(dataframe["ema_fast"] < dataframe["ema_slow"])
        conditions.append(dataframe["rsi"] < 45)
        conditions.append(dataframe["close"] < dataframe["ema_fast"])

        if conditions:
            dataframe.loc[
                conditions[0] | conditions[1] | conditions[2],
                "exit_long",
            ] = 1
        return dataframe
