# source: https://raw.githubusercontent.com/genhack/ft_my/1f583dc75b2081c9c261211952916733a98e8617/mod.py
from freqtrade.strategy import IStrategy , merge_informative_pair
import pandas as pd
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
import technical.indicators as ftt


def pivots_points(dataframe: pd.DataFrame , timeperiod=1 , levels=4) -> pd.DataFrame:
    data = {}
    low = qtpylib.rolling_mean(
        series=pd.Series(index=dataframe.index , data=dataframe["low"]) , window=timeperiod
    )
    high = qtpylib.rolling_mean(
        series=pd.Series(index=dataframe.index , data=dataframe["high"]) , window=timeperiod
    )

    # Pivot
    data["pivot"] = qtpylib.rolling_mean(series=qtpylib.typical_price(dataframe) , window=timeperiod)
    # R1 = PP + 0.382 * (HIGHprev - LOWprev) ... fibonacci
    data["r1"] = data['pivot'] + 0.382 * (high - low)
    data["rS1"] = data['pivot'] + 0.0955 * (high - low)
    # Resistance #2
    # S1 = PP - 0.382 * (HIGHprev - LOWprev) ... fibonacci
    data["s1"] = data["pivot"] - 0.382 * (high - low)
    data["sR1"] = data["pivot"] - 0.1955 * (high - low)
    # Calculate Resistances and Supports >1
    for i in range(2 , levels + 1):
        prev_support = data["s" + str(i - 1)]
        prev_resistance = data["r" + str(i - 1)]
        # Resitance
        data["r" + str(i)] = (data["pivot"] - prev_support) + prev_resistance
        # Support
        data["s" + str(i)] = data["pivot"] - (prev_resistance - prev_support)
    return pd.DataFrame(index=dataframe.index , data=data)


class github_genhack_ft_my__mod__20220311_203333(IStrategy):
    # Optimal timeframe for the strategy
    timeframe = '5m'

    # generate signals from the 1h timeframe
    informative_timeframe = '1h'
    process_only_new_candles = False
    buy_params = {
        'buy-rsi': 70
    }

    minimal_roi = {
        "0": 7
    }

    # Stoploss:
    stoploss = -0.03

    plot_config = {
        'main_plot': {
            'close_pr1': {'color': 'brown'} ,
            'high_pr1': {'color': 'green'} ,
            'pivot': {'color': 'orange'} ,
            'r1': {'color': 'red'} ,
            'ema5': {'color': 'blue'} ,
            'ema10': {'color': 'pink'} ,
            'ema60': {'color': 'yellow'} ,
            'ema200': {'color': 'grey'} ,
            'rS1': {'color': 'blue'} ,
            'sR1': {'color': 'green'} ,
            's1': {'color': 'black'}
        } ,
        'subplots': {
            "SRSI": {
                'srsi_k': {'color': 'blue'} ,
                'srsi_d': {'color': 'red'} ,
            } ,
            "ATR": {
                'atr': {'color': 'blue'} ,
            } ,
            "RSI": {
                'rsi': {'color': 'blue'} ,
            } ,
        }
    }

    def informative_pairs(self):
        pairs = self.dp.current_whitelist()
        informative_pairs = [(pair , self.informative_timeframe)
                             for pair in pairs]
        if self.dp:
            for pair in pairs:
                informative_pairs += [(pair , "1d")]

        return informative_pairs

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

        dataframe1d = self.dp.get_pair_dataframe(
            pair=metadata['pair'] , timeframe="1d")

        # Pivots Points
        pp = pivots_points(dataframe1d)
        dataframe['pivot'] = pp['pivot']
        dataframe['r1'] = pp['r1']
        dataframe['s1'] = pp['s1']
        dataframe['rS1'] = pp['rS1']
        dataframe['sR1'] = pp['sR1']

        # Definiamo H e C giorno prima
        dataframe['close_pr1'] = dataframe1d['close']
        dataframe['high_pr1'] = dataframe1d['high']

        dataframe = merge_informative_pair(
            dataframe , dataframe1d , self.timeframe , "1d" , ffill=True)

        dataframe['ema5'] = ta.EMA(dataframe , timeperiod=5)
        dataframe['ema10'] = ta.EMA(dataframe , timeperiod=10)
        dataframe['ema60'] = ta.EMA(dataframe , timeperiod=60)
        dataframe['ema220'] = ta.EMA(dataframe , timeperiod=220)
        dataframe['atr'] = ta.ATR(dataframe , timeperiod=14)
        dataframe['rsi'] = ta.RSI(dataframe , timeperiod=14)
        # RSI
        period = 14
        smoothD = 3
        SmoothK = 3
        stochrsi = (dataframe['rsi'] - dataframe['rsi'].rolling(period).min()) / (
                    dataframe['rsi'].rolling(period).max() - dataframe['rsi'].rolling(period).min())
        dataframe['srsi_k'] = stochrsi.rolling(SmoothK).mean() * 100
        dataframe['srsi_d'] = dataframe['srsi_k'].rolling(smoothD).mean()

        # Start Trading

        dataframe['pivots_ok'] = (
                (dataframe['ema5'] > dataframe['ema10'])
                &
                (dataframe['ema5'] > dataframe['high_pr1'])
                &
                (dataframe['volume'] > dataframe['volume'].shift(2))
                &
                (dataframe['ema60'] < dataframe['high_pr1'])
                &
                (qtpylib.crossed_above(dataframe['rsi'] , params['buy-rsi'])
        ).astype('int')


            # # Stiamo Salendo
            # (dataframe['close_pr1'] > dataframe['pivot']) &
            # #(dataframe['close'] > dataframe['ema220']) &
            # (dataframe['ema60'] > dataframe['ema220']) &
            # #(dataframe['pivot'] > dataframe['ema60']) & #Per ora lasciamo ?!
            # # (dataframe['ema60'] > dataframe['pivot']) &
            # # Catch The Pump!
            # #(dataframe['ema10'] > dataframe['ema60']) &
            #
            # # (dataframe['open'] > dataframe['close_pr1'])
            # # |
            # #(dataframe['close'] >= dataframe['pivot'])
            # #&
            # #(dataframe['ema5'] > dataframe['ema10']) &
            # # qtpylib.crossed_above(dataframe['ema5'] , dataframe['close_pr1'])
            # # |
            # qtpylib.crossed_above(dataframe['ema10'], dataframe['rS1'])
            # #(dataframe['ema10'] >= dataframe['rS1'])

        dataframe['trending_over'] = (
            (
            (dataframe['ema10'] > dataframe['ema5'])
            )
            |
            (
            qtpylib.crossed_above(dataframe['ema60'] , dataframe['ema5'])
            )
            |
            (
            qtpylib.crossed_above(dataframe['ema60'] , dataframe['ema10'])  # Need some test...
            )
        ).astype('int')

        return dataframe

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

        dataframe = self.slow_tf_indicators(dataframe , metadata)

        return dataframe

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

        dataframe.loc[
            (
                (dataframe['pivots_ok'] > 0)
            ) , 'buy'] = 1
        return dataframe

    def populate_sell_trend(self , dataframe: DataFrame , metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['trending_over'] > 0)
            ) , 'sell'] = 1
        return dataframe
