# source: https://raw.githubusercontent.com/klineoxyz/Klineo/1177880dbaec30ad31a3c8f8bf6b13231934b739/services/backtesting/freqtrade/user_data/strategies/KlineoDonchianAtrBreakout.py
# Klineo Backtesting Strategy: Donchian + ATR Breakout
# Timeframe: 15m | Entry: close > donch_high.shift(1) | Exit: close < donch_low.shift(1)

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


class Github_klineoxyz_Klineo__KlineoDonchianAtrBreakout__20260216_191132(IStrategy):
    timeframe = "15m"
    startup_candle_count = 100

    minimal_roi = {"0": 0.04, "120": 0.015, "360": 0.0}
    stoploss = -0.10

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe["donch_high"] = dataframe["high"].rolling(window=20).max()
        dataframe["donch_low"] = dataframe["low"].rolling(window=20).min()
        dataframe["atr"] = ta.ATR(dataframe, timeperiod=14)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Entry: close > previous candle's donchian high
        prev_donch_high = dataframe["donch_high"].shift(1)
        dataframe.loc[
            dataframe["close"] > prev_donch_high,
            "enter_long",
        ] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Exit: close < previous candle's donchian low
        prev_donch_low = dataframe["donch_low"].shift(1)
        dataframe.loc[
            dataframe["close"] < prev_donch_low,
            "exit_long",
        ] = 1
        return dataframe
