重新限定了confirm_trade_entry/exit规则根据ML ai结果

This commit is contained in:
zhangkun9038@dingtalk.com 2026-02-15 21:26:14 +08:00
parent 307e0be9bd
commit c6b6f3573f

View File

@ -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 # 阻止出场