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

import freqtrade.vendor.qtpylib.indicators as qtpylib
import pandas as pd
import talib.abstract as ta
from freqtrade.strategy import IntParameter, informative
from freqtrade.strategy.interface import IStrategy
from indicators import premium_stochastic_oscillator
from pandas import DataFrame

logger = logging.getLogger(__name__)


class Github_remiotore_freqtrade__pso__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 = 32

    Github_remiotore_freqtrade__pso__20260111_210550_length_buy = IntParameter(1, 60, default=32, space="buy")
    Github_remiotore_freqtrade__pso__20260111_210550_length_sell = IntParameter(1, 60, default=32, space="sell")

    @property
    def plot_config(self):
        return {
            "main_plot": {
                "ema50": {
                    "color": "#26a269",
                },
                "ema50_1h": {
                    "color": "#a51d2d",
                },
            },
            "subplots": {
                "Github_remiotore_freqtrade__pso__20260111_210550": {"Github_remiotore_freqtrade__pso__20260111_210550": {"color": "#26a269", "type": "line"}},
            },
        }

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

        frames = [df]

        for val in self.Github_remiotore_freqtrade__pso__20260111_210550_length_buy.range:
            frames.append(premium_stochastic_oscillator(frames, period=val))

        for val in self.Github_remiotore_freqtrade__pso__20260111_210550_length_sell.range:
            frames.append(
                frames.append(premium_stochastic_oscillator(frames, period=val))
            )

        return pd.concat(frames, axis=1)

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

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe = self.populate_Github_remiotore_freqtrade__pso__20260111_210550_indicators(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
