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.

