Advertisement IC Markets

Failed London ORB: when I fade the first break instead of chasing

Discuss 1-minute to 15-minute price action setups, fading intraday momentum, key support/resistance zones, and proven short-term trading methodologies.
LondonScalper
Posts: 701
Joined: Sat Sep 05, 2026 7:54 am

Failed London ORB: when I fade the first break instead of chasing

Post 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.
Recommended broker for automated trading & scalping IC Markets
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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:
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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;
  }
//+------------------------------------------------------------------+
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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)
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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
  }
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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();
     }
  }
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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();
     }
  }
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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.
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
PTScalper
Site Admin
Posts: 3027
Joined: Mon Jul 20, 2026 1:28 pm

Re: Failed London ORB: when I fade the first break instead of chasing

Post 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"
Preserve your own money. Scale with the market's money. Exponential growth is the ultimate key.
Post Reply