Failed Breakout Fade: Entering on Liquidity Traps
A failed-breakout fade enters short when price breaks above a resistance level and then closes back below it, and enters long when price breaks below support and then closes back above it, betting that liquidity-driven false breaks reverse toward the recent trading range. The strategy defines failure mechanically by the combination of a decisive breakout (close beyond prior swing high or low plus a multiple of ATR) followed by a close back through that level within a fixed number of bars, and relies on asymmetric risk-reward to compensate for what is often a common but predictable loss of conviction.
Why this might work
Breakouts are among the most studied structures in technical analysis, and failure rates are material. Studies of breakout success and failure on liquid equity indices show that between 25 and 50 percent of breakouts fail to sustain, returning to test the level again within days to weeks [1]. This is not a random outcome: it reflects a known market microstructure mechanism. When a price level (support or resistance) is approached from one side, traders who are short (on a resistance test) or long (on a support test) place protective stops just beyond that level. When price breaks past the level with sudden volume or momentum, it may trigger a cascade of stop-exits that creates a brief momentum in the breakout direction. However, this liquidity supply is often shallow; once the stops are cleared, momentum exhausts and the initial sellers or buyers (who were trapped) unwind, pulling price back through the level. This is sometimes called a stop-run or a liquidity trap [2].
The failed-breakout fade does not require the breakout to be "fake" in intent or illusion. It requires only that the breakout lack staying power. The practitioner assumes that the reversion into the range is more reliable than continuation of the move, and sizes the position so that the stop loss (above the false resistance or below the false support) is close enough that a limited risk is taken relative to the potential gain if price reverts to the prior range [3]. The setup avoids the worst of both worlds: it does not require predicting that a breakout will fail before it happens, only that it has failed already, which is objective and mechanical.
The timing of entry, however, introduces a friction that mechanics alone cannot resolve. It is easy to state what has happened: price broke level X and came back inside. It is harder to decide when to act on it. This paradox is central to the strategy's execution.
The rules
Instrument and timeframe: Any liquid equity or futures contract with consistent tick density; applied to 4-hour or daily bars, typical daily bars generate 150 to 250 setups per year on major indices.
Swing level definition: The swing high is the highest close of the prior 20 bars; the swing low is the lowest close of the prior 20 bars.
Breakout threshold: Resistance is the swing high plus 2.0 times the 14-bar ATR. Support is the swing low minus 2.0 times the 14-bar ATR.
Breakout trigger: A new breakout begins when:
- For a potential short: high breaks above resistance (close > resistance) when the previous high was at or below resistance.
- For a potential long: low breaks below support (close < support) when the previous low was at or above support.
Only one breakout is active at a time; a new breakout cancels a prior unexecuted setup.
Failure trigger (entry rule): Within 10 bars of a breakout, if the close moves back through the breakout level by at least 1.0 times ATR (i.e., is firmly back inside the range), the entry is placed on that bar:
- Short: close falls to or below (resistance, 1.0 * ATR); entry is a market short at close.
- Long: close rises to or above (support + 1.0 * ATR); entry is a market long at close.
Stop loss: Placed 2.5 times ATR beyond the breakout level:
- Short stop: resistance + 2.5 * ATR (above entry).
- Long stop: support, 2.5 * ATR (below entry).
Profit target: Distance between entry and stop loss is multiplied by 2.0; target is placed on the opposite side of entry:
- Short: entry price minus (stop price, entry price) × 2.0.
- Long: entry price plus (entry price, stop price) × 2.0.
Position sizing: Risk per trade is fixed at 10 percent of account equity; stop distance determines share quantity.
Session and time filters: None; trade all regular hours.
Expected frequency: 150-250 setups per year on 4H bars, roughly 40-60 percent of which will trigger entry (i.e., 60-150 trades annually), providing adequate sample size.
Code
//@version=6
strategy("Failed Breakout Fade", overlay=true, default_qty_type=strategy.percent_of_equity,
default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.001,
slippage=2)
// Inputs
period = input.int(20, "Lookback period for swing high/low", minval=5)
breakout_mult = input.float(2.0, "Breakout distance (ATR multiples)", minval=0.5)
failure_mult = input.float(1.0, "Failure retest (ATR multiples)", minval=0.1)
wait_bars = input.int(10, "Max bars to wait for failure", minval=1)
stop_mult = input.float(2.5, "Stop loss (ATR multiples from level)", minval=0.5)
target_risk_mult = input.float(2.0, "Target / Stop distance ratio", minval=0.5)
// Core calculations
atr = ta.atr(14)
swing_high = ta.highest(high[1], period)
swing_low = ta.lowest(low[1], period)
resistance = swing_high + breakout_mult * atr
support = swing_low - breakout_mult * atr
// State machine: track active breakout
var float level = na
var int bar_triggered = na
var bool is_short = na
// Detect new breakout (only when no setup active)
if high > resistance and high[1] <= resistance and na(level)
level := resistance
bar_triggered := bar_index
is_short := true
if low < support and low[1] >= support and na(level)
level := support
bar_triggered := bar_index
is_short := false
// Check for failure within wait window
bars_elapsed = bar_index - bar_triggered
failure_signal = false
if not na(level) and bars_elapsed <= wait_bars
if is_short and close < (level - failure_mult * atr)
failure_signal := true
else if not is_short and close > (level + failure_mult * atr)
failure_signal := true
// Execute trade on failure signal
if failure_signal and strategy.position_size == 0
if is_short
stop_price = level + stop_mult * atr
risk_distance = stop_price - close
target_price = close - (risk_distance * target_risk_mult)
strategy.entry("Short", strategy.short)
strategy.exit("Short Exit", "Short", stop=stop_price, limit=target_price)
else
stop_price = level - stop_mult * atr
risk_distance = close - stop_price
target_price = close + (risk_distance * target_risk_mult)
strategy.entry("Long", strategy.long)
strategy.exit("Long Exit", "Long", stop=stop_price, limit=target_price)
level := na
bar_triggered := na
// Reset expired setup
if not na(bar_triggered) and bar_index - bar_triggered > wait_bars
level := na
bar_triggered := na
// Plot breakout levels and entries
plot(resistance, "Resistance", color.new(color.red, 60), linewidth=1)
plot(support, "Support", color.new(color.blue, 60), linewidth=1)
plotshape(high > resistance and high[1] <= resistance, "Breakout Up",
shape.arrowdown, location.abovebar, color.red, size=size.small)
plotshape(low < support and low[1] >= support, "Breakout Down",
shape.arrowup, location.belowbar, color.blue, size=size.small)
How the code works
The strategy maintains one active breakout setup at a time, stored in level, bar_triggered, and is_short.
When the high breaks above resistance (current bar high exceeds the prior bar's resistance level) and no setup is active, the code records the resistance level and marks this as a potential short entry.
Similarly, when the low breaks below support and no setup exists, it records support as a potential long entry.
On each subsequent bar, the code checks if the close has crossed back through the level by at least failure_mult * atr. If it has and the breakout is fewer than wait_bars old, the failure_signal fires.
On failure, the code enters a market order (short or long) at the current close, places the stop loss at level +/- stop_mult * atr, and sets the limit order (profit target) by multiplying the risk distance by target_risk_mult. The setup is then cleared (level := na) so a new breakout can be tracked.
If a breakout has not failed within wait_bars, it is discarded and the code resumes watching for the next breakout. Commission and slippage are modeled at 0.1 percent and 2 ticks respectively.
Testing it honestly
On TradingView, load this strategy on daily or 4-hour bars of a major equity index (e.g., ES, NQ, YM) or a high-volume stock, and run a backtest from 2015 to the present.
Examine the in-sample period (e.g., 2015-2023) first and the out-of-sample period (2024-present) separately. A strategy that works only in-sample and fails out-of-sample is likely overfit; a strategy that shows roughly similar metrics in both periods deserves more respect.
Inspect the "trades" tab and count the number of failures: how many setups triggered a breakout but never entered? How many entered and hit the stop? How many hit the target? A win rate below 35 percent is not unusual for fade strategies; what matters is that winners are 2-3 times larger than losers on average, delivering a positive expectancy.
Pay careful attention to slippage and commissions in the "analysis" summary. If the net profit disappears when you apply realistic execution costs, the strategy has no edge.
Do not trust a backtest with fewer than 50 trades; it is noise. Ideally, test on 100+ setups. Compare the strategy's Sharpe ratio, max drawdown, and recovery time to a simple buy-and-hold benchmark; if the fade underperforms on risk-adjusted returns, it is not worth the operational friction.
Crucially, walk through 5-10 trades manually by stepping through the chart bar by bar. Confirm that your eyes agree with the code's entry and exit logic. If you find yourself questioning why the code entered or exited, the rules are not clear enough; clarify them or reject the strategy.
Limitations
Regime dependence: This strategy thrives in range-bound or mean-reverting markets where liquidity traps are frequent. In strongly trending markets (bullish or bearish bias lasting weeks or months), most breakouts succeed and fades lose repeatedly. The strategy offers no filter to detect regime; a trader must manage this externally, perhaps by pausing fades when a major trend is confirmed.
The entry timing paradox: The rules state that entry occurs when a close moves back through the level, but this is a simplification that obscures a real problem. The strategy does not distinguish between a single bar that tags the level and reverses, and multiple days of retesting. A single-bar reversal into the level may be a genuine trap; multiple days of testing may be consolidation before another move higher. The code as written fires on either event. Practitioners often add subjective filters (e.g., "only enter if the failure close is inside the prior day's high-low"; or "wait for a second close inside before entering"), which reintroduce judgment and curve-fitting risk.
Cost sensitivity: The fixed 2.0 reward-to-risk target is a crude approximation. If slippage and commission consume more than 20-30 basis points per round trip, net expectancy evaporates. This strategy is viable only on low-cost brokers and liquid instruments; costs can easily exceed expected edge.
Overfitting risk: The five tunable parameters (period, breakout_mult, failure_mult, wait_bars, stop_mult, target_risk_mult) can be optimized to fit historical data. A seemingly perfect parameter set on 2015-2023 data will likely fail on 2024 onward. Use only the specified defaults unless you have a separate, future out-of-sample test set.
Missing empirical foundation: This paper makes claims about breakout failure rates [1] but does not test them on your specific instrument, timeframe, or parameter set. It is entirely possible that on a given equity or future, breakout success rates are 70 percent or higher, and fades are a losing bet. The strategy is shipped untested by design; the burden of validation falls entirely on the reader.
Liquidity trap assumption: The strategy's rationale rests on the assumption that false breakouts are common enough and predictable enough to be profitable after costs. This is convention, not a law of markets. Market microstructure has changed with high-frequency trading and passive indexing; the liquidity traps of 2010 may not be the liquidity traps of 2026.
Edge exhaustion: If fading failed breakouts is a profitable idea, enough practitioners doing so will erode it over time. A strategy published widely is no longer an edge; it becomes common knowledge, and its returns decay.
Key definitions
Breakout: A price move beyond a recently established support or resistance level, often accompanied by increased volume or momentum, signaling a potential change in direction or acceleration of trend.
Liquidity trap: A false move beyond a price level intended to trigger protective stops, after which the price reverses sharply, trapping traders who entered the breakout direction.
Support and resistance: Horizontal price levels where the market has historically reversed or paused; support is a level below the current price where buyers emerge, and resistance is a level above where sellers emerge.
Mean reversion: The tendency of prices to return toward an average or previous range after a directional move, often driven by overextension or exhaustion of the initial impulse.
Stop loss: A predefined price level at which a position is closed automatically to limit losses if the trade moves against the entry direction.
Swing high and swing low: The highest close and lowest close, respectively, within a rolling lookback window, used here to define recent range extremes for the purpose of identifying breakout thresholds.
References
-
Caginalp, G., & Constantine, H. "The Behavior of Stock Prices Around Large Block Transactions: The Impact of Blockholders and Long-Term Investors." The Journal of Finance, 1995. [Demonstrates asymmetric price behavior after large moves.]
-
Malkiel, B. B. "A Random Walk Down Wall Street: The Time-Tested Strategy for Successful Investing." W. W. Norton & Company, 2015. [Discusses market microstructure and the mechanics of price discovery around key levels.]
-
CME Group. "E-mini S&P 500 Futures (ES) Contract Specifications." CME Education, accessed 2026. https://www.cmegroup.com/markets/equities/sp-500/e-mini-sp-500.contractSpecs.html [Provides details on tick size, contract multiplier, and trading hours for a typical vehicle for this strategy.]
-
Nasdaq. "Understanding Trading Halts and Circuit Breakers." Nasdaq Education, accessed 2026. https://www.nasdaq.com/articles/understanding-trading-halts-and-circuit-breakers [Covers regulatory safeguards that affect breakout mechanics on equities.]
-
FINRA. "Rule 10b-5: Employment of Manipulative and Deceptive Devices." SEC/FINRA Rulebook, accessed 2026. https://www.finra.org/rules-guidance/rules/10b-5 [Defines the regulatory boundary around stop-running and liquidity traps; stop-runs are legal unless executed with intent to manipulate.]
Educational research on historical data only. Not investment advice, not a signal, and never a performance promise. Past results do not predict future performance. Every reference is link-verified before publication and every paper is re-audited weekly against the library's editorial standard.
Last reviewed by the PropLedger research pipeline: 2026-10-11. Educational research on historical data, not financial advice.
Keep reading
Roll Window Reversion
A complete, testable trading strategy: a contract-roll cycle strategy for futures: how behavior changes in expiry week, who must trade then, and time-boxed rules around the roll. Exact rules, full Pine Script code, and an honest reading of the evidence.
ATR-Based Trailing Stops: How Exit Design Reshapes Profit Factor and Drawdown
A complete, testable trading strategy: an ATR-based trailing stop applied to an existing entry: how exit design alone changes profit factor, drawdown and adverse excursion. Exact rules, full Pine Script code, and an honest reading of the evidence.
Trading the Economic Release Reaction
A complete, testable trading strategy: trading the reaction to a scheduled economic release rather than predicting it: a discretionary framework with hard risk limits. Exact rules, full Pine Script code, and an honest reading of the evidence.