仅在满足多个严格条件时才入场,捕捉真正的单边上涨行情

This commit is contained in:
zhangkun9038@dingtalk.com 2026-02-26 02:15:20 +08:00
parent 2220b04ea4
commit c742344158

View File

@ -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个时间点的条件满足状况可视化 ==========