diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index bce413f2..6a5d4e20 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -1,8 +1,11 @@ import logging import numpy as np +import datetime from functools import reduce +from freqtrade.persistence import Trade import talib.abstract as ta from pandas import DataFrame +from typing import Dict from technical import qtpylib from freqtrade.strategy import IStrategy @@ -134,7 +137,11 @@ class FreqaiPrimer(IStrategy): # FreqAI 提供的预测列 if "&-trend" in dataframe.columns: dataframe["in_uptrend"] = dataframe["&-trend"] > 0.5 - + # 将 roi_target 存入 dataframe,供后续使用 + if "&-roi_target" in dataframe.columns: + dataframe["&-roi_target"] = dataframe["&-roi_target"].ffill().fillna(0.01) + else: + dataframe["&-roi_target"] = 0.01 return dataframe def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame: @@ -176,3 +183,43 @@ class FreqaiPrimer(IStrategy): df.loc[reduce(lambda x, y: x & y, conditions), 'exit_long'] = 1 return df + def adjust_trade_position(self, trade: Trade, current_time: datetime, + current_rate: float, current_profit: float, + min_roi: Dict[float, float], max_profit: float): + """ + 动态调整当前交易的止盈目标。 + """ + + # 获取当前币种的 dataframe + pair = trade.pair + dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) + last_candle = dataframe.iloc[-1] + + # 获取预测的 ROI 目标 + roi_target = last_candle.get("&-roi_target", 0.01) + + # 根据预测值生成新的 ROI 表 + if roi_target > 0.05: + new_minimal_roi = { + "0": roi_target * 1.0, + "10": roi_target * 0.8, + "30": roi_target * 0.5, + "60": roi_target * 0.2, + "120": 0.01 + } + elif 0.02 <= roi_target <= 0.05: + new_minimal_roi = { + "0": roi_target * 1.0, + "20": roi_target * 0.7, + "60": roi_target * 0.3, + "120": 0.01 + } + else: + new_minimal_roi = { + "0": max(0.01, roi_target), + "60": 0.01, + "180": 0.01 + } + + # 返回新的 minimal_roi + return new_minimal_roi