Fair Value Gaps (FVG) Trading Strategy — Complete Guide
By HorizonAI Team
Fair Value Gaps (FVGs) are one of the most powerful concepts in smart money trading. They reveal areas where price moved so quickly that buy and sell orders didn't fully match, creating "imbalances" that price tends to revisit.
This guide teaches you everything about FVGs—what they are, how to identify them, and how to build trading strategies around them.
What is a Fair Value Gap?
A Fair Value Gap is a three-candle pattern where the middle candle's body is so large that it creates a gap between the first and third candles. This gap represents an "imbalance" or area of inefficiency in price.
Why FVGs form:
- Large institutional orders moved price rapidly
- Not enough opposing orders to match all volume
- Market needs to "rebalance" by returning to fill the gap
Key insight: Price doesn't like imbalances. It tends to return to these zones to fill unfilled orders before continuing in the original direction.
FVGs are also called "imbalances" or "inefficiencies." In ICT terminology, they're sometimes referred to as SIBI (Sellside Imbalance Buyside Inefficiency) and BISI (Buyside Imbalance Sellside Inefficiency).
How to Identify Fair Value Gaps
Bullish FVG (Demand Zone)
A bullish FVG forms during upward momentum:
- Candle 1: Any candle (the base)
- Candle 2: Large bullish candle (the impulse)
- Candle 3: Gap exists between Candle 1's HIGH and Candle 3's LOW
The FVG zone = From Candle 1's high to Candle 3's low
Bearish FVG (Supply Zone)
A bearish FVG forms during downward momentum:
- Candle 1: Any candle (the base)
- Candle 2: Large bearish candle (the impulse)
- Candle 3: Gap exists between Candle 1's LOW and Candle 3's HIGH
The FVG zone = From Candle 3's high to Candle 1's low
Pine Script: FVG Detector
Here's how to automatically detect and plot FVGs:
//@version=6
indicator("Fair Value Gap Detector", overlay=true, max_boxes_count=500)
// Inputs
showBullish = input.bool(true, "Show Bullish FVG")
showBearish = input.bool(true, "Show Bearish FVG")
fvgExtend = input.int(50, "Extend FVG (bars)")
// Bullish FVG: Candle 3 low > Candle 1 high (gap up)
bullFVG = low > high[2]
bullFVGTop = low
bullFVGBottom = high[2]
// Bearish FVG: Candle 3 high < Candle 1 low (gap down)
bearFVG = high < low[2]
bearFVGTop = low[2]
bearFVGBottom = high
// Draw Bullish FVG boxes
if bullFVG and showBullish
box.new(bar_index - 2, bullFVGTop, bar_index + fvgExtend, bullFVGBottom,
border_color=color.green, bgcolor=color.new(color.green, 85))
// Draw Bearish FVG boxes
if bearFVG and showBearish
box.new(bar_index - 2, bearFVGTop, bar_index + fvgExtend, bearFVGBottom,
border_color=color.red, bgcolor=color.new(color.red, 85))
Trading FVGs: The Basic Strategy
The core FVG strategy is simple: enter when price returns to fill the gap.
Bullish FVG Trade
- Identify a bullish FVG after an upward move
- Wait for price to retrace into the FVG zone
- Enter long when price touches or enters the FVG
- Stop loss below the FVG (invalidation)
- Take profit at previous high or next resistance
Bearish FVG Trade
- Identify a bearish FVG after a downward move
- Wait for price to retrace into the FVG zone
- Enter short when price touches or enters the FVG
- Stop loss above the FVG (invalidation)
- Take profit at previous low or next support
//@version=6
strategy("FVG Trading Strategy", overlay=true)
// Detect FVGs
bullFVG = low > high[2]
bearFVG = high < low[2]
// Track FVG levels
var float bullFVGTop = na
var float bullFVGBottom = na
var float bearFVGTop = na
var float bearFVGBottom = na
var bool bullFVGActive = false
var bool bearFVGActive = false
// Store new FVGs
if bullFVG
bullFVGTop := low
bullFVGBottom := high[2]
bullFVGActive := true
if bearFVG
bearFVGTop := low[2]
bearFVGBottom := high
bearFVGActive := true
// Entry on FVG fill
atr = ta.atr(14)
// Long entry when price enters bullish FVG
longEntry = bullFVGActive and low <= bullFVGTop and close > bullFVGBottom
if longEntry
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", stop=bullFVGBottom - atr * 0.5, limit=bullFVGTop + atr * 3)
bullFVGActive := false
// Short entry when price enters bearish FVG
shortEntry = bearFVGActive and high >= bearFVGBottom and close < bearFVGTop
if shortEntry
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", "Short", stop=bearFVGTop + atr * 0.5, limit=bearFVGBottom - atr * 3)
bearFVGActive := false
// Invalidate if FVG is fully breached
if bullFVGActive and close < bullFVGBottom
bullFVGActive := false
if bearFVGActive and close > bearFVGTop
bearFVGActive := false
Important: Not every FVG leads to a tradeable setup. The best FVGs form with trend, after liquidity sweeps, or at significant levels. Filter your FVGs for higher probability.
FVG Types and Quality
Not all FVGs are created equal. Here's how to identify high-quality gaps:
By Size
- Small (< 0.5 ATR): Low quality — often fills immediately, little reaction
- Medium (0.5-1.5 ATR): High quality — sweet spot, significant but not extreme
- Large (> 2 ATR): Medium quality — may only partially fill, use 50% level
By Context
High-quality FVGs:
- Form after a liquidity sweep
- Align with higher timeframe trend
- Located at significant support/resistance
- Form during killzones (London, NY open)
- Created with high volume
Low-quality FVGs:
- Form against the dominant trend
- Located in the middle of a range
- Form during low-volume periods
- Created by news spike (may be erratic)
Consequent Encroachment (CE)
The 50% level of an FVG (called "Consequent Encroachment") often acts as a key level:
- Price may react at the CE rather than filling the entire FVG
- Use CE as your entry point for tighter stops
- If price breaks CE, expect full FVG fill
Advanced FVG Strategies
FVG + Order Block Confluence
The most powerful setups combine FVG with order blocks:
//@version=6
strategy("FVG + Order Block", overlay=true)
// Detect bullish order block (last down candle before up move)
bullishOB = close[1] < open[1] and close > open and close > high[1]
// Detect bullish FVG
bullFVG = low > high[2]
// Track levels
var float obHigh = na
var float obLow = na
var float fvgTop = na
var float fvgBottom = na
var bool setupActive = false
// Setup: OB followed by FVG within 5 bars
if bullishOB
obHigh := high[1]
obLow := low[1]
if bullFVG and not na(obLow) and bar_index - ta.barssince(bullishOB) < 5
fvgTop := low
fvgBottom := high[2]
setupActive := true
// Entry when price returns to overlap of OB and FVG
overlapHigh = math.min(obHigh, fvgTop)
overlapLow = math.max(obLow, fvgBottom)
atr = ta.atr(14)
entrySignal = setupActive and low <= overlapHigh and close > overlapLow
if entrySignal
strategy.entry("Long", strategy.long)
strategy.exit("Exit", "Long", stop=overlapLow - atr * 0.5, limit=close + atr * 4)
setupActive := false
FVG + Liquidity Sweep
Enter FVGs that form after a liquidity sweep—this is one of the highest probability setups in smart money trading.
FVG Trading Rules
Entry Rules
- Wait for retracement - Never chase; let price come to your FVG
- Confirm with price action - Look for rejection candles at the FVG
- Check higher timeframe - Trade FVGs that align with HTF trend
- Time your entry - Best during London or NY killzones
Stop Loss Placement
- Aggressive: Just beyond FVG edge — higher risk (tighter stop)
- Standard: 0.5 ATR beyond FVG — moderate risk
- Conservative: Below/above the impulse candle — lower risk (wider stop)
Take Profit Targets
- Minimum target: Previous swing high/low
- Standard target: Next FVG in opposite direction
- Extended target: Next liquidity pool (equal highs/lows)
FVG Checklist
Before taking an FVG trade, verify:
- [ ] FVG is in direction of higher timeframe trend
- [ ] FVG formed recently (within 20-30 bars)
- [ ] FVG size is reasonable (0.5-2x ATR)
- [ ] No major news event approaching
- [ ] Risk/reward is at least 1:2
- [ ] Stop loss is placed logically (beyond FVG)
- [ ] Take profit target is realistic (at structure)
- [ ] Trading during killzone (London/NY)
- [ ] Bonus: FVG has confluence (OB, liquidity sweep, S/R level)
Building FVG Strategies with HorizonAI
HorizonAI can help you create and customize FVG strategies:
Detection prompts:
- "Create an indicator that marks all bullish and bearish FVGs on the chart"
- "Add the 50% (CE) level to FVG zones"
- "Color-code FVGs by size (small, medium, large)"
Strategy prompts:
- "Build a strategy that enters long when price retraces into a bullish FVG"
- "Add a trend filter—only trade FVGs in direction of 200 EMA"
- "Combine FVG entries with liquidity sweep detection"
FAQs
Do all FVGs get filled?
Not all, but most eventually do. Studies suggest 70-80% of FVGs get at least partially filled. However, strong trends can leave FVGs unfilled for extended periods.
How long do FVGs remain valid?
FVGs are strongest when fresh (within 10-20 bars). After 50+ bars, they lose significance. Use recent FVGs for trading.
Should I trade every FVG?
No. Filter for quality: trade FVGs with trend, after liquidity sweeps, at key levels, and during high-volume sessions.
What timeframe is best for FVG trading?
FVGs work on all timeframes. For best results, identify FVGs on higher timeframes (4H, Daily) for direction, then find entries on lower timeframes (15m, 1H).
Summary
Fair Value Gaps are powerful because they reveal institutional footprints:
- Identification: Three-candle pattern where a gap exists between candles 1 and 3
- Trading: Enter when price retraces into the FVG zone
- Stops: Place beyond the FVG edge
- Targets: Previous structure, next FVG, or liquidity pools
- Filtering: Trade FVGs with trend, after sweeps, during killzones
Master FVG identification first, then combine with order blocks, liquidity sweeps, and multi-timeframe analysis for institutional-grade setups.
Have questions about FVG trading? Join our Discord to discuss with other traders!
