# source: https://raw.githubusercontent.com/telzee001/Telzee-V14/5f716043b6b3c4329fbba1e260d103a985fddcb2/TelzeeV14.py
# directory_url: https://github.com/telzee001/Telzee-V14/blob/main//
# User: telzee001
# Repository: Telzee-V14
# --------------------
from freqtrade.strategy import IStrategy
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
import numpy as np

class Github_telzee001_Telzee_V14__TelzeeV14__20260825_105654(IStrategy):
    INTERFACE_VERSION = 3
    leverage = 20
    base_risk_pct = 10.0
    safety_risk_pct = 2.0
    tp_multiplier = 2.5
    atr_length = 14
    minimal_roi = {"0": 100}
    stoploss = -1.0
    trailing_stop = True
    timeframe = '15m'
    process_only_new_candles = True
    use_exit_signal = True

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe['ema4h'] = ta.EMA(dataframe, timeperiod=200)
        dataframe['ema1h'] = ta.EMA(dataframe, timeperiod=200)
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['vwap'] = qtpylib.vwap(dataframe)
        dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
        dataframe['vol_ma'] = ta.SMA(dataframe['volume'], timeperiod=20)
        dataframe['vol_spike'] = dataframe['volume'] > (dataframe['vol_ma'] * 1.3)
        dataframe['upper_fractal'] = dataframe['high'].rolling(window=5).max().shift(1)
        dataframe['lower_fractal'] = dataframe['low'].rolling(window=5).min().shift(1)
        dataframe['momentum_ok'] = dataframe['close'] > dataframe['close'].shift(1)
        dataframe['atr'] = ta.ATR(dataframe, timeperiod=self.atr_length)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[(dataframe['close'] > dataframe['ema4h']) & (dataframe['close'] > dataframe['ema1h']) & (dataframe['close'] > dataframe['vwap']) & (dataframe['close'] > dataframe['upper_fractal']) & (dataframe['rsi'] < 68) & (dataframe['adx'] > 25) & (dataframe['vol_spike']) & (dataframe['momentum_ok']), 'enter_long'] = 1
        dataframe.loc[(dataframe['close'] < dataframe['ema4h']) & (dataframe['close'] < dataframe['ema1h']) & (dataframe['close'] < dataframe['vwap']) & (dataframe['close'] < dataframe['lower_fractal']) & (dataframe['rsi'] > 32) & (dataframe['adx'] > 25) & (dataframe['vol_spike']) & (dataframe['momentum_ok']), 'enter_short'] = 1
        return dataframe

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

    def leverage(self, *args, **kwargs) -> float:
        return float(self.leverage)
