# source: https://raw.githubusercontent.com/yccodr/py-trade/59c9e19afa974e56b6e903409dfe0cf1cd17d8ce/strategies/alligator.py
import pandas as pd
from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame

# /Users/michael/Development/personal/trade/user_data/strategies/alligator.py

import talib.abstract as ta


class Github_yccodr_py_trade__alligator__20250117_180311(IStrategy):
    INTERFACE_VERSION = 2

    minimal_roi = {"0": 100}

    stoploss = -0.99

    timeframe = "1h"

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # Alligator Indicator
        dataframe["jaw"] = pd.Series(ta.SMA(dataframe["close"], timeperiod=13)).shift(8)
        dataframe["teeth"] = pd.Series(ta.SMA(dataframe["close"], timeperiod=8)).shift(
            5
        )
        dataframe["lips"] = pd.Series(ta.SMA(dataframe["close"], timeperiod=5)).shift(3)

        # Big Alligator Indicator (twice longer timeframe)
        dataframe["big_jaw"] = pd.Series(
            ta.SMA(dataframe["close"], timeperiod=26)
        ).shift(16)
        dataframe["big_teeth"] = pd.Series(
            ta.SMA(dataframe["close"], timeperiod=16)
        ).shift(10)
        dataframe["big_lips"] = pd.Series(
            ta.SMA(dataframe["close"], timeperiod=10)
        ).shift(6)

        # ADX Indicator
        dataframe["adx"] = ta.ADX(dataframe)

        # Market Trend Indicator (e.g., 200-period SMA)
        dataframe["market_trend"] = ta.SMA(dataframe["close"], timeperiod=200)

        # Chande Momentum Oscillator (ChandeMO)
        dataframe["chandemo"] = ta.CMO(dataframe["close"], timeperiod=14)

        # Stochastic RSI
        (dataframe["srsi"], _) = ta.STOCHRSI(dataframe["close"])

        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe["lips"] > dataframe["teeth"])
                & (dataframe["teeth"] > dataframe["jaw"])
                & (dataframe["big_lips"] > dataframe["big_teeth"])
                & (dataframe["big_teeth"] > dataframe["big_jaw"])
                & (dataframe["adx"] > 25)  # Example condition using ADX
                & (
                    dataframe["close"] > dataframe["market_trend"]
                )  # Ensure trading in the direction of the overall trend
                & (dataframe["chandemo"] > 50)
                & (dataframe["srsi"] < 20)
            ),
            "enter_long",
        ] = 1
        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe["lips"] < dataframe["teeth"])
                & (dataframe["teeth"] < dataframe["jaw"])
                & (dataframe["big_lips"] < dataframe["big_teeth"])
                & (dataframe["big_teeth"] < dataframe["big_jaw"])
                & (dataframe["adx"] > 25)  # Example condition using ADX
                & (
                    dataframe["close"] < dataframe["market_trend"]
                )  # Ensure trading in the direction of the overall trend
                & (dataframe["chandemo"] < -50)
                & (dataframe["srsi"] > 80)
            ),
            "exit_long",
        ] = 1
        return dataframe
