该策略是一个结合了多重指标的趋势跟踪系统,主要通过识别价格突破、成交量确认和均线系统配合来捕捉市场趋势性机会。策略通过监控价格对近期高点/低点的突破、交易量的显著放大以及多条指数移动平均线(EMA)的排列来确定交易信号。同时,策略还包含了一个创新性的窄幅整理识别机制,用于捕捉潜在的做空机会。
策略的核心逻辑基于以下几个关键要素: 1. 价格突破系统:监测价格对过去20个周期高点/低点的突破情况 2. 成交量确认:要求突破时的成交量至少是过去20个周期平均成交量的2倍 3. 均线系统:使用30/50/200周期的EMA构建趋势确认体系 4. 做多条件:价格突破新高、成交量放大、价格站上200EMA、短期均线位于中期均线之上且中期均线位于长期均线之上 5. 做空条件:包含两种入场机制: - 传统突破做空:价格突破新低、成交量放大、均线空头排列且200EMA向下倾斜 - 窄幅整理做空:价格在中期均线下方形成窄幅整理,整理幅度小于ATR的0.5倍
多重趋势突破动量交易策略是一个综合性的趋势跟踪系统,通过多重技术指标的配合使用,在保证信号可靠性的同时提供了灵活的交易机会。策略的创新之处在于结合了传统的突破交易方法和新型的窄幅整理识别机制,使其能够适应不同的市场环境。虽然存在一定的风险,但通过合理的参数优化和风险管理措施,策略有望在趋势性市场中获得稳定表现。
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Breakout Strategy (Long & Short) + Slope of 200 EMA", overlay=true)
// -------------------
// 1. Settings
// -------------------
breakout_candles = input.int(20, title="Number of Candles for Breakout")
range_candles = input.int(10, title="Number of Candles for Previous Range")
ema_long_period = input.int(200, title="Long EMA Period")
ema_medium_period = input.int(50, title="Medium EMA Period")
ema_short_period = input.int(30, title="Short EMA Period")
// Checkbox to allow/disallow short positions
allowShort = input.bool(true, title="Allow Short Positions")
// Inputs for the new Narrow Consolidation Short setup
consolidationBars = input.int(10, "Consolidation Bars", minval=1)
narrowThreshInAtr = input.float(0.5,"Narrowness (ATR Mult.)",minval=0.0)
atrLength = input.int(14, "ATR Length for Range")
// -------------------
// 2. Calculations
// -------------------
breakout_up = close > ta.highest(high, breakout_candles)[1]
breakout_down = close < ta.lowest(low, breakout_candles)[1]
prev_range_high = ta.highest(high, range_candles)[1]
prev_range_low = ta.lowest(low, range_candles)[1]
ema_long = ta.ema(close, ema_long_period)
ema_medium = ta.ema(close, ema_medium_period)
ema_short = ta.ema(close, ema_short_period)
average_vol = ta.sma(volume, breakout_candles)
volume_condition = volume > 2 * average_vol
// 200 EMA sloping down?
ema_long_slope_down = ema_long < ema_long[1]
// For the Narrow Consolidation Short
rangeHigh = ta.highest(high, consolidationBars)
rangeLow = ta.lowest(low, consolidationBars)
rangeSize = rangeHigh - rangeLow
atrValue = ta.atr(atrLength)
// Condition: Price range is "narrow" if it's less than (ATR * threshold)
narrowConsolidation = rangeSize < (atrValue * narrowThreshInAtr)
// Condition: All bars under Medium EMA if the highest difference (high - ema_medium) in last N bars is < 0
allBelowMedium = ta.highest(high - ema_medium, consolidationBars) < 0
// -------------------
// 3. Long Entry
// -------------------
breakout_candle_confirmed_long = ta.barssince(breakout_up) <= 3
long_condition = breakout_candle_confirmed_long
and volume_condition
and close > prev_range_high
and close > ema_long
and ema_short > ema_medium
and ema_medium > ema_long
and strategy.opentrades == 0
if long_condition
strategy.entry("Long", strategy.long)
// -------------------
// 4. Short Entries
// -------------------
// (A) Original breakout-based short logic
breakout_candle_confirmed_short = ta.barssince(breakout_down) <= 3
short_condition_breakout = breakout_candle_confirmed_short
and volume_condition
and close < prev_range_low
and close < ema_long
and ema_short < ema_medium
and ema_medium < ema_long
and ema_long_slope_down
and strategy.opentrades == 0
// (B) NEW: Narrow Consolidation Short
short_condition_consolidation = narrowConsolidation
and allBelowMedium
and strategy.opentrades == 0
// Combine them: if either short scenario is valid, go short
short_condition = (short_condition_breakout or short_condition_consolidation) and allowShort
if short_condition
// Use a different order ID if you want to distinguish them
// but "Short" is fine for a single position
strategy.entry("Short", strategy.short)
// -------------------
// 5. Exits
// -------------------
if strategy.position_size > 0 and close < ema_long
strategy.close("Long", qty_percent=100)
if strategy.position_size < 0 and close > ema_long
strategy.close("Short", qty_percent=100)
// ======================================================================
// 5. ADDITIONAL PARTIAL EXITS / STOPS
// ======================================================================
// You can add partial exits for shorts or longs similarly.
// For example:
// if strategy.position_size < 0 and close > stop_level_for_short
// strategy.close("Short", qty_percent=50)