# source: https://raw.githubusercontent.com/DerSalvador/freqtrade-helm-chart/a669dc11b640b0eb63aa8f8b51e9f181fd7ee43c/chart/deployed_strategies/binance-michael-k8s-namespace/wtc.py
# WTC Strategy: WTC(World Trade Center Tabriz)
# is the biggest skyscraper of Tabriz, city of Iran
# (What you want?it not enough for you?that's just it!)
# No, no, I'm kidding. It's also mean Wave Trend with Crosses
# algo by LazyBare(in TradingView) that I reduce it
# signals noise with dividing it to Stoch-RSI indicator.
# Also thanks from discord: @aurax for his/him
# request to making this strategy.
# hope you enjoy and get profit
# Author: @Mablue (Masoud Azizi)
# IMPORTANT: install sklearn befoure you run this strategy:
# pip install sklearn
# github: https://github.com/mablue/
# freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --spaces entry exit --strategy Github_DerSalvador_freqtrade_helm_chart__wtc__20260115_122204
import freqtrade.vendor.qtpylib.indicators as qtpylib
import talib.abstract as ta
from freqtrade.strategy import DecimalParameter
from freqtrade.strategy import IStrategy
from pandas import DataFrame
#
# --- Do not remove these libs ---
import numpy as np  # noqa
import pandas as pd  # noqa
from sklearn import preprocessing
# --------------------------------
# Add your lib to import here

class Github_DerSalvador_freqtrade_helm_chart__wtc__20260115_122204(IStrategy):
    INTERFACE_VERSION = 3
    ################################ SETTINGS ################################
    # 61 trades. 16/0/45 Wins/Draws/Losses.
    # * Avg profit: 132.53%.
    # Median profit: -12.97%.
    # Total profit: 0.80921449 BTC ( 809.21Σ%).
    # Avg duration 4 days, 7:47:00 min.
    # Objective: -15.73417
    # Config:
    # "max_open_trades": 10,
    # "stake_currency": "BTC",
    # "stake_amount": 0.01,
    # "tradable_balance_ratio": 0.99,
    # "timeframe": "30m",
    # "dry_run_wallet": 0.1,
    # Buy hyperspace params:
    entry_params = {'entry_max': 0.9609, 'entry_max0': 0.8633, 'entry_max1': 0.9133, 'entry_min': 0.0019, 'entry_min0': 0.0102, 'entry_min1': 0.6864}
    # Sell hyperspace params:
    exit_params = {'exit_max': -0.7979, 'exit_max0': 0.82, 'exit_max1': 0.9821, 'exit_min': -0.5377, 'exit_min0': 0.0628, 'exit_min1': 0.4461}
    minimal_roi = {'0': 0.30873, '569': 0.16689, '3211': 0.06473, '7617': 0}
    stoploss = -0.128
    ############################## END SETTINGS ##############################
    timeframe = '30m'
    entry_max = DecimalParameter(-1, 1, decimals=4, default=0.4393, space='entry')
    entry_min = DecimalParameter(-1, 1, decimals=4, default=-0.4676, space='entry')
    exit_max = DecimalParameter(-1, 1, decimals=4, default=-0.9512, space='exit')
    exit_min = DecimalParameter(-1, 1, decimals=4, default=0.6519, space='exit')
    entry_max0 = DecimalParameter(0, 1, decimals=4, default=0.4393, space='entry')
    entry_min0 = DecimalParameter(0, 1, decimals=4, default=-0.4676, space='entry')
    exit_max0 = DecimalParameter(0, 1, decimals=4, default=-0.9512, space='exit')
    exit_min0 = DecimalParameter(0, 1, decimals=4, default=0.6519, space='exit')
    entry_max1 = DecimalParameter(0, 1, decimals=4, default=0.4393, space='entry')
    entry_min1 = DecimalParameter(0, 1, decimals=4, default=-0.4676, space='entry')
    exit_max1 = DecimalParameter(0, 1, decimals=4, default=-0.9512, space='exit')
    exit_min1 = DecimalParameter(0, 1, decimals=4, default=0.6519, space='exit')

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # WAVETREND
        try:
            ap = (dataframe['high'] + dataframe['low'] + dataframe['close']) / 3
            esa = ta.EMA(ap, 10)
            d = ta.EMA((ap - esa).abs(), 10)
            ci = (ap - esa).div(0.0015 * d)
            tci = ta.EMA(ci, 21)
            wt1 = tci
            wt2 = ta.SMA(np.nan_to_num(wt1), 4)
            dataframe['wt1'], dataframe['wt2'] = (wt1, wt2)
            stoch = ta.STOCH(dataframe, 14)
            slowk = stoch['slowk']
            dataframe['slowk'] = slowk
            # print(dataframe.iloc[:, 6:].keys())
            x = dataframe.iloc[:, 6:].values  # returns a numpy array
            min_max_scaler = preprocessing.MinMaxScaler()
            x_scaled = min_max_scaler.fit_transform(x)
            dataframe.iloc[:, 6:] = pd.DataFrame(x_scaled)
            # print('wt:\t', dataframe['wt'].min(), dataframe['wt'].max())
            # print('stoch:\t', dataframe['stoch'].min(), dataframe['stoch'].max())
            dataframe['def'] = dataframe['slowk'] - dataframe['wt1']
        # print('def:\t', dataframe['def'].min(), "\t", dataframe['def'].max())
        except:
            dataframe['wt1'], dataframe['wt2'], dataframe['def'], dataframe['slowk'] = (0, 10, 100, 1000)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[qtpylib.crossed_above(dataframe['wt1'], dataframe['wt2']) & dataframe['wt1'].between(self.entry_min0.value, self.entry_max0.value) & dataframe['slowk'].between(self.entry_min1.value, self.entry_max1.value) & dataframe['def'].between(self.entry_min.value, self.entry_max.value), 'enter_long'] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        # print(dataframe['slowk']/dataframe['wt1'])
        dataframe.loc[qtpylib.crossed_below(dataframe['wt1'], dataframe['wt2']) & dataframe['wt1'].between(self.exit_min0.value, self.exit_max0.value) & dataframe['slowk'].between(self.exit_min1.value, self.exit_max1.value) & dataframe['def'].between(self.exit_min.value, self.exit_max.value), 'exit_long'] = 1
        return dataframe