# source: https://raw.githubusercontent.com/GoLukeEnviro/trading-hub/a20e8f66de687fa112152e48369055dd9fc806d6/freqtrade/bots/regime-hybrid/user_data/strategies/golden_cross_daily_v1.py
"""
Github_GoLukeEnviro_trading_hub__golden_cross_daily_v1__20260603_010621 — Daily Trend Following

Entry: EMA50 crosses above EMA200 (golden cross)
Regime: BTC > EMA200 (bear market protection)
Exit: ROI/Stoploss only

Pairs: BTC/USDT, ETH/USDT, SOL/USDT
"""
import talib.abstract as ta
from freqtrade.strategy import IStrategy
from pandas import DataFrame


class Github_GoLukeEnviro_trading_hub__golden_cross_daily_v1__20260603_010621(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = "1d"
    can_short = False

    stoploss = -0.12
    use_custom_stoploss = False
    trailing_stop = False
    process_only_new_candles = True

    minimal_roi = {
        "0": 0.25,      # 25% — quick strong move
        "30": 0.15,     # 30 days — 15%
        "60": 0.08,     # 60 days — 8%
        "90": 0,        # 90 days — breakeven
    }

    startup_candle_count = 200
    max_open_trades = 2

    @property
    def protections(self):
        return [
            {"method": "CooldownPeriod", "stop_duration_candles": 10},
            {"method": "StoplossGuard", "lookback_period_candles": 30,
             "trade_limit": 1, "stop_duration_candles": 30},
        ]

    def informative_pairs(self):
        return [("BTC/USDT", "1d")]

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Get BTC data for macro regime filter
        if self.dp:
            btc_data = self.dp.get_pair_dataframe("BTC/USDT", "1d")
            btc_ema200 = ta.EMA(btc_data["close"], timeperiod=200)
            dataframe["btc_price"] = btc_data["close"]
            dataframe["btc_ema200"] = btc_ema200
            dataframe["btc_bull"] = dataframe["btc_price"] > dataframe["btc_ema200"]

        # Pair indicators
        dataframe["ema50"] = ta.EMA(dataframe["close"], timeperiod=50)
        dataframe["ema200"] = ta.EMA(dataframe["close"], timeperiod=200)
        dataframe["ema50_above_ema200"] = dataframe["ema50"] > dataframe["ema200"]
        dataframe["golden_cross"] = (
            (dataframe["ema50"] > dataframe["ema200"]) &
            (dataframe["ema50"].shift(1) <= dataframe["ema200"].shift(1))
        )

        # ADX for trend quality
        dataframe["adx"] = ta.ADX(dataframe, timeperiod=14)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        macro_ok = dataframe.get("btc_bull", True)

        entry = (
            macro_ok &
            dataframe["golden_cross"] &
            (dataframe["adx"] > 20)
        )
        dataframe.loc[entry, "enter_long"] = 1
        dataframe.loc[entry, "enter_tag"] = "golden_cross"
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        return dataframe
