Tabela de conteúdos
Indicador de Fair Value Gap (FVG)
Download
Vídeos
Resumo
📋 Descrição
Indicador que detecta Fair Value Gaps (FVGs) de alta e baixa e plota os limites superior e inferior das zonas de desequilíbrio de alta e baixa diretamente no gráfico de preços.
🎯 O que é o Fair Value Gap
O Fair Value Gap é uma zona de desequilíbrio de preço criada por movimentos agressivos.
Em condições normais, cada nível de preço é negociado por compradores e vendedores. Quando o preço se desloca rápido demais, ele pula níveis inteiros sem negociação equilibrada. Esses níveis pulados formam o FVG. O mercado tende a retornar a essa região antes de continuar o movimento.
O Fair Value Gap é uma estrutura de três candles onde o candle do meio se move com força suficiente para deixar uma região sem cobertura entre os candles adjacentes.
🕯️ A Mecânica dos 3 Candles
O FVG é identificado olhando para 3 candles consecutivos. O candle do meio é o candle de impulso — tão grande que cria uma lacuna entre o anterior e o posterior.
| 📈 FVG de Alta | 📉 FVG de Baixa |
|---|---|
Minima[0] está acima da Maxima[2] | Maxima[0] está abaixo da Minima[2] |
| Gap representa uma área de suporte potencial. | Gap representa uma área de resistência potencial. |
O FVG existe quando não há sobreposição entre as sombras do Candle[0] e do Candle[2].
O conceito é associado ao framework de Smart Money Concepts (SMC) que analisa fluxo de ordens institucionais.
Diferente de gaps tradicionais de abertura de sessão, o FVG ocorre dentro de uma sequência de candles consecutivos.
Mercados e timeframes:
- Qualquer ativo com candles (futuros, ações, forex, cripto).
- Mais relevante em 5, 15 e 60 minutos, onde movimentos institucionais são mais visíveis.
⚙️ Como Funciona
1️⃣ Identificação do padrão
Para cada candle fechado, o indicador analisa três posições consecutivas:
Candle[2] (referência) → Candle[1] (impulso) → Candle[0] (confirmação)
2️⃣ Detectar FVG
- Comparar a mínima atual com a máxima de 2 candles atrás. Se a mínima for maior, existe um gap de alta.
- Comparar a máxima atual com a mínima de 2 candles atrás. Se a máxima for menor, existe um gap de baixa.
O FVG é confirmado apenas quando o terceiro candle fecha, sem repintura.
3️⃣ Plotagem dos limites
Quando um FVG é detectado e passa no filtro de tamanho mínimo, dois plots são gerados:
- O limite superior e o limite inferior da zona.
- Os plots permanecem no gráfico até o próximo FVG ser detectado naquela direção.
4️⃣ Verificar Preenchimento
A cada candle, verificar se o preço penetrou a zona do FVG.
- Se a mínima tocar o limite inferior (alta) ou a máxima tocar o limite superior (baixa), o FVG foi preenchido e as linhas desaparecem.
5️⃣ Expirar por Tempo
Se o FVG não for preenchido dentro do número máximo de candles configurado, ele expira automaticamente e as linhas são removidas.
📐 Fórmulas
Detecção do FVG:
FVG de Alta: Minima > Maxima[2] FVG de Baixa: Maxima < Minima[2]
Filtro de tamanho mínimo (em % do preço):
tamanhoGap = (limSuperior - limInferior) / Fechamento * 100
Linha do meio (50% da zona):
meio = (limSuperior + limInferior) / 2
Condições de invalidação:
Preenchimento Alta: Minima <= limInferior Preenchimento Baixa: Maxima >= limSuperior Expiração: idade > MaxCandles
🎛️ Parâmetros
| Parâmetro | Padrão | Descrição |
|---|---|---|
TamanhoMinimo | 0.5 | Tamanho minimo do gap em % do preco |
MaxCandles | 10 | Candles ate expiração (0 = sem expiração) |
⚠️ Nota: ComTamanhoMinimo = 0, todos os gaps são plotados, incluindo gaps muito pequenos sem relevância operacional. Em timeframes baixos, ajuste o filtro para reduzir ruído.
💻 Código NTSL
// ===== INDICADOR DE FAIR VALUE GAP (FVG) =====
// Detecta FVGs de alta e baixa com filtro de tamanho.
// Linhas retroativas ate a barra de formacao do gap.
// Persistem ate preenchimento ou expiracao.
const
corAlta = clVerdeLimao;
corBaixa = clAmarelo;
parametro
TamanhoMinimo(0.5); // tamanho minimo do gap em % do preco
MaxCandles(10); // candles ate expiracao (0 = sem expiracao)
var
tamanhoGap, tamanhoPerc, meioAlta, meioBaixa : real;
altaSup, altaInf, baixaSup, baixaInf : real;
altaData, baixaData : inteiro;
altaHora, baixaHora : inteiro;
altaIdade, baixaIdade : inteiro;
refData2, refHora2 : inteiro;
fvgAlta, fvgBaixa : booleano;
inicio
// Capturar acessos posicionais fora de condicionais
refData2 := Date[2];
refHora2 := Time[2];
// ========== DETECTAR FVG DE ALTA ==========
tamanhoGap := Minima - Maxima[2];
tamanhoPerc := (tamanhoGap / Fechamento * 100);
se (tamanhoGap > 0) e (tamanhoPerc >= TamanhoMinimo) entao
inicio
altaSup := Minima;
altaInf := Maxima[2];
fvgAlta := verdadeiro;
altaIdade := 0;
altaData := refData2;
altaHora := refHora2;
fim;
// ========== DETECTAR FVG DE BAIXA ==========
tamanhoGap := Minima[2] - Maxima;
tamanhoPerc := (tamanhoGap / Fechamento * 100);
se (tamanhoGap > 0) e (tamanhoPerc >= TamanhoMinimo) entao
inicio
baixaSup := Minima[2];
baixaInf := Maxima;
fvgBaixa := verdadeiro;
baixaIdade := 0;
baixaData := refData2;
baixaHora := refHora2;
fim;
// ========== PLOTAR FVG DE ALTA ==========
se fvgAlta entao
inicio
meioAlta := (altaSup + altaInf) / 2;
LineSegment(altaSup, altaSup, altaData, Date, falso, "", CorAlta, 1, 0, 0, 0, altaHora, Time);
LineSegment(altaInf, altaInf, altaData, Date, falso, "", CorAlta, 1, 0, 0, 0, altaHora, Time);
LineSegment(meioAlta, meioAlta, altaData, Date, falso, "", CorAlta, 1, 2, 0, 0, altaHora, Time);
fim;
// ========== PLOTAR FVG DE BAIXA ==========
se fvgBaixa entao
inicio
meioBaixa := (baixaSup + baixaInf) / 2;
LineSegment(baixaSup, baixaSup, baixaData, Date, falso, "", CorBaixa, 1, 0, 0, 0, baixaHora, Time);
LineSegment(baixaInf, baixaInf, baixaData, Date, falso, "", CorBaixa, 1, 0, 0, 0, baixaHora, Time);
LineSegment(meioBaixa, meioBaixa, baixaData, Date, falso, "", CorBaixa, 1, 2, 0, 0, baixaHora, Time);
fim;
// ========== VERIFICAR PREENCHIMENTO ==========
se fvgAlta e (Minima <= altaInf) entao
fvgAlta := falso;
se fvgBaixa e (Maxima >= baixaSup) entao
fvgBaixa := falso;
// ========== VERIFICAR EXPIRACAO ==========
se (MaxCandles > 0) entao
inicio
se fvgAlta entao
inicio
altaIdade := altaIdade + 1;
Se (altaIdade > MaxCandles) entao
fvgAlta := falso;
fim;
se fvgBaixa entao
inicio
baixaIdade := baixaIdade + 1;
se (baixaIdade > MaxCandles) entao
fvgBaixa := falso;
fim;
fim;
fim;
⚠️ Importante
Nota sobre acessos posicionais:
Em NTSL, acessar séries de datas com deslocamento (como Date[2], Time[2]) dentro de blocos condicionais (se…entao) ou laços (para…faca) produz comportamento indefinido.
O compilador emite o aviso: “Acessos a contextos posicionais dentro de escopos condicionais e de laços possuem comportamento indefinido!”.
Para evitar esse problema, capture os valores posicionais em variáveis simples antes de qualquer condicional e use as variáveis dentro dos blocos.
<br>
❌ Problema: Date[2] dentro de se ⇒ comportamento indefinido.
se condicao entao minhaData := Date[2];
✅ Seguro: capturar fora, usar dentro.
refData := Date[2]; se condicao entao minhaData := refData;
🔍 Como Interpretar
| Elemento | Cor | Significado |
|---|---|---|
| Linha superior | 🟢 Verde-limão | Topo da zona de alta (Minima do candle de confirmação) |
| Linha inferior | 🟢 Verde-limão | Base da zona de alta (Maxima[2] do candle de referência) |
| Linha tracejada | 🟢 Verde-limão | Ponto médio (50%) da zona de alta |
| Linha superior | 🟡 Amarelo | Topo da zona de baixa (Minima[2] do candle de referência) |
| Linha inferior | 🟡 Amarelo | Base da zona de baixa (Maxima do candle de confirmação) |
| Linha tracejada | 🟡 Amarelo | Ponto médio (50%) da zona de baixa |
As linhas começam no candle de referência (Candle[2]) e se estendem até a barra atual. Quando o FVG é preenchido ou expira, as linhas desaparecem.
Zonas de alta (verde-limão):
- Representam regiões onde houve desequilíbrio favorável a compradores.
- Quando o preço retorna a essa faixa, a zona funciona como suporte potencial.
- A linha do meio (50%) marca o nível de retração mais provável.
Zonas de baixa (amarelo):
- Representam o desequilíbrio oposto, vendedores dominaram o movimento.
- A zona funciona como resistência potencial em retestes descendentes.
Quando o preço não retorna à zona:
- Indica força no movimento vigente.
- A zona expira após o número configurado de candles (
MaxCandles) ou permanece como referência se a expiração estiver desativada.
Preenchimento:
O FVG foi preenchido e as linhas são removidas automaticamente:
- Alta: Quando a mínima toca o limite inferior
- Baixa: Quando a máxima toca o limite superior
🎯 Estratégia de Retorno à Zona
| Passo | Ação |
|---|---|
| 1️⃣ | Identifique o FVG formado após um movimento impulsivo |
| 2️⃣ | Aguarde o preço retornar à zona do FVG (entre as linhas) |
| 3️⃣ | Confirme com price action no retorno (pin bar, engolfo, rejeição) |
| 4️⃣ | Entre na direção do movimento original (a favor do impulso) |
| 5️⃣ | Stop abaixo/acima do limite oposto do FVG |
⚠️ Limitações
| Limitação | Descrição |
|---|---|
| Um FVG por direção | O indicador rastreia apenas o FVG mais recente de alta e o mais recente de baixa. Um novo FVG substitui o anterior na mesma direção |
| Defasagem de 1 candle | O padrão é confirmado no fechamento do candle atual — há um candle de defasagem entre a formação e a detecção |
| Alta frequência em timeframes baixos | Em 1 minuto, FVGs são gerados com frequência alta — ajuste TamanhoMinimo para filtrar zonas irrelevantes |
| Contexto não incluído | O indicador não distingue FVGs a favor ou contra a tendência. Essa análise depende do operador |




