# source: https://raw.githubusercontent.com/sh1bee/Bot-v7.3/4c0bf76c6cac8badf1ad7d41b6abc83f991c8cce/strategies/V73FreqAIStrategy.py
from freqtrade.strategy import IStrategy
from pandas import DataFrame
from freqtrade.freqai.predict_model import IModel
import logging
import numpy as np
import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning)

logger = logging.getLogger(__name__)

class Github_sh1bee_Bot_v7_3__V73FreqAIStrategy__20260318_155358(IStrategy):
    interface_version = 3
    can_short = True
    
    # Sử dụng module Edge để tự điều chỉnh Stoploss và Position Size
    use_custom_stoploss = True 
    
    def feature_engineering_expand_all(self, dataframe: DataFrame, period, metadata, **kwargs) -> DataFrame:
        # Xử lý dữ liệu đầu vào: loại bỏ/điền giá trị NaN, vô cực và giá trị 0 ở các cột giá
        for col in ['high', 'low', 'close']:
            if col in dataframe.columns:
                dataframe[col] = dataframe[col].replace(0, np.nan).fillna(method='ffill')
        dataframe = dataframe.replace([np.inf, -np.inf], np.nan)
        dataframe = dataframe.fillna(method='ffill').fillna(method='bfill')
        # FreqAI sẽ tự gọi hàm này để tạo 23 chỉ số cho việc training lại
        from src.features import build_features
        features = build_features(dataframe)
        features = features.replace([np.inf, -np.inf], np.nan)
        features = features.fillna(method='ffill').fillna(method='bfill')
        return features

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        for col in ['high', 'low', 'close']:
            if col in dataframe.columns:
                dataframe[col] = dataframe[col].replace(0, np.nan).fillna(method='ffill')
        dataframe = dataframe.replace([np.inf, -np.inf], np.nan)
        dataframe = dataframe.fillna(method='ffill').fillna(method='bfill')
        # FreqAI tự động xử lý việc dự đoán qua module freqai.predict
        dataframe = self.freqai.start(dataframe, metadata)
        dataframe = dataframe.replace([np.inf, -np.inf], np.nan)
        dataframe = dataframe.fillna(method='ffill').fillna(method='bfill')
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        for col in ['high', 'low', 'close']:
            if col in dataframe.columns:
                dataframe[col] = dataframe[col].replace(0, np.nan).fillna(method='ffill')
        dataframe = dataframe.replace([np.inf, -np.inf], np.nan)
        dataframe = dataframe.fillna(method='ffill').fillna(method='bfill')
        # Sử dụng cột dự đoán từ FreqAI (mặc định là '&-prediction')
        dataframe.loc[dataframe['&-prediction'] > 0.52, 'enter_long'] = 1
        dataframe.loc[dataframe['&-prediction'] < 0.40, 'enter_short'] = 1
        return dataframe
