# source: https://raw.githubusercontent.com/remiotore/freqtrade/44beaeb6a420cd8e9f2e4ea93e11d6cfa192ee03/strategies/Miku_PP_v3.py

from freqtrade.strategy import IStrategy, merge_informative_pair
from pandas import DataFrame
import talib.abstract as ta
import logging
import freqtrade.vendor.qtpylib.indicators as qtpylib

import pandas as pd
import numpy as np
import technical.indicators as ftt
from freqtrade.exchange import timeframe_to_minutes
from technical.util import resample_to_interval, resampled_merge

logger = logging.getLogger(__name__)

def pivots_points(dataframe: pd.DataFrame, timeperiod=1, levels=4) -> pd.DataFrame:
    """
    Pivots Points
    https://www.tradingview.com/support/solutions/43000521824-pivot-points-standard/
    Formula:
    Pivot = (Previous High + Previous Low + Previous Close)/3
    Resistance #1 = (2 x Pivot) - Previous Low
    Support #1 = (2 x Pivot) - Previous High
    Resistance #2 = (Pivot - Support #1) + Resistance #1
    Support #2 = Pivot - (Resistance #1 - Support #1)
    Resistance #3 = (Pivot - Support #2) + Resistance #2
    Support #3 = Pivot - (Resistance #2 - Support #2)
    ...
    :param dataframe:
    :param timeperiod: Period to compare (in ticker)
    :param levels: Num of support/resistance desired
    :return: 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
    )

    data["pivot"] = qtpylib.rolling_mean(series=qtpylib.typical_price(dataframe), window=timeperiod)



    data["r1"] = data['pivot'] + 0.382 * (high - low)

    data["rS1"] = data['pivot'] + 0.0955 * (high - low)



    data["s1"] = data["pivot"] - 0.382 * (high - low)

    for i in range(2, levels + 1):
        prev_support = data["s" + str(i - 1)]
        prev_resistance = data["r" + str(i - 1)]

        data["r" + str(i)] = (data["pivot"] - prev_support) + prev_resistance

        data["s" + str(i)] = data["pivot"] - (prev_resistance - prev_support)

    return pd.DataFrame(index=dataframe.index, data=data)


def create_ichimoku(dataframe, conversion_line_period, displacement, base_line_periods, laggin_span):
    ichimoku = ftt.ichimoku(dataframe,
                            conversion_line_period=conversion_line_period,
                            base_line_periods=base_line_periods,
                            laggin_span=laggin_span,
                            displacement=displacement
                            )
    dataframe[f'tenkan_sen_{conversion_line_period}'] = ichimoku['tenkan_sen']
    dataframe[f'kijun_sen_{conversion_line_period}'] = ichimoku['kijun_sen']
    dataframe[f'senkou_a_{conversion_line_period}'] = ichimoku['senkou_span_a']
    dataframe[f'senkou_b_{conversion_line_period}'] = ichimoku['senkou_span_b']


class Github_remiotore_freqtrade__Miku_PP_v3__20260111_210550(IStrategy):
    """
     Github_remiotore_freqtrade__Miku_PP_v3__20260111_210550
     La base de la Estrategia es: Miku_PP_v2 y Miku_1m_5m_CSen44_1_5m
    
    Provando en:
     Miku_1m_5m_CSen444v2_N_1_5
     SymphonIK
    """

    timeframe = '5m'

    informative_timeframe = '1d'




    startup_candle_count = 444  # MAXIMUM ICHIMOKU


    process_only_new_candles = True

    minimal_roi = {
        "0": 10,
    }
    
    plot_config = {
        'main_plot': {
            'pivot_1d': {},
            'rS1_1d': {},
            'r1_1d': {},
            's1_1d': {},
            'senkou_b_88': {},
        },
        'subplots': {
            'MACD': {
                'macd_1h': {'color': 'blue'},
                'macdsignal_1h': {'color': 'orange'},
            },
        }
    }




    stoploss = -0.10

    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")

        pp = pivots_points(dataframe1d)
        dataframe1d['pivot'] = pp['pivot']
        dataframe1d['r1'] = pp['r1']
        dataframe1d['s1'] = pp['s1']
        dataframe1d['rS1'] = pp['rS1']


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

        """

        """
        """
        create_ichimoku(dataframe, conversion_line_period=9, 
                        displacement=26, base_line_periods=26, laggin_span=52)
        """
        create_ichimoku(dataframe, conversion_line_period=20, 
                        displacement=88, base_line_periods=88, laggin_span=88)

        create_ichimoku(dataframe, conversion_line_period=88, 
                        displacement=444, base_line_periods=88, laggin_span=88)

        create_ichimoku(dataframe, conversion_line_period=355,
                        displacement=880, base_line_periods=175, laggin_span=175)


        dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)


        """
        Notes: Start Trading

        * En 1m
        dataframe['ichimoku_ok'] = (
            (dataframe['kijun_sen_355_5m'] >= dataframe['tenkan_sen_355_5m']) &
            (dataframe['senkou_a_100'] > dataframe['senkou_b_100']) &
            (dataframe['senkou_a_20'] > dataframe['senkou_b_20']) &
            (dataframe['kijun_sen_20'] > dataframe['tenkan_sen_444']) &
            (dataframe['senkou_a_9'] > dataframe['senkou_a_20']) &
            (dataframe['tenkan_sen_20'] >= dataframe['kijun_sen_20']) &
            (dataframe['tenkan_sen_9'] >= dataframe['tenkan_sen_20']) &
            (dataframe['tenkan_sen_9'] >= dataframe['kijun_sen_9'])
        ).astype('int')

        * En 5m
        dataframe['ichimoku_ok'] = (
            (dataframe['close'] > dataframe['pivot_1d']) &
            (dataframe['r1_1d'] > dataframe['close']) &
            (dataframe['kijun_sen_355'] >= dataframe['tenkan_sen_355']) &
            (dataframe['senkou_a_20'] > dataframe['senkou_b_20']) &
            (dataframe['kijun_sen_20'] > dataframe['tenkan_sen_88']) &
            (dataframe['senkou_a_9'] > dataframe['senkou_a_20']) &
            (dataframe['tenkan_sen_20'] >= dataframe['kijun_sen_20']) &
            (dataframe['tenkan_sen_9'] >= dataframe['tenkan_sen_20']) &
            (dataframe['tenkan_sen_9'] >= dataframe['kijun_sen_9'])
        ).astype('int')


            (dataframe['pivot_1d'] > dataframe['ema20_5m']) anulo ema20_5m para ver si hace entradas en Dry Run

        dataframe['trending_over'] = (
            (
            (dataframe['senkou_b_444'] > dataframe['close'])
            )
            |
            (
            (dataframe['pivot_1d'] > dataframe['close'])
            )
            
        ).astype('int')

        return dataframe
        """


        dataframe['pivots_ok'] = (
            (dataframe['close'] > dataframe['pivot_1d']) &
            (dataframe['rS1_1d'] > dataframe['close']) &
            (dataframe['kijun_sen_355'] >= dataframe['tenkan_sen_355']) &
            (dataframe['senkou_a_20'] > dataframe['senkou_b_20'])
        ).astype('int')        

        
        dataframe['trending_over'] = (
            
            (dataframe['senkou_b_88'] > dataframe['close'])
            
        ).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
