Fair Value Gap (FVG) Indicator Guide

Master this indicator with Pine Script code and automated strategies.

What is Fair Value Gap (FVG) Indicator?

A Fair Value Gap is a 3-candle price imbalance: when a candle moves so aggressively that its neighbors' wicks never overlap, it leaves a "gap" where almost no two-way trade occurred. A bullish FVG forms when the current candle's low is above the high from two candles back; a bearish FVG forms when the current high is below the low from two candles back. Smart Money Concepts traders treat these zones as magnets - price frequently returns to "rebalance" the inefficiency before continuing. When price trades back through a gap, the FVG is said to be mitigated (filled) and loses its significance.

How to Use This Strategy

Pro Tip: Trade FVGs with the trend, not against it. In an uptrend, wait for price to pull back into an unmitigated bullish FVG and look for a rejection (long lower wick, bullish engulfing) inside the zone - that is your entry, with a stop below the gap. Fresh gaps on high volume matter most; a gap that has already been partially filled is weaker. Avoid trading every gap: on low timeframes FVGs appear constantly, so filter to the 1-hour chart and above, and prioritize gaps that line up with an order block or key level.

Pine Script Code

Copy and paste this code into your TradingView Pine Editor.

PINE SCRIPT V5
//@version=5
indicator("Fair Value Gaps (FVG)", overlay=true, max_boxes_count=200)

// Inputs
showBull = input.bool(true, "Show Bullish FVGs")
showBear = input.bool(true, "Show Bearish FVGs")
extendBars = input.int(30, "Extend Boxes (bars)", minval=5)

var bullBoxes = array.new_box()
var bearBoxes = array.new_box()

// 3-candle imbalance
bullFVG = low > high[2]
bearFVG = high < low[2]

if bullFVG and showBull
    array.push(bullBoxes, box.new(bar_index - 2, low, bar_index + extendBars, high[2],
         border_color=color.new(color.green, 60), bgcolor=color.new(color.green, 85)))

if bearFVG and showBear
    array.push(bearBoxes, box.new(bar_index - 2, low[2], bar_index + extendBars, high,
         border_color=color.new(color.red, 60), bgcolor=color.new(color.red, 85)))

// Mitigation: delete a bullish FVG once a close fills the gap (trades below its bottom)
if array.size(bullBoxes) > 0
    for i = array.size(bullBoxes) - 1 to 0
        b = array.get(bullBoxes, i)
        if close < box.get_bottom(b)
            box.delete(b)
            array.remove(bullBoxes, i)

// Mitigation: delete a bearish FVG once a close trades above its top
if array.size(bearBoxes) > 0
    for i = array.size(bearBoxes) - 1 to 0
        b = array.get(bearBoxes, i)
        if close > box.get_top(b)
            box.delete(b)
            array.remove(bearBoxes, i)