Exploiting structural liquidity imbalances and mean reversion anomalies from Friday close to Monday open
Requires a measurable weekend gap between Friday close and Sunday open. The gap size must fall strictly within 0.3x and 1.5x of the 14-period Daily ATR to ensure optimal mean-reversion potential without exposing the account to unmanageable macro-news gaps. Avoid trading this setup if high-impact central bank announcements or geopolitical catalysts occur over the weekend that invalidate technical mean reversion.
Validate every condition prior to executing order.
GBPUSD opened 70 pips higher on Sunday due to minor weekend commentary, fitting a 0.8x ATR profile. After 30 minutes, spreads normalized. Price printed an M15 bearish rejection candle closing back toward Friday's close of 1.2580, while RSI crossed below 50. Short entry was taken at 1.2650 with SL at 1.2710. Price successfully retraced, hit the 50% gap fill at 1.2615 where 50% was closed and SL moved to BE, before fully filling the gap at Friday's close.
EURUSD gapped down 90 pips on Sunday following macro European data releases. The gap measured 1.4x ATR. After 30 minutes, an initial bullish candle triggered an entry attempting a fill. However, heavy institutional selling persisted, bypassing the gap extreme and hitting the stop loss at 1.0880 before any mean-reverting momentum could be sustained. Strict stop loss placement prevented catastrophic exposure from a true fundamental trend day.
Copy code directly into TradingView Pine Editor
//@version=5
strategy("Weekend Gap Fill Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=1)
// Inputs
atrLen = input.int(14, title="Daily ATR Length")
minAtrMult = input.float(0.3, title="Min Gap ATR Multiplier")
maxAtrMult = input.float(1.5, title="Max Gap ATR Multiplier")
bufferMult = input.float(0.2, title="SL Buffer ATR Multiplier")
// Session / Time filter
isMonday = dayofweek == dayofweek.monday
isEarlyMonday = isMonday and (hour == 22 or (hour >= 0 and hour < 12))
// Variables to store Friday close and Sunday open
persist var float friClose = na
var float sunOpen = na
var float dailyAtr = na
// Capture Friday close on the last bar of Friday
isFridayClose = dayofweek == dayofweek.friday and time(timeframe.period, "1900-2000:1234567")
if isFridayClose
friClose := close
// Capture Sunday/Monday Open
if isMonday and ta.change(time("D"))
sunOpen := open
dailyAtr := ta.atr(atrLen)
// Gap Calculation
gapSize = math.abs(sunOpen - friClose)
minGap = dailyAtr * minAtrMult
maxGap = dailyAtr * maxAtrMult
isEligibleGap = gapSize >= minGap and gapSize <= maxGap
// 30 min post open check
MinutesSinceOpen = (hour * 60 + minute)
isPostNormalization = MinutesSinceOpen >= 30 and MinutesSinceOpen <= 360
// RSI Filter
rsiVal = ta.rsi(close, 14)
// Trigger Conditions
gapIsUp = sunOpen > friClose
gapIsDown = sunOpen < friClose
shortTrigger = isEarlyMonday and isEligibleGap and isPostNormalization and gapIsUp and close < open and ta.crossunder(rsiVal, 50)
longTrigger = isEarlyMonday and isEligibleGap and isPostNormalization and gapIsDown and close > open and ta.crossover(rsiVal, 50)
// Execution Logic
if (strategy.position_size == 0)
if shortTrigger
sl = sunOpen + (dailyAtr * bufferMult)
tp = friClose
strategy.entry("Short Gap", strategy.short)
strategy.exit("Exit Short", "Short Gap", stop=sl, limit=tp)
else if longTrigger
sl = sunOpen - (dailyAtr * bufferMult)
tp = friClose
strategy.entry("Long Gap", strategy.long)
strategy.exit("Exit Long", "Long Gap", stop=sl, limit=tp)
// Exit by Tuesday 12:00 UTC
if dayofweek == dayofweek.tuesday and hour >= 12
strategy.close_all(comment="Time Stop")
// Plotting gaps
plot(friClose, title="Friday Close", color=color.blue, style=plot.style_line)
plot(sunOpen, title="Sunday Open", color=color.orange, style=plot.style_line)
Weekend gaps occur because interbank liquidity providers close their books on Friday afternoon, while news events and geopolitical developments continue over the weekend. When markets reopen on Sunday evening, the reopening price reflects accumulated macro orders.
The strategy enforces a strict time-based stop at Tuesday 12:00 UTC. If the gap has not filled by then, the market has likely transitioned into a new directional trend, and holding the position introduces unwarranted directional risk.
Cryptocurrency markets operate 24/7 without weekend closures, making this specific Friday-close to Sunday-open gap model inapplicable to crypto spot assets.
The core edge of the Weekend Gap Fill Strategy model relies on the structural imbalance created when large market participants (commercial banks, liquidity providers, and central clearing desks) aggregate retail stop orders. Rather than anticipating trend continuation from arbitrary retail indicators, this systematic model identifies pre-existing liquidity pools—such as session highs/lows, Asian range extremes, or equal highs/lows (EQH/EQL)—where retail stop losses are heavily clustered.
Once a targeted liquidity sweep occurs and price aggressively rejects back inside the defined equilibrium range, an order flow displacement is confirmed through a Market Structure Break (MSB) or Change of Character (CHoCH). This sequence establishes asymmetric risk-to-reward parameters, allowing traders to enter with tight structural stops positioned outside the invalidated sweep candle.
Higher timeframe (H4/Daily) structural bias must always govern lower timeframe (M15/M5/M1) execution. Trading with the prevailing institutional order flow drastically reduces whipsaws during choppy session opens.
Always factor in spread expansion during high-impact news releases (CPI, NFP, FOMC) and daily 5:00 PM EST session rollover. Never enter within 15 minutes before Tier-1 macroeconomic events.
Move stop loss to break-even once price reaches 1.0R–1.5R target expansion or mitigates an opposing Fair Value Gap (FVG), neutralizing risk on active positions.
To successfully navigate proprietary trading evaluation stages without breaching maximum daily drawdown (typically 4%–5%) or maximum overall loss limits (8%–10%), this model must be deployed with disciplined position sizing:
On a $100,000 challenge account, limit single trade exposure to $500. This ensures you can survive a theoretical 6-trade drawdown streak while consuming less than 3% of your daily buffer.
If two consecutive setups trigger stop-loss invalidations within the same trading session, trading must be suspended for the remainder of that session to avoid revenge trading and emotional capital destruction.
Discretionary traders can execute this system manually using our pre-trade checklist above, while quantitative and algorithmic traders can deploy the Pine Script logic or connect directly to automated trading software:
Discover compiled MT4/MT5 Expert Advisors executing systematic order blocks around the clock.
Mirror institutional setups automatically into your MT4/MT5 broker account with zero latency.
Access 20+ verified institutional systems across Asian, London, and New York trading sessions.
Quant Note: Backtest assumes standard interbank ECN spreads and a 1.2 pip commission equivalent. Performance drops slightly during periods of heightened geopolitical weekend shocks.
Download a clean, printer-friendly 1-page cheatsheet containing all entry/exit rules and the checklist for your trading desk.
Open Print / PDF ViewSubscribe to receive verified Pine Script algorithms, quantified backtests, and fresh pre-trade checklists directly to your inbox every week.
Download the complete quantitative guide: Position Sizing Formulas, Prop Firm Drawdown Rules, and MQL5 Parameter Cheat Sheets.