DEV Community

Cover image for Volatility Expansion + Fake Breakout Strategy
Ranga
Ranga

Posted on

Volatility Expansion + Fake Breakout Strategy

This strategy focuses on one simple market behavior: price doesn’t just break ranges randomly, it expands with strength, and weak breakouts often fail. Instead of chasing every breakout, the logic waits for volatility expansion and filters out weak moves that usually trap traders.

At its core, the system observes the market’s recent range and volatility. When price compresses for a period, it builds energy. The strategy measures this using Average True Range (ATR). When ATR rises above its recent average, it signals that the market is entering an expansion phase, meaning movement is likely to accelerate.

How the Logic Works

First, the strategy defines a rolling range using recent highs and lows. This acts as a reference zone where price has been consolidating.

Next, it monitors for a breakout:

  • A move above the range high
  • A move below the range low But not every breakout is treated equally.

Filtering Fake Breakouts

One of the biggest problems in trading is getting trapped in false breakouts. To avoid this, the strategy checks for candle strength:

For bullish moves:

The candle must close strongly above the previous high, showing real buying pressure.

For bearish moves:

The candle must close strongly below the previous low, indicating genuine selling pressure.
If the breakout happens without this strength, the trade is ignored.

Entry Conditions

A trade is only taken when all conditions align:

  • Volatility is expanding (ATR is rising)
  • Price breaks the range
  • The breakout candle is strong and decisive

This combination helps avoid low-quality entries and focuses only on high-momentum moves.

Risk Management Approach

Every trade uses a structured risk model:

  • Stop loss is based on ATR, adapting to current market volatility
  • Take profit is calculated using a risk-to-reward ratio
  • Position sizing is consistent as a percentage of capital

This keeps the strategy stable across different market conditions instead of relying on fixed pip or point values.

Why This Approach Works

Markets often move in cycles:

  • Quiet consolidation
  • Volatility compression
  • Sudden expansion

This strategy is built specifically to catch the third phase, where price moves quickly and directionally.

By combining volatility expansion with breakout strength, it avoids common traps and focuses on movements that actually have momentum behind them.

Final Thought

This isn’t about predicting direction blindly. It’s about waiting for structure, strength, and volatility to align before acting.

If you apply this approach with discipline, it naturally reduces overtrading and improves decision quality, which is often more important than chasing every opportunity.

//@version=6
strategy("Volatility Expansion + Fake Breakout Strategy", 
     overlay=true, 
     initial_capital=100000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=5)

// ───── INPUTS ─────
rangeLen   = input.int(20, "Range Lookback")
atrLen     = input.int(14, "ATR Length")
volMult    = input.float(1.3, "Volatility Expansion Multiplier")
atrMult    = input.float(1.5, "Stop ATR Multiplier")
rr         = input.float(2.0, "Risk Reward")

// ───── VOLATILITY ─────
atrVal = ta.atr(atrLen)
atrAvg = ta.sma(atrVal, rangeLen)

// Detect expansion
volExpansion = atrVal > atrAvg * volMult

// ───── RANGE STRUCTURE ─────
rangeHigh = ta.highest(high, rangeLen)
rangeLow  = ta.lowest(low, rangeLen)

// ───── BREAKOUT DETECTION ─────
breakUp   = ta.crossover(close, rangeHigh[1])
breakDown = ta.crossunder(close, rangeLow[1])

// ───── FAKE BREAKOUT FILTER ─────
// Candle must close strong in breakout direction
strongBull = close > open and close > high[1]
strongBear = close < open and close < low[1]

// ───── ENTRY CONDITIONS ─────
longCondition  = volExpansion and breakUp and strongBull
shortCondition = volExpansion and breakDown and strongBear

if longCondition and strategy.position_size == 0
    strategy.entry("Long", strategy.long)

if shortCondition and strategy.position_size == 0
    strategy.entry("Short", strategy.short)

// ───── RISK MANAGEMENT ─────
longStop   = strategy.position_avg_price - atrVal * atrMult
longTarget = strategy.position_avg_price + atrVal * atrMult * rr

shortStop   = strategy.position_avg_price + atrVal * atrMult
shortTarget = strategy.position_avg_price - atrVal * atrMult * rr

strategy.exit("Exit Long", from_entry="Long", stop=longStop, limit=longTarget)
strategy.exit("Exit Short", from_entry="Short", stop=shortStop, limit=shortTarget)

// ───── VISUALS ─────
plot(rangeHigh, title="Range High", color=color.green)
plot(rangeLow, title="Range Low", color=color.red)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)