# source: https://raw.githubusercontent.com/Aeell/Satoshi-Pulse/ed7fa01b371fee35d1285568102dd801aa581e15/src/freqtrade_integration/strategy.py

from freqtrade.strategy import IStrategy
from pandas import DataFrame


class Github_Aeell_Satoshi_Pulse__strategy__20260417_132151(IStrategy):
    timeframe = "1h"
    minimal_roi = {"0": 0.02}
    stoploss = -0.03

    params = {
        "buy_threshold": 60,
        "sell_threshold": 40,
    }

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        from src.analysis.technical import TechnicalAnalyzer

        analyzer = TechnicalAnalyzer()
        dataframe = analyzer.calculate_indicators(dataframe)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        threshold = self.params.get("buy_threshold", 60)

        dataframe.loc[
            (dataframe["rsi"] < 35) & (dataframe["close"] > dataframe["sma_21"]),
            "enter_long",
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        threshold = self.params.get("sell_threshold", 40)

        dataframe.loc[
            (dataframe["rsi"] > 65) | (dataframe["close"] < dataframe["sma_21"]),
            "exit_long",
        ] = 1

        return dataframe


class Github_Aeell_Satoshi_Pulse__strategy__20260417_132151(IStrategy):
    timeframe = "4h"
    minimal_roi = {"0": 0.03}
    stoploss = -0.05

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

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            dataframe["close"] > dataframe["close"].shift(1),
            "enter_long",
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            dataframe["close"] < dataframe["close"].shift(1),
            "exit_long",
        ] = 1

        return dataframe


class Github_Aeell_Satoshi_Pulse__strategy__20260417_132151(IStrategy):
    timeframe = "1h"
    minimal_roi = {"24": 0.01}
    stoploss = -0.02

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

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            dataframe["close"] < dataframe["close"].rolling(20).mean() * 0.95,
            "enter_long",
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            dataframe["close"] > dataframe["close"].rolling(20).mean() * 1.05,
            "exit_long",
        ] = 1

        return dataframe


class Github_Aeell_Satoshi_Pulse__strategy__20260417_132151(IStrategy):
    timeframe = "15m"
    minimal_roi = {"0": 0.015}
    stoploss = -0.025

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        from src.analysis.technical import TechnicalAnalyzer

        analyzer = TechnicalAnalyzer()
        dataframe = analyzer.calculate_indicators(dataframe)

        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe["macd"] > dataframe["macd_signal"])
            & (dataframe["volume"] > dataframe["volume"].rolling(20).mean()),
            "enter_long",
        ] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe["macd"] < dataframe["macd_signal"])
            & (dataframe["volume"] > dataframe["volume"].rolling(20).mean()),
            "exit_long",
        ] = 1

        return dataframe
