# source: https://raw.githubusercontent.com/Jeonseol00/openclaw-trading-ai/23408a13a3e6dfefe2ae24a17a38b8011c708e35/strategies/RSI_EMA.py
# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
# flake8: noqa: F401
# isort: skip_file
# --- Do not remove these libs ---
import numpy as np
import pandas as pd
from datetime import datetime
from typing import Dict, Optional, Union, Tuple

from freqtrade.strategy import IStrategy
import talib.abstract as ta
import pandas_ta as pta

class Github_Jeonseol00_openclaw_trading_ai__RSI_EMA__20260323_034334(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = '15m'
    can_short = True
    
    # minimal_roi defines profit targets: 
    # e.g., sell when 5% profit is reached at any time, 
    # 2% after 30 minutes, 1% after 60 mins.
    minimal_roi = {
        "0": 0.05,
        "30": 0.02,
        "60": 0.01,
        "120": 0
    }
    
    # stoploss - set to -15% to allow breathing room for futures
    stoploss = -0.15
    trailing_stop = True
    trailing_stop_positive = 0.02
    trailing_stop_positive_offset = 0.04
    trailing_only_offset_is_reached = True

    process_only_new_candles = True
    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = False

    startup_candle_count: int = 200

    def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['ema200'] = ta.EMA(dataframe, timeperiod=200)
        return dataframe

    def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
        dataframe.loc[
            (
                (dataframe['rsi'] < 40) &
                (dataframe['close'] > dataframe['ema200']) 
            ),
            'enter_long'] = 1

        dataframe.loc[
            (
                (dataframe['rsi'] > 60) &
                (dataframe['close'] < dataframe['ema200']) 
            ),
            'enter_short'] = 1

        return dataframe

    def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
        dataframe.loc[
            (
                (dataframe['rsi'] > 70)
            ),
            'exit_long'] = 1

        dataframe.loc[
            (
                (dataframe['rsi'] < 30)
            ),
            'exit_short'] = 1

        return dataframe
