Quantumcona

Breakout Trading with Triple-Indicator Confirmation (EMA + CCI)

We've watched traders blow up accounts chasing every breakout like it's Black Friday at a department store. Breakouts in choppy markets? Pure account destruction. Slow, painful, one fake signal at a time. So we stopped doing that. The fix: don't touch the trade unless trend, momentum, and trigger all agree at the same time.

Quantumcona4 min read

Breakout Trading with Triple-Indicator Confirmation (EMA + CCI)

We’ve watched traders blow up accounts chasing every breakout like it’s Black Friday at a department store. Breakouts in choppy markets? Pure account destruction. Slow, painful, one fake signal at a time.

So we stopped doing that.

The fix was obvious once we’d lost enough money figuring it out: don’t touch the trade unless three independent systems – trend, momentum, and trigger – all agree at the same time. We built this strategy across 11 versions for a client who kept getting burned by false breakouts on gold. Version 1 was embarrassingly naive. Version 11 filters out roughly 80% of the garbage signals. We’re walking you through the whole thing here – MQL4, Pine Script, and the fractal-based level detection that holds it all together.

The Strategy Architecture

Three independent systems have to unanimously say “go” before a single lot gets placed:

Filter Condition Role
Trend EMA(21) > EMA(34) AND CCI(20) > 0 Direction – no breakouts in a downtrend
Momentum Close > EMA(20) AND CCI(10) > 0 Force – move has short-term conviction
Trigger Close > EMA(60) AND CCI(10) > 0 Context – bigger picture agrees

ALL THREE TRUE → Check for resistance breakout. ANY ONE FALSE → No trade.

Why three filters instead of one? Because one filter is a suggestion. Three filters agreeing is a conviction.

  • Trend Filter – Stops you from buying breakouts in a downtrend.
  • Momentum Filter – Is the move actually going somewhere, or just a limp squeeze?
  • Trigger Filter – The longer timeframe has to agree too.

Part 1: Fractal-Based Resistance Detection

This strategy finds resistance dynamically using a fractal-like pattern – a bar whose high towers above N bars on both sides. A resistance level: high > highs of N bars right and left. That’s it. A local peak. The market has memory; these fractal pivots capture it.

MQL4 Implementation

input int RightBars = 2, LeftBars = 3;
double ResistanceLevels[5];
int    ResistanceBars[5];
 
void FindResistanceLevels()
{
    int startBar = RightBars + 1, found = 0;
    for (int i = 0; i < 100 && found < 5; i++)
    {
        int pivotBar = startBar + i;
        bool rightValid = true;
        for (int r = RightBars; r > 0; r--)
            if (High[pivotBar - r] >= High[pivotBar]) { rightValid = false; break; }
        if (!rightValid) continue;
        bool leftValid = true;
        for (int l = 1; l <= LeftBars; l++)
            if (High[pivotBar + l] >= High[pivotBar]) { leftValid = false; break; }
        if (!leftValid) continue;
        bool strictRight = true;
        for (int r2 = RightBars; r2 > 0; r2--)
            if (High[pivotBar - r2] >= High[pivotBar]) { strictRight = false; break; }
        bool strictLeft = true;
        for (int l2 = 1; l2 <= LeftBars; l2++)
            if (High[pivotBar + l2] > High[pivotBar]) { strictLeft = false; break; }
        if (strictRight && strictLeft)
        {
            ResistanceLevels[found] = High[pivotBar];
            ResistanceBars[found] = pivotBar;
            found++;
        }
    }
}

Support = mirror logic on lows. Support level = stop loss anchor.


Part 2: Triple Confirmation Filter

bool CheckTripleConfirmation()
{
    bool trendUp = (iMA(...,21) > iMA(...,34)) && (iCCI(...,20) > 0);
    bool momentumUp = (Close[0] > iMA(...,20)) && (iCCI(...,10) > 0);
    bool triggerUp = (Close[0] > iMA(...,60)) && (iCCI(...,10) > 0);
    bool emaAlignment = (momEMA > trigEMA);
    return (trendUp && momentumUp && triggerUp && emaAlignment);
}

Part 3: Breakout Entry

Entry when price is above resistance + buffer and not too far (within 1.25× buffer to avoid chasing). SL at support, TP = 1:1 R:R.

The “not too far” check kills the biggest account-killer in breakout trading – chasing. If price has already moved 20 pips past the breakout? The trade is gone.


Part 4: Stop Loss at Support

Stop at the nearest support level. Wide gap → wide stop and target. Tight gap → tight everything. Risk-reward stays 1:1; position sizing adapts to volatility.


What 11 Versions Taught Us

Version Change Why
V1 Basic resistance break Too many false breakouts
V2 EMA trend filter Eliminated counter-trend entries
V3 CCI momentum Filtered low-conviction moves
V4–V5 Multi-level resistance (5) Single level missed opportunities
V6–V8 Trigger EMA + alignment Reduced trades in chop
V9 “Not too far” buffer Stopped chasing
V10 Support-based SL SL adapted to structure
V11 Double-pass fractal Eliminated weak pivots

Nobody writes a good strategy on the first try. V11 trades maybe a third as often – but when it trades, it means it.

Need a Custom Breakout Strategy?

Breakout systems are our thing. We’ve built over a hundred across MT4, TradingView, and Python.

Get Your Breakout Strategy Built →

Algorithmic Trading Insights by Quantumcona.