diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index 08eb21e2..18dd614b 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -249,9 +249,18 @@ class FreqaiPrimer(IStrategy): # 入场间隔控制参数(分钟) entry_interval_minutes = IntParameter(20, 200, default=42, optimize=True, load=True, space='buy') - # ML 审核官:exit_signal 拒绝入场/出场的阈值(越高越宽松,越低越严格) + # ML 审核官:entry_signal 拒绝入场的阈值(越高越宽松,越低越严格) + ml_entry_signal_threshold = DecimalParameter(0.05, 0.85, decimals=2, default=0.15, optimize=True, load=True, space='buy') + + # ML 审核官:exit_signal 拒绝出场的阈值(越高越宽松,越低越严格) ml_exit_signal_threshold = DecimalParameter(0.05, 0.85, decimals=2, default=0.15, optimize=True, load=True, space='buy') + # FreqAI 标签定义:entry_signal 的洛底上涨幅度(%) + freqai_entry_up_percent = DecimalParameter(0.5, 3.0, decimals=2, default=1.0, optimize=True, load=True, space='buy') + + # FreqAI 标签定义:exit_signal 的洛底下跌幅度(%) + freqai_exit_down_percent = DecimalParameter(0.5, 3.0, decimals=2, default=1.0, optimize=True, load=True, space='buy') + # 定义可优化参数 # 初始入场金额: 75.00 @@ -323,9 +332,12 @@ class FreqaiPrimer(IStrategy): """定义 FreqAI 训练标签:简单二分类版本。""" label_horizon = 6 # 与 config 中 label_period_candles 对齐 - # 避免除法:用乘法比较未来收益 - entry_up_threshold = 1.01 # 未来价格 > 当前价格 * 1.01 视为“好入场” - exit_down_threshold = 0.99 # 未来价格 < 当前价格 * 0.99 视为“应尽早退出” + # 动态计算上涨/下跌阈值 + entry_up_percent = self.freqai_entry_up_percent.value / 100.0 # 转换为小数(如 0.01 表示 1%) + exit_down_percent = self.freqai_exit_down_percent.value / 100.0 + + entry_up_threshold = 1.0 + entry_up_percent # 例如 1.01 表示 +1% + exit_down_threshold = 1.0 - exit_down_percent # 例如 0.99 表示 -1% # 入场标签:未来窗口内的最高价是否超过 +1% future_max = dataframe["close"].rolling(window=label_horizon, min_periods=1).max().shift(-label_horizon + 1) @@ -771,7 +783,7 @@ class FreqaiPrimer(IStrategy): if entry_prob is not None: # 确保概率在 [0, 1] 范围内(分类器输出可能有浮点误差) entry_prob = max(0.0, min(1.0, entry_prob)) - entry_threshold = self.ml_exit_signal_threshold.value + entry_threshold = self.ml_entry_signal_threshold.value if entry_prob < entry_threshold: logger.info(f"[{pair}] ML 审核官拒绝入场: entry_signal 概率 {entry_prob:.2f} < 阈值 {entry_threshold:.2f}(上涨概率低,不宜入场)") allow_trade = False @@ -879,9 +891,7 @@ class FreqaiPrimer(IStrategy): ) except Exception as e: logger.warning(f"[{pair}] ML 审核官出场检查失败,允许出场: {e}") - # 极端模式:彻底不拦截出场信号 - logger.info(f"[{pair}] 极端模式:允许出场(ML 审核官已禁用),出场原因: {exit_reason}") - return True + return allow_exit def custom_stoploss(self, pair: str, trade: 'Trade', current_time, current_rate: float, current_profit: float, **kwargs) -> float: