Page 1 of 2
Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 16, 2026 9:59 pm
by LondonScalper
Most ORB talk assumes you trade
with the break. Half my edge lately has been recognising when that break is already spent.
Observation: if London spikes through the open range on thin participation, then stalls and prints a clear reclaim back inside within a few M5 bars, chasing continuation has been a poor bet for me. Fading that failed break — back toward the midpoint of the range — has been cleaner, provided I am not sitting into a data release.
Rule:
fade only after a full reclaim candle closes back inside the ORB, and only if Asia was not already a trend day. Stop goes beyond the failed swing. If price re-breaks with displacement, I am wrong and out — no "giving it room" because the story sounded good at the open.
I also check correlated majors. A failed EURUSD ORB while GBP is still expanding can be noise; I want the failure to look local and accepted, not a one-pair hiccup in a one-way dollar morning.
- Do you have a failed-ORB fade, or do you only trade continuation?
- What confirms "failed" for you — time, volume proxy, or structure?
Keen to hear how others separate a true failed break from a pause before the real drive.
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:24 pm
by PTScalper
LondonScalper wrote: Wed Sep 16, 2026 9:59 pm
Most ORB talk assumes you trade
with the break. Half my edge lately has been recognising when that break is already spent.
Observation: if London spikes through the open range on thin participation, then stalls and prints a clear reclaim back inside within a few M5 bars, chasing continuation has been a poor bet for me. Fading that failed break — back toward the midpoint of the range — has been cleaner, provided I am not sitting into a data release.
Rule:
fade only after a full reclaim candle closes back inside the ORB, and only if Asia was not already a trend day. Stop goes beyond the failed swing. If price re-breaks with displacement, I am wrong and out — no "giving it room" because the story sounded good at the open.
I also check correlated majors. A failed EURUSD ORB while GBP is still expanding can be noise; I want the failure to look local and accepted, not a one-pair hiccup in a one-way dollar morning.
- Do you have a failed-ORB fade, or do you only trade continuation?
- What confirms "failed" for you — time, volume proxy, or structure?
Keen to hear how others separate a true failed break from a pause before the real drive.
Hi LondonScalper,
Your read on market mechanics here is incredibly sharp. Trapped breakout traders provide excellent liquidity for a quick reversion, and fading the false break often yields a better risk-to-reward ratio than chasing a late continuation.
Here is how I approach your questions:
1. Fade vs. Continuation
I trade both, but I heavily favor the fade when the initial break lacks a high-impact catalyst. If the macroeconomic calendar is clear, a clean break of the London open is often just a liquidity hunt. I only look for continuation if the break aligns with the higher timeframe (HTF) trend and is backed by fresh volume.
2. Confirming the Failure (Structure, Time, and Volume)
For me, confirmation requires a specific trio:
Structure: A definitive candle close back inside the ORB (exactly as you do). A wick rejection isn't enough; I need the body to close inside to prove acceptance.
Time: The "few M5 bars" rule is crucial. If price hovers outside the ORB for more than 4-5 candles (20-25 mins), it is building value and acceptance outside the range. The best failures snap back quickly.
Volume Proxy (Tick Volume): I want to see tick volume taper off as it pushes outside the range (lack of participation), followed by a sudden spike in volume on the reclaim candle.
3. Separating True Failure from a Pause
The difference usually shows up in the structure of the pullback:
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:25 pm
by PTScalper
MQL4 Expert Advisor Framework
Since this strategy requires constant monitoring of the M5 chart, an Expert Advisor (EA) is required rather than a static script. This EA codifies your exact rules: it defines the ORB, monitors for a break, tracks the extreme swing of the fakeout for the stop loss, and executes the fade targeting the midpoint when a full M5 candle closes back inside.
Note: Save this as an .mq4 file in your Experts folder. The correlation check and "Asia trend day" filters are highly discretionary and left as manual checks (or require complex multi-symbol logic), but the core execution is fully coded.
Code: Select all
//+------------------------------------------------------------------+
//| FailedORBFade.mq4|
//+------------------------------------------------------------------+
#property copyright "Custom EA"
#property strict
//--- Inputs
input string StartORB_Time = "08:00"; // ORB Start Time (Broker Server Time)
input string EndORB_Time = "09:00"; // ORB End Time (Broker Server Time)
input double LotSize = 0.1; // Position Size
input int MaxBarsOutside = 5; // Max M5 bars allowed outside before invalidating fade
input int MagicNumber = 123456;
//--- Global Variables
double ORB_High = 0.0;
double ORB_Low = 0.0;
double ORB_Mid = 0.0;
bool ORB_Formed = false;
bool Broke_High = false;
bool Broke_Low = false;
double Swing_High = 0.0;
double Swing_Low = 99999.0;
int Bars_Outside = 0;
datetime currentDay = 0;
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 1. Reset daily variables at the start of a new trading day
if(TimeDay(TimeCurrent()) != TimeDay(currentDay))
{
ORB_High = 0.0;
ORB_Low = 99999.0;
ORB_Mid = 0.0;
ORB_Formed = false;
Broke_High = false;
Broke_Low = false;
Swing_High = 0.0;
Swing_Low = 99999.0;
Bars_Outside = 0;
currentDay = TimeCurrent();
}
// 2. Parse times
datetime startTime = StringToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " " + StartORB_Time);
datetime endTime = StringToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " " + EndORB_Time);
// 3. Build the ORB High/Low bounds
if(TimeCurrent() >= startTime && TimeCurrent() <= endTime)
{
if(High[0] > ORB_High) ORB_High = High[0];
if(Low[0] < ORB_Low) ORB_Low = Low[0];
ORB_Mid = (ORB_High + ORB_Low) / 2.0;
}
// 4. Mark ORB as formed once the end time passes
if(TimeCurrent() > endTime && !ORB_Formed && ORB_High > 0)
{
ORB_Formed = true;
}
// 5. Logic execution after ORB is formed
if(ORB_Formed && OrdersTotal() == 0)
{
// --- MONITORING FOR FAKEOUT HIGH (SHORT SETUP) ---
if(High[1] > ORB_High && !Broke_Low)
{
Broke_High = true;
Bars_Outside++;
// Track the highest point of the fakeout for our Stop Loss
if(High[1] > Swing_High) Swing_High = High[1];
// Invalidate if it stays outside too long (building acceptance)
if(Bars_Outside > MaxBarsOutside)
{
Broke_High = false;
Bars_Outside = 0;
}
// Trigger: Candle closes fully back inside the ORB
if(Close[1] < ORB_High && Open[1] < ORB_High && Bars_Outside <= MaxBarsOutside && Broke_High)
{
double sl = Swing_High + (2 * Point); // Stop just beyond the fakeout swing
double tp = ORB_Mid; // Target midpoint
int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "Failed ORB Short", MagicNumber, 0, Red);
if(ticket > 0) ResetState();
}
}
// --- MONITORING FOR FAKEOUT LOW (LONG SETUP) ---
if(Low[1] < ORB_Low && !Broke_High)
{
Broke_Low = true;
Bars_Outside++;
// Track the lowest point of the fakeout for our Stop Loss
if(Low[1] < Swing_Low) Swing_Low = Low[1];
// Invalidate if it stays outside too long
if(Bars_Outside > MaxBarsOutside)
{
Broke_Low = false;
Bars_Outside = 0;
}
// Trigger: Candle closes fully back inside the ORB
if(Close[1] > ORB_Low && Open[1] > ORB_Low && Bars_Outside <= MaxBarsOutside && Broke_Low)
{
double sl = Swing_Low - (2 * Point); // Stop just beyond the fakeout swing
double tp = ORB_Mid; // Target midpoint
int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "Failed ORB Long", MagicNumber, 0, Blue);
if(ticket > 0) ResetState();
}
}
}
}
//+------------------------------------------------------------------+
//| Helper to reset tracking variables after a trade is taken |
//+------------------------------------------------------------------+
void ResetState()
{
Broke_High = false;
Broke_Low = false;
Bars_Outside = 0;
Swing_High = 0.0;
Swing_Low = 99999.0;
}
//+------------------------------------------------------------------+
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:26 pm
by PTScalper
To add a multi-currency correlation check in MQL4, use multi-symbol time-series functions (iBarShift, iHigh, iLow, iClose) to calculate the correlated instrument's ORB and evaluate whether it is actively expanding while your primary chart is attempting to fade.
1. New Inputs
Add these inputs to the top of your EA to allow toggling and customizing the secondary symbol:
Code: Select all
//--- Correlation Filter Inputs
input bool UseCorrelationFilter = true; // Enable Correlation Filter
input string CorrelatedSymbol = "GBPUSD"; // Correlated pair to check (match broker suffix)
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:26 pm
by PTScalper
2. The Correlation Helper Function
This function calculates the ORB of the secondary pair over the exact same time window. If you are preparing to Sell (fade a high breakout on EURUSD), it checks if GBPUSD is still printing closes above its own ORB High. If it is, it returns true (meaning the break is broad-based dollar weakness, not a local fakeout), vetoing your fade.
Code: Select all
//+------------------------------------------------------------------+
//| Check if correlated pair is expanding in breakout direction |
//+------------------------------------------------------------------+
bool IsCorrelatedExpanding(string sym, datetime startTime, datetime endTime, int fadeDirection)
{
if(!UseCorrelationFilter || sym == "") return false;
// Find the bar indexes on the correlated symbol for the ORB window
int startBar = iBarShift(sym, PERIOD_M5, startTime, false);
int endBar = iBarShift(sym, PERIOD_M5, endTime, false);
// Return false if history is missing or invalid
if(startBar < 0 || endBar < 0 || startBar <= endBar)
{
Print("Warning: Insufficient historical data for ", sym);
return false;
}
// 1. Calculate the Correlated Pair's ORB High & Low
double corrORB_High = 0.0;
double corrORB_Low = 99999.0;
for(int i = endBar; i <= startBar; i++)
{
double h = iHigh(sym, PERIOD_M5, i);
double l = iLow(sym, PERIOD_M5, i);
if(h > corrORB_High) corrORB_High = h;
if(l < corrORB_Low) corrORB_Low = l;
}
// 2. Fetch the most recent closed bar (Bar 1) on the correlated pair
double corrClose = iClose(sym, PERIOD_M5, 1);
// 3. Evaluate expansion
// If fading a high break (selling EUR), veto if GBP is still above its ORB High
if(fadeDirection == OP_SELL)
{
if(corrClose > corrORB_High)
{
Print("Fade Vetoed: ", sym, " is expanding higher (Close: ", corrClose, " > ORB High: ", corrORB_High, ")");
return true;
}
}
// If fading a low break (buying EUR), veto if GBP is still below its ORB Low
if(fadeDirection == OP_BUY)
{
if(corrClose < corrORB_Low)
{
Print("Fade Vetoed: ", sym, " is expanding lower (Close: ", corrClose, " < ORB Low: ", corrORB_Low, ")");
return true;
}
}
return false; // Correlated pair is NOT expanding; trade is permitted
}
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:27 pm
by PTScalper
3. Integrating the Veto Check into OnTick()
Wrap your OrderSend execution blocks inside the check:
For the Short Fade:
Code: Select all
// Trigger: Candle closes fully back inside the ORB
if(Close[1] < ORB_High && Open[1] < ORB_High && Bars_Outside <= MaxBarsOutside && Broke_High)
{
// Check if correlated pair is expanding higher
if(!IsCorrelatedExpanding(CorrelatedSymbol, startTime, endTime, OP_SELL))
{
double sl = Swing_High + (2 * Point);
double tp = ORB_Mid;
int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "Failed ORB Short", MagicNumber, 0, Red);
if(ticket > 0) ResetState();
}
else
{
// Invalidate if correlation broke the setup
ResetState();
}
}
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:28 pm
by PTScalper
For the Long Fade:
Code: Select all
// Trigger: Candle closes fully back inside the ORB
if(Close[1] > ORB_Low && Open[1] > ORB_Low && Bars_Outside <= MaxBarsOutside && Broke_Low)
{
// Check if correlated pair is expanding lower
if(!IsCorrelatedExpanding(CorrelatedSymbol, startTime, endTime, OP_BUY))
{
double sl = Swing_Low - (2 * Point);
double tp = ORB_Mid;
int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "Failed ORB Long", MagicNumber, 0, Blue);
if(ticket > 0) ResetState();
}
else
{
// Invalidate if correlation broke the setup
ResetState();
}
}
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:28 pm
by PTScalper
Critical MT4 Multi-Currency Gotchas
Symbol Suffixes: MT4 string matching is exact. If your broker uses EURUSD.pro, you must set CorrelatedSymbol to GBPUSD.pro.
Market Watch Window: iHigh() and iClose() will return 0 or stale numbers if the correlated symbol is not visible in your terminal's Market Watch window (Ctrl + M). Right-click inside Market Watch and select Show All.
Pre-loading Chart History: MT4 downloads historical M5 bars on demand. Before running the EA on live or demo, open an M5 chart for the correlated pair at least once to ensure historical bars are cached locally.
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:29 pm
by PTScalper
To filter out days where the Asian session was already a one-sided trend, we need to define what a "trend day" looks like in code.
A standard mathematical definition of a trend session requires two conditions:
Sufficient Distance: The net displacement from the session Open to the session Close must exceed a minimum pip threshold.
Directional Conviction: The net displacement must make up the vast majority of the total High-to-Low range (e.g., > 70%). If Asia moves 40 pips up and 40 pips down, it has a large range, but it's a chop day, not a trend day.
Here is how to add this structural check to the EA.
Re: Failed London ORB: when I fade the first break instead of chasing
Posted: Wed Sep 23, 2026 10:30 pm
by PTScalper
1. New Inputs
Add these variables to the top of your EA to define the Asian session times and your trend parameters:
Code: Select all
//--- Asia Trend Filter Inputs
input bool UseAsiaTrendFilter = true; // Enable Asia Trend Filter
input string AsiaStart_Time = "00:00"; // Asia Session Start
input string AsiaEnd_Time = "08:00"; // Asia Session End (Often matches ORB start)
input int AsiaTrendMinPips = 30; // Minimum Open-to-Close pip move to be a "trend"