from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame

class ichi_short_term_infor(IStrategy):
    INTERFACE_VERSION = 3

    minimal_roi = {
        "0": 0.025
    }

    stoploss = -0.05
    timeframe = '5m'
    informative_timeframe = '1h'

    def ichimoku_cloud(self, dataframe: DataFrame) -> DataFrame:
        high_9 = dataframe['high'].rolling(window=9).max()
        low_9 = dataframe['low'].rolling(window=9).min()
        dataframe['tenkan_sen'] = (high_9 + low_9) / 2

        high_26 = dataframe['high'].rolling(window=26).max()
        low_26 = dataframe['low'].rolling(window=26).min()
        dataframe['kijun_sen'] = (high_26 + low_26) / 2

        dataframe['senkou_span_a'] = ((dataframe['tenkan_sen'] + dataframe['kijun_sen']) / 2).shift(26)

        high_52 = dataframe['high'].rolling(window=52).max()
        low_52 = dataframe['low'].rolling(window=52).min()
        dataframe['senkou_span_b'] = ((high_52 + low_52) / 2).shift(26)

        dataframe['chikou_span'] = dataframe['close'].shift(-26)

        return dataframe

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

        informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe=self.informative_timeframe)
        informative = self.ichimoku_cloud(informative)

        dataframe['inf_tenkan_sen'] = informative['tenkan_sen'].reindex(dataframe.index, method='ffill')
        dataframe['inf_kijun_sen'] = informative['kijun_sen'].reindex(dataframe.index, method='ffill')

        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['tenkan_sen'] > dataframe['kijun_sen']) &
                (dataframe['inf_tenkan_sen'] > dataframe['inf_kijun_sen'])
            ),
            'buy'
        ] = 1
        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (
                (dataframe['tenkan_sen'] < dataframe['kijun_sen']) &
                (dataframe['inf_tenkan_sen'] < dataframe['inf_kijun_sen'])
            ),
            'sell'
        ] = 1
        return dataframe
