custom roi

This commit is contained in:
zhangkun9038@dingtalk.com 2025-09-10 00:49:02 +08:00
parent 252da1194a
commit 84b625013d

View File

@ -8,17 +8,16 @@ import pandas_ta as ta
from freqtrade.persistence import Trade
import numpy as np
import datetime
import math
logger = logging.getLogger(__name__)
class FreqaiPrimer(IStrategy):
# 策略参数 - 调整以提高单笔盈利潜力
minimal_roi = {
"0": 0.05, # 5% ROI (10 分钟内)
"60": 0.03, # 3% ROI (1 小时)
"180": 0.01, # 1% ROI (3 小时)
"360": 0.005 # 0.5% ROI (6 小时)
}
# 策略参数 - 使用custom_roi替代minimal_roi字典
minimal_roi = {}
# 启用自定义ROI回调函数
use_custom_roi = True
stoploss = -0.15 # 固定止损 -15% (大幅放宽止损以承受更大波动)
trailing_stop = True
@ -104,6 +103,11 @@ class FreqaiPrimer(IStrategy):
h1_max_candles = IntParameter(100, 300, default=200, optimize=True, load=True, space='buy')
h1_rapid_rise_threshold = DecimalParameter(0.05, 0.15, decimals=3, default=0.11, optimize=True, load=True, space='buy')
h1_max_consecutive_candles = IntParameter(1, 4, default=2, optimize=True, load=True, space='buy')
# 动态ROI参数 - 指数衰减函数参数 (ROI(t) = a·e^(-k·t) + c)
roi_param_a = DecimalParameter(0.01, 0.1, decimals=3, default=0.05, optimize=True, load=True, space='roi') # 初始ROI水平
roi_param_k = DecimalParameter(0.001, 0.01, decimals=4, default=0.003, optimize=True, load=True, space='roi') # 衰减速率
roi_param_c = DecimalParameter(0, 0.01, decimals=4, default=0.005, optimize=True, load=True, space='roi') # 最低ROI水平
def informative_pairs(self):
pairs = self.dp.current_whitelist()
@ -604,6 +608,43 @@ class FreqaiPrimer(IStrategy):
# 返回应退出的比例0.0表示不退出1.0表示全部退出)
return exit_ratio
def custom_roi(self, pair: str, trade: 'Trade', current_time, **kwargs) -> float:
"""
自定义动态ROI函数使用指数衰减公式ROI(t) = a·e^(-k·t) + c
- t: 交易已持仓时间分钟
- a: 初始ROI水平参数
- k: 衰减速率参数
- c: 最低ROI水平参数
该实现支持快进快出和趋势奔跑策略并仅用于多头交易
"""
# 只支持多头
if trade.is_short:
return 0.0
# 计算交易已持仓时间(分钟)
trade_age_minutes = (current_time - trade.open_date_utc).total_seconds() / 60
# 防止负数时间
if trade_age_minutes < 0:
trade_age_minutes = 0
# 获取Hyperopt优化的参数值
a = self.roi_param_a.value
k = self.roi_param_k.value
c = self.roi_param_c.value
# 应用指数衰减公式计算ROI阈值
roi_threshold = a * math.exp(-k * trade_age_minutes) + c
# 确保ROI阈值为正数
roi_threshold = max(roi_threshold, 0.0)
# 记录ROI计算日志
logger.info(f"[{pair}] 动态ROI计算: 持仓时间={trade_age_minutes:.1f}分钟, a={a:.3f}, k={k:.4f}, c={c:.4f}, ROI阈值={roi_threshold:.4f}")
return roi_threshold
def adjust_trade_position(self, trade: 'Trade', current_time, current_rate: float,
current_profit: float, min_stake: float, max_stake: float, **kwargs) -> float:
"""