# source: https://raw.githubusercontent.com/behradhesami/Projects/5ac4ca3ce403e5ccc9db229f5b32846bf2767a7d/Freqtrade/Stochastic1_1/zemastoch_OPT.py
# Start hyperopt with the following command:
# freqtrade hyperopt --config config.json --hyperopt-loss SharpeHyperOptLoss --strategy RsiStrat -e 500 --spaces  buy sell --random-state 8711

# --- Do not remove these libs ---
import numpy as np  # noqa
import pandas as pd  # noqa
from functools import reduce
from pandas import DataFrame
import pandas_ta as pta
from freqtrade.strategy import (BooleanParameter, CategoricalParameter, DecimalParameter,IStrategy, IntParameter)

# --- Add your lib to import here ---
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib



class Github_behradhesami_Projects__zemastoch_OPT__20240626_142549(IStrategy):
   
    INTERFACE_VERSION = 3

    
    timeframe = '5m'

    minimal_roi = {
        "0":0.015
        }
    buy_params={
        "fastd_period":5,
        "fastk_period":3,
        "stoch_period":14,
        "ema_long_period":50,
        "ema_fast_period":20
     }
   
   


    stoploss = -0.005 
    trailing_stop = False   

    use_exit_signal = True
    exit_profit_only = False
    ignore_roi_if_entry_signal = False

    ema_fast_period = IntParameter(5, 25, default= 20,space ='buy') 
    ema_long_period = IntParameter(25, 50, default=50,space ='buy')
    fastk_period = IntParameter(3, 10, default=int(buy_params['fastk_period']),space="buy")
    fastd_period =IntParameter(5, 15,default=int(buy_params['fastd_period']),space="buy" )
    lenght_period = IntParameter(7, 20, default= int(buy_params['stoch_period']),space="buy" )
    

    
   

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        for val in self.ema_fast_period.range:
            dataframe[f"ema_fast_{val}"] = ta.EMA(dataframe, timeperiod=val)

        for val in self.ema_long_period.range:
            dataframe[f"ema_long_{val}"] = ta.EMA(dataframe, timeperiod=val)
#-------------------------------------------------------------------------------------
        for val in self.lenght_period.range:    
            for val_1 in self.fastk_period.range:
                for val_2 in self.fastd_period.range:
                    dataframe[f'fastk_{val}{val_1}_{val_2}'] = ta.STOCHRSI(dataframe,timeperiod = val,fastk_period=val_1, fastd_period=val_2, fastd_matype=0)['fastk']
                    dataframe[f'fastd_{val}{val_1}_{val_2}'] = ta.STOCHRSI(dataframe,timeperiod = val,fastk_period=val_1, fastd_period=val_2, fastd_matype=0)['fastd'] 
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# enter Long
        conditions_long = []
        conditions_short = []

        conditions_long.append(qtpylib.crossed_below(
                dataframe[f'ema_fast_{self.ema_fast_period.value}'],
                dataframe[f'ema_long_{self.ema_long_period.value}'],
            ))

            
        conditions_long.append(
             dataframe[f'fastd_{self.lenght_period.value}_{self.fastk_period.value}_{self.fastd_period.value}'] 
             < dataframe[f'fastk_{self.lenght_period.value}_{self.fastk_period.value}_{self.fastd_period.value}']
        )
        


# enter Short
        conditions_short.append(qtpylib.crossed_above(
                dataframe[f'ema_fast_{self.ema_fast_period.value}'],
                dataframe[f'ema_long_{self.ema_long_period.value}'],
            ))

        conditions_short.append(
           dataframe[f'fastd_{self.lenght_period.value}_{self.fastk_period.value}_{self.fastd_period.value}'] 
             > dataframe[f'fastk_{self.lenght_period.value}_{self.fastk_period.value}_{self.fastd_period.value}']
        )


        dataframe.loc[
            reduce(lambda x, y: x & y, conditions_long),
            "enter_long",
        ] = 1

        dataframe.loc[
            reduce(lambda x, y: x & y, conditions_short),
            "enter_short",
        ] = 1

        return dataframe
        
    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        conditions_long =[]
        conditions_short = []
#EXIT long
        conditions_long.append(qtpylib.crossed_above(
            dataframe[f'ema_fast_{self.ema_fast_period.value}'],
            dataframe[f'ema_long_{self.ema_long_period.value}'],
            ))

#EXIT short
        conditions_short.append(qtpylib.crossed_below(
            dataframe[f'ema_fast_{self.ema_fast_period.value}'],
            dataframe[f'ema_long_{self.ema_long_period.value}'],
            ))

        conditions_long.append(dataframe['volume'] > 0)

        if conditions_long:
            dataframe.loc[
                reduce(lambda x, y: x & y, conditions_long),
                "exit_long" ] = 1
                   
        conditions_short.append(dataframe['volume'] > 0)
        if conditions_short:
            dataframe.loc[
                reduce(lambda x, y: x & y, conditions_short),
                "exit_short"] = 1
                
      
        
        return dataframe
        

