# source: https://raw.githubusercontent.com/secondlinger/WinnieBari/ce5d5c12df4e44bd858f8776ff6c032646d09daa/user_data/strategies/CustomRLStrategy.py
from datetime import datetime

import pandas as pd
import talib.abstract as ta
from pandas import DataFrame

import freqtrade.vendor.qtpylib.indicators as qtpylib
from freqtrade.persistence import Trade
from freqtrade.strategy.interface import IStrategy


class Github_secondlinger_WinnieBari__CustomRLStrategy__20250924_143008(IStrategy):
    """
    シンプルな強化学習戦略
    
    この戦略は FreqAI の強化学習機能を使用して
    自動的に売買判断を行います
    """

    # 基本設定
    timeframe = "5m"
    can_short = True
    stoploss = -0.10  # 10% ストップロス

    # より単純な ROI 設定
    minimal_roi = {
        "0": 0.05,   # 5% で利確
        "60": 0.02,  # 1時間後は 2% で利確
        "240": 0    # 4時間後はブレイクイーブンで利確
    }

    # 強化学習に必要な設定
    process_only_new_candles = True
    startup_candle_count = 200


    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        インジケーターを追加し、FreqAI で強化学習を実行
        """

        # 基本的なインジケーターを追加
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        dataframe['ema_20'] = ta.EMA(dataframe, timeperiod=20)
        dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
        dataframe['atr'] = ta.ATR(dataframe, timeperiod=14)

        # FreqAI の強化学習を開始
        dataframe = self.freqai.start(dataframe, metadata, self)

        return dataframe


    def feature_engineering_standard(self, dataframe: DataFrame, **kwargs) -> DataFrame:
        # 必須のraw価格データ
        dataframe["%-raw_close"] = dataframe["close"]
        dataframe["%-raw_open"] = dataframe["open"]
        dataframe["%-raw_high"] = dataframe["high"]
        dataframe["%-raw_low"] = dataframe["low"]

        # 基本特徴量
        dataframe["%-close"] = dataframe["close"]
        dataframe["%-returns"] = dataframe['close'].pct_change()
        dataframe["%-volatility"] = dataframe['close'].rolling(20).std()

        return dataframe



    def set_freqai_targets(self, dataframe: DataFrame, **kwargs) -> DataFrame:
        """
        強化学習のアクション（行動）を定義
        """
        # アクション列を初期化（0 = 何もしない）
        dataframe["&-action"] = 0
        return dataframe


    def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        """
        エントリーシグナルを設定
        """

        # FreqAI の予測が有効かチェック
        if "do_predict" not in df.columns:
            df["do_predict"] = 1
        if "&-action" not in df.columns:
            df["&-action"] = 0

        # ロングエントリー（アクション = 1）
        df.loc[
            (df["do_predict"] == 1) & (df["&-action"] == 1),
            "enter_long"
        ] = 1

        # ショートエントリー（アクション = 3）
        #df.loc[
        #    (df["do_predict"] == 1) & (df["&-action"] == 3),
        #    "enter_short"
        #] = 1

        return df


    def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        """
        エグジットシグナルを設定
        """

        if "do_predict" not in df.columns:
            df["do_predict"] = 1
        if "&-action" not in df.columns:
            df["&-action"] = 0

        # ロングエグジット（アクション = 2）
        df.loc[
            (df["do_predict"] == 1) & (df["&-action"] == 2),
            "exit_long"
        ] = 1

        # ショートエグジット（アクション = 4）
        #df.loc[
        #    (df["do_predict"] == 1) & (df["&-action"] == 4),
        #    "exit_short"
        #] = 1

        return df