# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/smart_money_futures.py
import logging

import freqtrade.vendor.qtpylib.indicators as qtpylib
import pandas as pd
import talib.abstract as ta
from freqtrade.strategy import CategoricalParameter, IntParameter, informative
from freqtrade.strategy.interface import IStrategy
from indicators import smart_money_index, smi_trend
from mixins import SafetyOrderMixin, TrailingTakeProfitMixin
from pandas import DataFrame

logger = logging.getLogger(__name__)


class Github_remiotore_freqtrade__smart_money_futures__20260111_210550(IStrategy):
    INTERFACE_VERSION = 3

    """
    PASTE OUTPUT FROM HYPEROPT HERE
    """

    stoploss = -0.99  # value loaded from strategy
    """
    END HYPEROPT
    """

    can_short: bool = True

    use_exit_signal: bool = True
    exit_profit_only: bool = False
    exit_profit_offset: float = 0.01
    ignore_roi_if_entry_signal: bool = True

    timeframe: str = "5m"

    process_only_new_candles: bool = True
    startup_candle_count: int = 200

    smart_money_index_fast_ma_long = IntParameter(10, 100, default=20, space="buy")
    smart_money_index_slow_ma_long = IntParameter(100, 350, default=150, space="buy")
    smart_money_index_fast_ma_short = IntParameter(10, 100, default=50, space="sell")
    smart_money_index_slow_ma_short = IntParameter(100, 300, default=150, space="sell")

    entry_guard = CategoricalParameter(["ema", "disabled"], default="ema", space="buy")

    @property
    def plot_config(self):
        return {
            "main_plot": {
                "ema50": {
                    "color": "#26a269",
                },
                "ema50_1h": {
                    "color": "#a51d2d",
                },
            },
            "subplots": {
                "smart_money_index": {
                    "smart_money_index": {"color": "#26a269", "type": "line"},
                    f"smart_money_index_fast_ma_long_{self.smart_money_index_fast_ma_long.value}": {
                        "color": "#a51d2d",
                        "type": "line",
                    },
                },
                "smart_money_index_slow": {
                    "smart_money_index_1h": {"color": "#26a269", "type": "line"},
                    f"smart_money_index_slow_ma_long_{self.smart_money_index_slow_ma_long.value}_1h": {
                        "color": "#a51d2d",
                        "type": "line",
                    },
                },
            },
        }

    def populate_smart_money_indicators(self, dataframe: DataFrame) -> DataFrame:
        df = dataframe.copy()
        df = smart_money_index(df)

        frames = [df]

        for val in self.smart_money_index_slow_ma_long.range:
            frames.append(
                DataFrame(
                    {
                        f"smart_money_index_slow_ma_long_{val}": ta.SMA(
                            df["smart_money_index"], val
                        )
                    }
                )
            )

        for val in self.smart_money_index_fast_ma_long.range:
            frames.append(
                DataFrame(
                    {
                        f"smart_money_index_fast_ma_long_{val}": ta.SMA(
                            df["smart_money_index"], val
                        )
                    }
                )
            )

        for val in self.smart_money_index_slow_ma_short.range:
            frames.append(
                DataFrame(
                    {
                        f"smart_money_index_slow_ma_short_{val}": ta.SMA(
                            df["smart_money_index"], val
                        )
                    }
                )
            )

        for val in self.smart_money_index_fast_ma_short.range:
            frames.append(
                DataFrame(
                    {
                        f"smart_money_index_fast_ma_short_{val}": ta.SMA(
                            df["smart_money_index"], val
                        )
                    }
                )
            )

        return pd.concat(frames, axis=1)

    @informative("1h")
    def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe = self.populate_smart_money_indicators(dataframe)
        dataframe["smi"], dataframe["smi_ma"], dataframe["smi_trend"] = smi_trend(
            dataframe
        )
        dataframe["ema50"] = ta.EMA(dataframe, timeperiod=50)
        return dataframe

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe = self.populate_smart_money_indicators(dataframe)
        dataframe["smi"], dataframe["smi_ma"], dataframe["smi_trend"] = smi_trend(
            dataframe
        )
        dataframe["ema50"] = ta.EMA(dataframe, timeperiod=50)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                qtpylib.crossed_above(
                    dataframe["smart_money_index"],
                    dataframe[
                        f"smart_money_index_slow_ma_long_{self.smart_money_index_slow_ma_long.value}"
                    ],
                )
                & (dataframe["volume"] > 0)
                & (dataframe["smi_trend_1h"] != 2)
                & (dataframe["close"] < dataframe["ema50_1h"])
            ),
            ["enter_long", "enter_tag"],
        ] = (1, "smart_money_long")

        dataframe.loc[
            (
                qtpylib.crossed_below(
                    dataframe["smart_money_index"],
                    dataframe[
                        f"smart_money_index_slow_ma_short_{self.smart_money_index_fast_ma_short.value}"
                    ],
                )
                & (dataframe["volume"] > 0)
                & (dataframe["smi_trend_1h"] == 2)
            ),
            ["enter_short", "enter_tag"],
        ] = (1, "smart_money_short")

        return dataframe

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


class SmartMoneyFutures_DCA(SafetyOrderMixin, SmartMoneyFutures):
    pass


class SmartMoneyFutures_DCA_TTP(
    TrailingTakeProfitMixin, SafetyOrderMixin, SmartMoneyFutures
):
    pass
