重新限定了confirm_trade_entry/exit规则根据ML ai结果
This commit is contained in:
parent
307e0be9bd
commit
c6b6f3573f
@ -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 # 阻止出场
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user