Forex scalping EURUSD London sesion - Judas Swing
Posted: Sat Jul 25, 2026 9:29 pm
Hi Scalpers,
today i would like to share some of my forex scalping setup, its called Judas Swing.
The EURUSD London Open is notorious for the "Judas Swing"—a deliberate move by institutions to sweep the liquidity resting above and below the tight Asian session consolidation before committing to the true daily trend.
This is how i programmed that:
Installation & CompilationCopy this source code into MetaEditor (F4), click New $\rightarrow$ Custom Indicator, name it London_Liquidity_Sweep, and paste the code below.
today i would like to share some of my forex scalping setup, its called Judas Swing.
The EURUSD London Open is notorious for the "Judas Swing"—a deliberate move by institutions to sweep the liquidity resting above and below the tight Asian session consolidation before committing to the true daily trend.
This is how i programmed that:
Installation & CompilationCopy this source code into MetaEditor (F4), click New $\rightarrow$ Custom Indicator, name it London_Liquidity_Sweep, and paste the code below.
Code: Select all
//+------------------------------------------------------------------+
//| London_Liquidity_Sweep.mq4 |
//| Custom Indicator for EURUSD |
//+------------------------------------------------------------------+
#property copyright "Forex Scalping Tools"
#property strict
#property indicator_chart_window
//--- Expose Buffers for the Arrows
#property indicator_buffers 2
#property indicator_color1 clrDodgerBlue // Buy Arrow
#property indicator_color2 clrCrimson // Sell Arrow
#property indicator_width1 2
#property indicator_width2 2
//--- User Inputs
input int AsianStartHour = 0; // Broker Hour: Asian Session Start
input int AsianEndHour = 8; // Broker Hour: Asian Session End
input int LondonEndHour = 12; // Broker Hour: Stop looking for breakouts
input int AtrPeriod = 7; // Fast ATR for volume spike detection
input double AtrMultiplier = 1.3; // Minimum ATR expansion required for valid breakout
//--- Global Buffers & Variables
double BuyBuffer[];
double SellBuffer[];
double currentAsianHigh = 0;
double currentAsianLow = 0;
int activeDay = -1;
bool breakoutFired = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0, BuyBuffer);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 233); // Up Arrow symbol
SetIndexBuffer(1, SellBuffer);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 234); // Down Arrow symbol
IndicatorDigits(Digits);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if (rates_total < AtrPeriod * 2) return(0);
// Limit calculation to uncalculated bars to optimize CPU
int limit = rates_total - prev_calculated;
if (limit == 0) limit = 1; // Always check the current forming bar
for(int i = limit - 1; i >= 0; i--)
{
int currentHour = TimeHour(time[i]);
int dayOfYear = TimeDayOfYear(time[i]);
// 1. Reset state for a new trading day
if(dayOfYear != activeDay)
{
activeDay = dayOfYear;
currentAsianHigh = 0;
currentAsianLow = 99999;
breakoutFired = false;
}
// 2. Map the Asian Session Range
if(currentHour >= AsianStartHour && currentHour < AsianEndHour)
{
if(high[i] > currentAsianHigh) currentAsianHigh = high[i];
if(low[i] < currentAsianLow) currentAsianLow = low[i];
// Clean buffers during the Asian session
BuyBuffer[i] = EMPTY_VALUE;
SellBuffer[i] = EMPTY_VALUE;
continue;
}
// 3. Evaluate the London Breakout Window
BuyBuffer[i] = EMPTY_VALUE;
SellBuffer[i] = EMPTY_VALUE;
if(currentHour >= AsianEndHour && currentHour < LondonEndHour)
{
// Only fire one valid signal per day to avoid overtrading the chop
if(breakoutFired) continue;
// Fetch ATR data
double atrCurrent = iATR(NULL, 0, AtrPeriod, i);
double atrPrev = iATR(NULL, 0, AtrPeriod, i+1);
// Volatility Filter: Current bar's ATR must be heavily expanding
bool hasInstitutionalVolume = (atrCurrent > (atrPrev * AtrMultiplier));
// Long Breakout: Close above Asian High with volume
if(close[i] > currentAsianHigh && hasInstitutionalVolume)
{
BuyBuffer[i] = low[i] - (10 * Point); // Place arrow below the candle
breakoutFired = true;
}
// Short Breakout: Close below Asian Low with volume
else if(close[i] < currentAsianLow && hasInstitutionalVolume)
{
SellBuffer[i] = high[i] + (10 * Point); // Place arrow above the candle
breakoutFired = true;
}
}
}
return(rates_total);
}