diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index 0d40868f..9fa8eba8 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -1588,12 +1588,47 @@ class FreqaiPrimer(IStrategy): # 确保概率在 [0, 1] 范围内(分类器输出可能有浮点误差) entry_prob = max(0.0, min(1.0, entry_prob)) entry_threshold = self.ml_entry_signal_threshold.value - if entry_prob < entry_threshold: - rejected_conditions.append(f"ML审核官: entry_signal 概率 {entry_prob:.2f} < 阈值 {entry_threshold:.2f}") - self.strategy_log(f"[{pair}] {rejected_conditions[-1]}") - ml_rejected = True + + # 获取 exit_signal 值 + exit_prob = None + if '&s-exit_signal' in df.columns: + exit_prob = float(last_row['&s-exit_signal']) + elif '&-exit_signal_prob' in df.columns: + exit_prob = float(last_row['&-exit_signal_prob']) + elif '&-s-exit_signal_prob' in df.columns: + exit_prob = float(last_row['&-s-exit_signal_prob']) + elif '&-exit_signal' in df.columns: + val = last_row['&-exit_signal'] + if isinstance(val, (int, float)): + exit_prob = float(val) + else: + # 文本标签时,简单映射为 0/1 + exit_prob = 1.0 if str(val).lower() in ['exit', 'sell', '1'] else 0.0 + + # 应用新规则:entry_signal > exit_signal * 1.33 且 > 阈值 + signal_ratio_threshold = 1.33 + if exit_prob is not None: + # 确保 exit_prob 在 [0, 1] 范围内 + exit_prob = max(0.0, min(1.0, exit_prob)) + + if entry_prob < entry_threshold: + rejected_conditions.append(f"ML审核官: entry_signal 概率 {entry_prob:.2f} < 阈值 {entry_threshold:.2f}") + self.strategy_log(f"[{pair}] {rejected_conditions[-1]}") + ml_rejected = True + elif entry_prob <= exit_prob * signal_ratio_threshold: + rejected_conditions.append(f"ML审核官: entry_signal ({entry_prob:.2f}) 未超过 exit_signal ({exit_prob:.2f}) 的 {signal_ratio_threshold:.2f} 倍") + self.strategy_log(f"[{pair}] {rejected_conditions[-1]}") + ml_rejected = True + else: + self.strategy_log(f"[{pair}] ML 审核官允许入场: entry_signal 概率 {entry_prob:.2f} >= 阈值 {entry_threshold:.2f} 且超过 exit_signal ({exit_prob:.2f}) 的 {signal_ratio_threshold:.2f} 倍") else: - self.strategy_log(f"[{pair}] ML 审核官允许入场: entry_signal 概率 {entry_prob:.2f} >= 阈值 {entry_threshold:.2f}") + # 如果没有 exit_signal,只检查阈值 + if entry_prob < entry_threshold: + rejected_conditions.append(f"ML审核官: entry_signal 概率 {entry_prob:.2f} < 阈值 {entry_threshold:.2f}") + self.strategy_log(f"[{pair}] {rejected_conditions[-1]}") + ml_rejected = True + else: + self.strategy_log(f"[{pair}] ML 审核官允许入场: entry_signal 概率 {entry_prob:.2f} >= 阈值 {entry_threshold:.2f} (无 exit_signal 数据)") else: self.strategy_log(f"[{pair}] 无数据分析数据,跳过ML审核") else: @@ -1661,10 +1696,10 @@ class FreqaiPrimer(IStrategy): try: # 获取当前的ML预测数据 df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) - if len(df) > 0 and len(df) > 0: + if len(df) > 0: last_row = df.iloc[-1] - # 获取当前入场信号概率(反映当前市场入场条件) + # 获取当前入场信号概率 current_entry_prob = None if '&s-entry_signal' in df.columns: current_entry_prob = float(last_row['&s-entry_signal']) @@ -1673,6 +1708,15 @@ class FreqaiPrimer(IStrategy): elif '&-s-entry_signal_prob' in df.columns: current_entry_prob = float(last_row['&-s-entry_signal_prob']) + # 获取当前出场信号概率 + current_exit_prob = None + if '&s-exit_signal' in df.columns: + current_exit_prob = float(last_row['&s-exit_signal']) + elif '&-exit_signal_prob' in df.columns: + current_exit_prob = float(last_row['&-exit_signal_prob']) + elif '&-s-exit_signal_prob' in df.columns: + current_exit_prob = float(last_row['&-s-exit_signal_prob']) + # 获取波动率预测 predicted_volatility = None if '&-target_volatility' in df.columns: @@ -1683,11 +1727,21 @@ class FreqaiPrimer(IStrategy): if '&-target_trend' in df.columns: trend_prediction = float(last_row['&-target_trend']) - # 基于ML预测的智能决策(移除了对不可靠的current_profit的依赖) + # 应用新规则:当exit_signal > entry_signal × 1.33时退出 + signal_ratio_threshold = 1.33 + if current_entry_prob is not None and current_exit_prob is not None: + # 确保概率在 [0, 1] 范围内 + current_entry_prob = max(0.0, min(1.0, current_entry_prob)) + current_exit_prob = max(0.0, min(1.0, current_exit_prob)) + + if current_exit_prob > current_entry_prob * signal_ratio_threshold: + self.strategy_log(f"[{pair}] exit_signal ({current_exit_prob:.2f}) 超过 entry_signal ({current_entry_prob:.2f}) 的 {signal_ratio_threshold:.2f} 倍,支持出场") + return True + + # 原有ML预测逻辑作为补充 if current_entry_prob is not None and predicted_volatility is not None: # 如果当前入场信号概率很高,说明市场条件仍然良好,可以继续持有 if current_entry_prob > 0.6: - # 高入场概率,建议继续持有 self.strategy_log(f"[{pair}] 当前入场信号概率高({current_entry_prob:.2f}),建议继续持有") return False # 阻止出场