> ## Documentation Index
> Fetch the complete documentation index at: https://docs.innova-trading.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Fair Value Gap (FVG)

> Cómo configurar la implementación más completa de ICT de la plataforma — BISI/SIBI, ARJO, IFVG, BPR, expiración adaptativa y agregación

## Qué es

Un **Fair Value Gap (FVG)** es una zona de precio donde solo hubo liquidez de un lado del mercado — se forma con una secuencia de 3 velas donde el precio se movió tan rápido que dejó un hueco sin trading en el medio. El indicador **FVG** (id interno `fvg`) es, en cantidad de parámetros, **la implementación ICT más completa de la plataforma**: detección con filtro ATR, clasificación ARJO, expiración adaptativa por temporalidad, agregación de gaps consecutivos, integración con el fractal del ISS y filtrado Premium/Discount.

<Info>
  Si todavía no conocés los conceptos base de estructura y liquidez, empezá por [Estructura de Mercado](/learn/fundamentals/market-structure) y [Trading Institucional — Liquidez](/learn/institutional/liquidity). Esta página cubre **cómo configurar** el indicador, no la teoría ICT completa de FVGs.
</Info>

## Detección del gap

El gap se detecta sobre 3 velas consecutivas (`bar1`, `bar2`, `bar3`): la vela intermedia (`bar2`) debe tener un cuerpo significativo (≥30% de su rango) para que el gap cuente.

| Tipo | Condición | Zona |
| - | - | - |
| **BISI** (Buy-Side Imbalance, Sell-Side Inefficiency) | `bar3.low > bar1.high` | Alcista, `high = bar3.low`, `low = bar1.high` |
| **SIBI** (Sell-Side Imbalance, Buy-Side Inefficiency) | `bar3.high < bar1.low` | Bajista, `high = bar1.low`, `low = bar3.high` |

| Parámetro | Label UI | Default | Rango | Qué hace | Cuándo cambiarlo |
| - | - | - | - | - | - |
| `minGapSize` | Tamaño mínimo del gap (pips) | **0** | 0–100 | `0` = sin filtro de tamaño; cualquier gap detectado se muestra | Subilo para ignorar micro-gaps en pares de alta volatilidad |
| `useATRFilter` | Filtrar por ATR | `false` | bool | Exige que el gap sea al menos `ATR × atrMinMultiplier` | Activalo para un filtro que se adapta a la volatilidad del momento en vez de un valor fijo en pips |
| `atrPeriod` | Periodo ATR | **14** | 5–50 | Periodo del ATR usado por el filtro (solo si `useATRFilter=true`) | Rara vez — 14 es el estándar |
| `atrMinMultiplier` | Multiplicador ATR mínimo | **0.5** | 0.1–3 | Gap mínimo = `ATR × multiplicador` | Subilo para quedarte solo con gaps grandes relativos a la volatilidad |

## Tipos y clasificación ARJO

| Parámetro | Label UI | Default | Opciones | Qué hace |
| - | - | - | - | - |
| `showBISI` | Mostrar BISI (alcistas) | `true` | bool | Muestra/oculta los gaps alcistas |
| `showSIBI` | Mostrar SIBI (bajistas) | `true` | bool | Muestra/oculta los gaps bajistas |
| `arjoFilter` | Filtro ARJO | **`ALL`** | ALL / PERFECT / EXPANSION / PERFECT\_EXPANSION | Filtra por clasificación de la 3ra vela (ver abajo) |
| `hideBreakaway` | Ocultar Breakaway Gaps | `false` | bool | Oculta gaps que probablemente no van a retroceder |

**Clasificación ARJO ("regla de la 3ra vela")** — evalúa cómo cerró `bar3` respecto a `bar2`, mismo criterio en frontend y backend:

* **EXPANSION** (breakaway): BISI si `bar3.close > bar2.high`; SIBI si `bar3.close < bar2.low`. El precio "no tiene intención de volver" — probabilidad de hold más baja de retroceso porque el gap queda atrás como combustible, no como imán.
* **PERFECT**: BISI si `bar3.close > bar2.close` y `bar3` es alcista; SIBI si `bar3.close < bar2.close` y `bar3` es bajista. Mayor probabilidad de que el gap actúe como soporte/resistencia al ser retesteado.
* **REVERSAL**: cualquier otro caso — la vela 3 muestra debilidad, menor probabilidad de hold.

<Warning>
  El schema del backend (`FVGConfigSchema.min_arjo_class` en `backend/schemas/iss_engine.py`) define una escala de letras `A/R/J/O` (default `O`) que **no coincide literalmente** con los 3 valores reales que produce la detección (`EXPANSION`/`PERFECT`/`REVERSAL`). Es configuración interna del motor ISS, no del indicador visual — no asumas que representa niveles adicionales de clasificación ARJO en el gráfico.
</Warning>

## Estados y ciclo de vida

Un FVG recorre: `CREATED → ACTIVE → TESTED / PARTIALLY_FILLED → MITIGATED → INVALIDATED`, con dos estados terminales alternativos, **IFVG** y **BPR** (ver abajo).

| Parámetro | Label UI | Default | Qué hace |
| - | - | - | - |
| `showActive` | Mostrar FVGs activos | `true` | Gaps sin testear todavía |
| `showTested` | Mostrar FVGs testeados | `true` | El precio entró pero no llegó al CE |
| `showMitigated` | Mostrar FVGs mitigados | `false` | El precio alcanzó el CE (50%) o llenó ≥90% del gap |
| `showInvalidated` | Mostrar FVGs invalidados | `false` | El precio cerró completamente a través del gap |
| `showIFVG` | Convertir a IFVG cuando invalida | `true` | Ver sección IFVG |
| `showBPR` | Convertir a BPR cuando mitiga | `false` | Ver sección BPR |

**Mitigación** se clasifica en 4 tipos según cuánto penetró el precio: `CE_TEST` (tocó el 50% pero relleno \<90%), `FULL_FILL` (relleno ≥90% y tocó CE), `PARTIAL` (relleno 25-100% sin tocar CE), `IOFED` (relleno \<25% — entrada superficial, "institutional order flow entry drill").

### IFVG (Inverted FVG)

Cuando un FVG pasa a `INVALIDATED` (el precio cerró a través), el indicador puede convertirlo a **IFVG**: cambia de rol y pasa a actuar como soporte/resistencia en la dirección **opuesta** a su tipo original.

* BISI invalidado → se convierte en **RESISTANCE**.
* SIBI invalidado → se convierte en **SUPPORT**.

Si el precio vuelve a testear ese nivel y es rechazado, el sistema lo marca como *reclaim* (`reclaimCount` incrementa). Controlado por `showIFVG` (default `true`).

### BPR (Balanced Price Range)

Se forma cuando un **BISI** y un **SIBI activos se solapan** en precio — la zona de overlap se interpreta como equilibrio institucional (ni compradores ni vendedores dejaron ineficiencia neta). El umbral mínimo de solapamiento es 10% del gap más chico (`minOverlapPercent`, no expuesto como parámetro en la UI). Controlado por `showBPR` (default `false`).

<Warning>
  El backend detecta además **Vacuum FVGs** (gap ≥3× ATR, actúa como "imán" de precio) y **Propulsion FVGs** (gap que solapa ≥50% con un Order Block activo) — ninguno de los dos está expuesto como filtro en la UI de este indicador (`fvg.definition.ts`), solo existen en `backend/indicators/fvg/detector.py`.
</Warning>

## Expiración adaptativa

| Parámetro | Label UI | Default | Qué hace |
| - | - | - | - |
| `expirationEnabled` | Activar expiración | `true` | Toggle de sección |
| `expirationMode` | Modo de expiración | **`ADAPTIVE`** | Ver tabla de modos abajo |
| `expirationBars` | Barras para expirar | 100 | Solo aplica si `expirationMode=TIME_BARS` (manual) |
| `expirationDays` | Días para expirar | 20 | Solo aplica si `expirationMode=TIME_DAYS` (manual) |
| `maxTouches` | Toques máximos antes de invalidar | 3 | Solo aplica si `expirationMode=RECLAMATION` |

En modo **ADAPTIVE** (el default), la expiración real no usa `expirationBars=100` — usa una tabla fija por temporalidad (`EXPIRATION_BY_TIMEFRAME`):

| Temporalidad | Modo | Valor |
| - | - | - |
| M1 | SESSION | Expira al cambio de sesión de Londres |
| M5 | TIME\_BARS | 200 barras (\~16h) |
| M15 | TIME\_BARS | 100 barras (\~25h) |
| M30 | SESSION | Expira al cambio de sesión de NY |
| H1 | TIME\_DAYS | 5 días (1 semana) |
| H4 | TIME\_DAYS | 20 días (1 mes) |
| D1 | TIME\_DAYS | 60 días (2 meses — estándar ICT) |
| W1 | MATRIX\_RESET | 20 periodos |

Otros modos disponibles manualmente: `SESSION` (expira al cambio de sesión — Asia/Londres/NY/killzones), `MITIGATION` (expira cuando el estado pasa a `MITIGATED`), `RECLAMATION` (expira al N-ésimo toque, usa `maxTouches`), `NEW_FRACTAL` (expira cuando el ISS detecta un nuevo rango de estructura), `MATRIX_RESET` (expira tras N periodos fijos), `MANUAL` (nunca expira automáticamente).

<Warning>
  **Tres valores distintos para "edad máxima" según dónde mires:** la UI expone `expirationBars=100` (solo aplica en modo manual `TIME_BARS`); el detector standalone del backend (`backend/indicators/fvg/detector.py`) usa `max_fvg_age=50`; el schema del motor ISS (`FVGConfigSchema.max_bars_without_mitigation`) también usa `50`. No son el mismo número ni necesariamente el mismo concepto — no asumas que coinciden.
</Warning>

## Agregación de FVGs consecutivos

Cuando el precio deja varios gaps seguidos en la misma dirección, el indicador puede tratarlos como un solo bloque en vez de mostrarlos todos.

| Parámetro | Label UI | Default | Qué hace |
| - | - | - | - |
| `aggregationEnabled` | Activar agregación de FVGs | `false` | Toggle de sección |
| `aggregationMode` | Modo de agregación | **`NONE`** | Ver tabla abajo |
| `consecutiveThreshold` | Barras max entre FVGs | 3 | Distancia máxima (en barras de formación) para considerar dos FVGs "consecutivos" |

Dos FVGs se consideran consecutivos si son del mismo tipo (ambos BISI o ambos SIBI), están separados por ≤`consecutiveThreshold` barras, y se solapan o están muy cerca en precio (tolerancia \~10% del tamaño del gap).

| Modo | Qué hace |
| - | - |
| `NONE` (default) | Sin agregación, muestra todos individualmente |
| `FIRST` | Solo el primer FVG de la serie consecutiva |
| `LAST` | Solo el último FVG de la serie |
| `AVERAGE_CE` | Fusiona en un rango completo, CE = promedio de los CE individuales (pierde clasificación ARJO) |
| `MERGED` | Fusiona en un rango completo, CE = punto medio del rango fusionado |

<Warning>
  El selector de la UI también ofrece **`HIGHEST`** ("El más alto, para SIBI") y **`LOWEST`** ("El más bajo, para BISI"), pero la implementación real (`frontend/components/indicators/fvg/aggregation.ts`) **no tiene lógica para esos dos modos** — el switch cae al `default` y no aplica ninguna agregación (se comporta como `NONE`). Si necesitás ese comportamiento, usá `AVERAGE_CE` o `MERGED` en su lugar.
</Warning>

## Filtro fractal / integración con ISS

Conecta el FVG con el motor [ISS](/learn/indicators/innova-smart-structure) (o con Swing Points) para filtrar gaps según el contexto de estructura en el que se formaron, en vez de mostrar todos los gaps del historial sin criterio.

| Parámetro | Label UI | Default | Opciones | Qué hace |
| - | - | - | - | - |
| `fractalFilterEnabled` | Filtrar por Fractal (ISS) | `false` | bool | Toggle de sección |
| `fractalFilterMode` | Modo de Fractal | **`ALL`** | ALL / CURRENT\_FRACTAL / PREVIOUS\_FRACTAL / EXPANSION\_ONLY / RETRACEMENT\_ONLY / PREMIUM\_ONLY / DISCOUNT\_ONLY | Qué FVGs mostrar según el fractal activo |
| `fractalShowOutOfFractal` | Mostrar fuera de fractal (dimmed) | `true` | bool | Muestra los FVGs de otros fractales con opacidad reducida en vez de ocultarlos |
| `fractalOutOfFractalOpacity` | Opacidad fuera de fractal | 0.3 | 0.1–0.9 | Nivel de atenuación |
| `fractalLabelPhase` | Mostrar fase en etiqueta | `true` | bool | Agrega `EXP`/`RET`/`CON` a la etiqueta del FVG |

Cada FVG se enriquece con contexto del ISS al momento de formarse: **fase de mercado** (`EXPANSION` si hubo un break reciente, `RETRACEMENT` si el precio retrocede contra tendencia, `CONSOLIDATION` en rango) y **origen del fractal** (`CURRENT`, `PREVIOUS`, o `FORMING` si está cerca del extremo del rango activo).

## Premium / Discount

| Parámetro | Label UI | Default | Qué hace |
| - | - | - | - |
| `premiumDiscountEnabled` | Filtrar por Premium/Discount | `false` | Toggle de sección |
| `premiumDiscountSource` | Fuente del rango | **`ISS`** | ISS / Swing Points / Quarterly True Opens / Monthly-Weekly Open / Rango del día / Rango de sesión |
| `showOnlyBISIInDiscount` | Solo BISI en Discount | `true` | Regla ICT: BISI (alcista) debería formarse en zona barata |
| `showOnlySIBIInPremium` | Solo SIBI en Premium | `true` | Regla ICT: SIBI (bajista) debería formarse en zona cara |

<Warning>
  De las 7 fuentes que ofrece el selector, solo **ISS**, **Swing Points** y **Quarterly** están realmente implementadas — `Monthly Open`, `Weekly Open`, `Rango del día` y `Rango de sesión` caen todos silenciosamente al rango del ISS como fallback (`getPriceRange` en `premium-discount.ts`). Elegirlas en el panel no rompe nada, pero tampoco usa el rango que dice el nombre.
</Warning>

## Display

| Parámetro | Label UI | Default | Qué hace |
| - | - | - | - |
| `showCE` | Mostrar línea CE (50%) | `true` | Nivel de Consequent Encroachment |
| `showQuartiles` | Mostrar cuartiles (25%, 75%) | `false` | Niveles adicionales para entradas más precisas |
| `showOpeningPrice` | Mostrar Opening Price | `false` | Apertura de la vela 2 |
| `showLabels` | Mostrar etiquetas | `true` | — |
| `labelPosition` | Posición de etiquetas | `RIGHT` | LEFT / RIGHT / CENTER |
| `extendRight` | Extender a la derecha (barras) | 50 | Cuántas barras se dibuja el rectángulo hacia adelante |
| `maxFVGs` | Máximo de FVGs visibles | 50 | El límite prioriza los FVGs más recientes por tiempo de formación (no por índice de barra) |

## Presets

| Preset | Qué cambia | Perfil |
| - | - | - |
| **Estándar ICT** | `arjoFilter=ALL`, `expirationMode=ADAPTIVE`, `showCE/showLabels=true` | Uso general |
| **Conservador** | `arjoFilter=PERFECT_EXPANSION`, `hideBreakaway=true`, `expirationMode=RECLAMATION`, `maxTouches=2` | Solo gaps de alta probabilidad |
| **Scalping** | `expirationMode=SESSION`, `maxFVGs=10`, `aggregationMode=LAST`, `extendRight=20` | FVGs recientes, gráfico limpio |
| **Swing Trading** | `expirationMode=TIME_DAYS` (20d), `structureContextEnabled=true`, `structureSource=ISS`, `showQuartiles=true` | Mayor temporalidad con contexto de estructura |
| **Premium/Discount** | `premiumDiscountEnabled=true`, `source=ISS`, ambos filtros BISI/SIBI activos | Solo gaps con confluencia de zona |
| **FVGs Agregados** | `aggregationMode=AVERAGE_CE`, `consecutiveThreshold=5` | Fusiona series de gaps consecutivos |
| **Debug** | Muestra todos los estados, `expirationEnabled=false`, `maxFVGs=200` | Diagnóstico, ver todo lo detectado |
| **Fractal Actual** | `fractalFilterMode=CURRENT_FRACTAL`, `fractalShowOutOfFractal=false` | Solo FVGs del fractal activo desde el último BOS/CHoCH |
| **Entrada en Retroceso** | `fractalFilterMode=RETRACEMENT_ONLY`, `showMitigated=false` | Gaps formados durante el pullback, para entradas |
| **Post-Breakout** | `fractalFilterMode=EXPANSION_ONLY`, `arjoFilter=PERFECT_EXPANSION` | Gaps de expansión inmediatamente después de un break |

## Recetas

<AccordionGroup>
  <Accordion title="1. Solo gaps con confluencia ICT completa">
    Preset **Estilo ICT** del [ISS](/learn/indicators/innova-smart-structure) (validación `CLOSE`, `STRUCTURAL`) + FVG con `structureContextEnabled=true`, `structureSource=ISS`, `fractalFilterMode=CURRENT_FRACTAL`, `arjoFilter=PERFECT_EXPANSION`, `premiumDiscountEnabled=true`. Te quedás solo con gaps del fractal activo, de alta probabilidad ARJO, y en la zona de precio correcta (Discount para BISI, Premium para SIBI).
  </Accordion>

  <Accordion title="2. Scalping M1/M5 con gaps recientes">
    Preset **Scalping**: `expirationMode=SESSION` (expira al cierre de Londres/NY), `maxFVGs=10`, `extendRight=20`. Combinalo con `aggregationEnabled=true`, `aggregationMode=LAST` para no ensuciar el gráfico con series de micro-gaps del mismo movimiento.
  </Accordion>

  <Accordion title="3. Swing trading con expiración larga">
    Preset **Swing Trading**: `expirationMode=TIME_DAYS` a 20 días, contexto de estructura activado contra el ISS. Sumale `showQuartiles=true` para afinar el punto de entrada dentro del gap (25%/75%) en vez de solo el CE.
  </Accordion>
</AccordionGroup>

<Note>
  Los archivos internos `FVG_KNOWLEDGE.md` y `FVG_INSIGHTS.md` (en `frontend/components/indicators/fvg/`) son notas de investigación del equipo con teoría ICT extendida (IOFED, IPDA, Silver Bullet, narrativa MTF) — útiles como contexto conceptual, pero no son spec de producto verificada línea por línea.
</Note>

***

<CardGroup cols={2}>
  <Card title="Innova Smart Structure (ISS)" icon="sitemap" href="/learn/indicators/innova-smart-structure">
    El motor de estructura del que el FVG puede heredar fractal, rango y Premium/Discount.
  </Card>

  <Card title="PD Array Matrix" icon="grid-2" href="/learn/indicators/pd-array-matrix">
    El FVG es uno de los 6 tipos de array que alimentan el Market Intention Score agregado.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.