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].

FVG de alta e baixa

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:


⚙️ 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

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:

4️⃣ Verificar Preenchimento

A cada candle, verificar se o preço penetrou a zona do FVG.

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.

Fluxo FVG Horizontal


📐 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: Com TamanhoMinimo = 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):

Zonas de baixa (amarelo):

Quando o preço não retorna à zona:

Preenchimento:

O FVG foi preenchido e as linhas são removidas automaticamente:


🎯 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

Estratégia de retorno


⚠️ 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

➕ Mais informações