From c742344158cada7dc7bebf02e84af488aac4a9f4 Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Thu, 26 Feb 2026 02:15:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=85=E5=9C=A8=E6=BB=A1=E8=B6=B3=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E4=B8=A5=E6=A0=BC=E6=9D=A1=E4=BB=B6=E6=97=B6=E6=89=8D?= =?UTF-8?q?=E5=85=A5=E5=9C=BA=EF=BC=8C=E6=8D=95=E6=8D=89=E7=9C=9F=E6=AD=A3?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E8=BE=B9=E4=B8=8A=E6=B6=A8=E8=A1=8C=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- freqtrade/templates/freqaiprimer.py | 69 ++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index ac5b135c..5cc82cd4 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -1088,25 +1088,47 @@ class FreqaiPrimer(IStrategy): basic_condition = condition_count >= self.min_condition_count.value pullback_entry = basic_condition & ema_trend_filter & price_below_ema20_15m - # 条件2:趋势跟踪入场(新增逻辑) - # 不要求价格低于EMA20,而是要求: - # - EMA趋势过滤满足 - # - MACD上升趋势 - # - 趋势确认(3m或15m趋势向上) - # - 价格高于15分钟EMA20(表明处于上涨趋势) - price_above_ema20_15m = dataframe['close'] >= dataframe['ema_20_15m'] - # 趋势跟踪需要的条件数量较少,因为已经在明显上涨趋势中 - trend_condition_count = ( - macd_condition_1h.astype(int) + - trend_confirmation.astype(int) + - (volume_spike | bb_width_condition).astype(int) - ) - # 趋势跟踪只需要满足2个条件即可,降低门槛 - trend_basic_condition = trend_condition_count >= 2 - trend_following_entry = trend_basic_condition & ema_trend_filter & price_above_ema20_15m + # ========== 条件2:严格的趋势跟踪入场(单边上涨识别) ========== + # 1. 价格行为:突破过去4-6小时的最高价(约24-36根15分钟K线) + lookback_period = 32 # 中间值:5小时 = 20根15分钟K线 + price_breakout_high = dataframe['high'].rolling(window=lookback_period, min_periods=1).max() + price_breakout_condition = dataframe['close'] > price_breakout_high.shift(1) # 收盘价突破前一期的最高价 - # 最终条件:超卖反弹入场 或 趋势跟踪入场 - final_condition = pullback_entry | trend_following_entry + # 大阳线形态:实体大阳线且吞没前期 + candle_body = abs(dataframe['close'] - dataframe['open']) + avg_body = candle_body.rolling(window=5, min_periods=1).mean() + big_bullish_candle = (dataframe['close'] > dataframe['open']) & (candle_body > avg_body * 1.5) + + # 2. 量能爆发:成交量达到前10根均量的2.5倍以上 + volume_ma_10 = dataframe['volume'].rolling(window=10, min_periods=1).mean() + volume_spike_condition = dataframe['volume'] > volume_ma_10 * 2.5 + + # 3. 动量指标:RSI脱离40-60震荡区间,向上穿破70且斜率陡峭 + rsi_slope = dataframe['rsi_1h'].diff() + rsi_above_70 = dataframe['rsi_1h'] > 70 + rsi_steep_slope = rsi_slope > 3 # 斜率陡峭(每根K线RSI上升超过3) + rsi_momentum_condition = rsi_above_70 & rsi_steep_slope + + # 4. 波动确认:布林带由收口转为张口,价格运行在上轨之外 + bb_width = (dataframe['bb_upper_1h'] - dataframe['bb_lower_1h']) / dataframe['close'] + bb_width_ma = bb_width.rolling(window=5, min_periods=1).mean() + bb_squeeze_to_expand = (bb_width > bb_width_ma.shift(1) * 1.2) & (bb_width.shift(1) < bb_width_ma.shift(2) * 1.1) + price_above_bb_upper = dataframe['close'] > dataframe['bb_upper_1h'] + bb_volatility_condition = bb_squeeze_to_expand & price_above_bb_upper + + # 趋势跟踪综合条件:需要满足多个严格条件 + # 至少满足:价格突破 + (量能爆发 或 RSI动量 或 布林带开口) + price_above_ema20_15m = dataframe['close'] >= dataframe['ema_20_15m'] + trend_condition_met = ( + price_breakout_condition & + big_bullish_candle & + price_above_ema20_15m & + ema_trend_filter & + (volume_spike_condition | rsi_momentum_condition | bb_volatility_condition) + ) + + # 最终条件:超卖反弹入场 或 严格趋势跟踪入场 + final_condition = pullback_entry | trend_condition_met # 设置入场信号 dataframe.loc[final_condition, 'enter_long'] = 1 @@ -1186,11 +1208,18 @@ class FreqaiPrimer(IStrategy): self.strategy_log(f" - MACD 上升趋势: {macd_condition_1h.sum()} 次") self.strategy_log(f" - 成交量或布林带宽度: {(volume_spike | bb_width_condition).sum()} 次") self.strategy_log(f" - 价格低于15分钟EMA20: {price_below_ema20_15m.sum()} 次") - self.strategy_log(f" - 价格高于15分钟EMA20: {price_above_ema20_15m.sum()} 次") self.strategy_log(f" - 趋势确认: {trend_confirmation.sum()} 次") self.strategy_log(f" - EMA趋势过滤(在上方或20根K线内穿越): {ema_trend_count} 次") self.strategy_log(f" - 超卖反弹入场信号: {pullback_entry.sum()} 次") - self.strategy_log(f" - 趋势跟踪入场信号: {trend_following_entry.sum()} 次") + + # 新增:趋势跟踪条件统计 + self.strategy_log(f" === 严格趋势跟踪条件 ===") + self.strategy_log(f" - 价格突破过去{lookback_period}根K线最高价: {price_breakout_condition.sum()} 次") + self.strategy_log(f" - 大阳线形态: {big_bullish_candle.sum()} 次") + self.strategy_log(f" - 量能爆发(2.5倍均量): {volume_spike_condition.sum()} 次") + self.strategy_log(f" - RSI动量(>70且斜率陡峭): {rsi_momentum_condition.sum()} 次") + self.strategy_log(f" - 布林带开口+价格在上轨外: {bb_volatility_condition.sum()} 次") + self.strategy_log(f" - 严格趋势跟踪入场信号: {trend_condition_met.sum()} 次") self.strategy_log(f" - 最终入场信号(总计): {final_condition.sum()} 次") # ========== 新增:最近5个时间点的条件满足状况可视化 ==========