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

# Innova Smart Structure (ISS)

> Cómo configurar el motor de estructura de mercado — swing points, jerarquía ST/IT/LT, BOS/CHoCH, rangos y niveles N1/N2

## Qué es el ISS

**Innova Smart Structure (ISS) no es "un indicador más" — es un motor.** Todos los demás módulos de estructura (rangos dinámicos, líneas de break, FVGs con contexto de fractal, el panel de stats multi-temporalidad) leen del mismo cálculo central:

```
TICKS → BARS → ISS ENGINE → STATE MANAGER / EVENT EMITTER / QUERIES
                                    ↓
                          CONSUMERS (Backtest, Señales, Frontend, Bloques)
```

En la práctica esto significa que cuando configurás el ISS no estás ajustando "un dibujito en el gráfico" — estás ajustando la fuente de verdad que también usan el backtest, el motor de señales y otros indicadores (por ejemplo, FVG puede filtrar sus gaps usando el fractal que calcula el ISS).

<Info>
  Si todavía no tenés claro qué es un swing point, un BOS o un CHoCH, empezá por [Estructura de Mercado](/learn/fundamentals/market-structure) y [Swing Points](/learn/fundamentals/swing-points) — acá asumimos que ya conocés la teoría y nos enfocamos en **cómo configurarlo**.
</Info>

El indicador en el gráfico se llama **ISS** (id interno `innovastructure`) y equivale conceptualmente a "Smart Money Concepts (SMC)" de LuxAlgo en TradingView, pero con validación configurable, dos niveles de análisis (N1/N2) y filtros de ruptura que ese indicador no tiene.

***

## Swing Points — la base de todo

Antes de poder dibujar un rango o detectar un CHoCH, el ISS necesita saber dónde están los puntos de giro del precio. Esto se configura en la sección **Detección**.

### Método de detección

El motor soporta tres métodos (`SwingDetectionConfig.detection_method` en el backend):

| Método | Cómo funciona | Cuándo usarlo |
| - | - | - |
| **fractal** (default) | Compara cada vela contra N barras a cada lado (criterio clásico de swing) | Uso general — es el método que usa toda la plataforma hoy |
| **zigzag** | Requiere una desviación mínima de precio (`zigzag_deviation`, default 5.0) antes de marcar un nuevo swing | Útil para filtrar ruido en activos muy volátiles, pero no está expuesto en ninguna UI de indicador todavía |
| **atr** | Requiere un movimiento mínimo de N × ATR (`atr_multiplier`, default 1.5) | Se adapta automáticamente a la volatilidad del momento, tampoco expuesto en UI hoy |

<Warning>
  **El indicador ISS y el indicador Swing Points solo exponen el método `fractal` en su UI.** `zigzag` y `atr` existen en el schema del backend (`backend/schemas/iss_engine.py`) y están disponibles vía API (`POST /api/iss/query` con `swing_config_overrides`) o trading-bridge, pero hoy no hay un selector visual para cambiarlos.
</Warning>

### Fuerza del fractal (`swing_strength`)

Cuántas barras a cada lado deben tener un high/low menor (o mayor) para confirmar el swing. Es el parámetro más importante de todo el motor — todo lo demás depende de qué swings detectó primero.

| Valor | Efecto | Cuándo subirlo |
| - | - | - |
| **1** (default en ISS) | Máxima sensibilidad — cualquier vela con 1 vecino menor a cada lado ya es swing | TFs altos (H4, D1) donde cada giro ya es relevante, o para no perderte ningún matiz de estructura |
| **2** | Filtra swings menores obvios | TFs intradía ruidosos (M15-H1) |
| **3-5** | Solo giros significativos | Detectar bias de swing trading, filtrar ruido en M1-M5 |

<Warning>
  **Discrepancia UI vs backend:** el schema (`SwingDetectionConfig.swing_strength`) permite hasta `10` (`le=10`). La UI del ISS y la de Swing Points limitan el slider a **máximo 5**. Si necesitás más de 5 tenés que llamar la API directamente con `swing_config_overrides`.
</Warning>

### Validación por precio

Un swing recién detectado no es automáticamente "confirmado" — puede quedar en estado `ACTIVO` esperando que el precio lo valide.

* **`validationEnabled`** (default `true` en ISS): si está apagado, todo candidato pasa a `VALIDADO` de inmediato — más rápido, más ruido.
* **`validationType`** (default `WICK`): qué parte de la vela debe confirmar el swing.
  * `WICK`: cualquier mecha (high/low) — el más permisivo.
  * `BODY`: solo apertura o cierre.
  * `CLOSE`: solo el cierre — el más estricto, menos falsos swings.

### Pause Mode (Larry Williams)

Controla qué pasa durante la "pausa" que sigue a un swing recién formado — el período en el que técnicamente todavía podría aparecer un swing más extremo antes de que el anterior quede confirmado.

| Modo | Comportamiento |
| - | - |
| **strict** | Durante la pausa, el motor **no** evalúa nuevos candidatos |
| **flexible** | Durante la pausa **sí** detecta candidatos nuevos y los deja en cola, liberándolos cuando corresponde |
| **none** | Sin pausa — detecta todos los swings fractales sin esperar confirmación |

<Warning>
  **Discrepancia UI vs backend:** el default del schema (`PauseMode`) es **`FLEXIBLE`**. Tanto el indicador ISS como el indicador Swing Points arrancan con **`strict`** en su UI (confirmado en `useInnovaStructure.ts` y en `swingpoints.definition.ts`). El comportamiento real que ve un usuario que arrastra el indicador al gráfico sin tocar nada es `strict`, no `flexible`.
</Warning>

### Filtros de ruido

Estos existen en `SwingDetectionConfig` pero **no están expuestos en la UI de ningún indicador de estructura hoy** (ISS ni Swing Points). Solo son accesibles vía API/trading-bridge:

| Parámetro | Default | Qué hace |
| - | - | - |
| `min_swing_size_pips` | 0 (sin filtro) | Ignora swings cuyo movimiento desde el swing anterior sea menor a X pips |
| `min_swing_size_percent` | 0 (sin filtro) | Igual que arriba pero en % del precio |
| `ignore_inside_bars` | `false` | No considera velas "inside bar" como candidatas a swing |
| `ignore_doji_swings` | `false` | No considera velas doji (cuerpo casi nulo) como candidatas a swing |

***

## Jerarquía ST/IT/LT (Larry Williams)

Una vez detectados los swings, el motor los clasifica en tres niveles jerárquicos según el método de Larry Williams (*Long-Term Secrets to Short-Term Trading*, capítulo 1). **La clasificación es estructural, no numérica** — no depende de un lookback en barras, sino de la relación de cada swing con sus vecinos del mismo tipo.

<Steps>
  <Step title="Todo swing arranca como ST (Short Term)">
    Cualquier swing high/low detectado por el fractal es, por definición, un ST.
  </Step>

  <Step title="Un ST se vuelve IT (Intermediate) si sus dos vecinos ST son más débiles">
    Un ST High es **IT High** si el ST High anterior y el ST High siguiente son **ambos más bajos**. Un ST Low es **IT Low** si sus vecinos ST Low son **ambos más altos**.
  </Step>

  <Step title="Un IT se vuelve LT (Long Term) con la misma regla, un nivel arriba">
    Un IT High es **LT High** si el IT High anterior y el siguiente son ambos más bajos. Análogo para IT Low → LT Low.
  </Step>
</Steps>

```
ST  ST  ST  ST  ST     ← todos los swings fractales
 \  |  IT  |  /        ← IT = ST rodeado de ST más débiles a ambos lados
    \  LT  /           ← LT = IT rodeado de IT más débiles a ambos lados
```

<Tip>
  **Cómo leer tendencia con la jerarquía:** mirá los swings **IT** — si forman HH/HL (higher highs, higher lows) consecutivos, la tendencia **intermedia** es alcista. Si los swings **LT** también forman HH/HL, tenés confluencia de tendencia de corto, medio y largo plazo — la señal más fuerte. Cuando el ST dice una cosa y el IT dice otra, el IT manda (es la estructura "padre").
</Tip>

Un vecino más importante para el trading: como un swing recién formado empieza siendo ST, **su clasificación puede cambiar** (subir a IT, y eventualmente a LT) a medida que aparecen nuevos swings que lo confirman como extremo local. El motor reclasifica automáticamente en cada actualización.

### Cómo activarla

* **Swing Points** (indicador standalone): toggle `showHierarchy` (default `false`) + preset dedicado **"Larry Williams (Jerarquía)"**.
* **ISS**: la jerarquía se calcula siempre internamente (alimenta `derived_levels` con `it_low_1/2`, `it_high_1/2`, `lt_low_1/2`, `lt_high_1/2`) pero no tiene un toggle visual propio en el panel — se consume vía `all_swings` (cada swing trae su campo `hierarchy`).

### Modo de clasificación (HH/HL/LH/LL)

Independiente de ST/IT/LT, cada swing también recibe una etiqueta HH/HL/LH/LL/FIRST (`classification_mode`):

| Modo | Qué hace |
| - | - |
| **structural** (default backend, y el único que expone el ISS UI — el campo fue removido de la UI del ISS y queda fijo en `STRUCTURAL`) | Solo clasifica los **extremos de cada segmento fractal** — el modo "correcto" para ICT según el comentario en el código fuente |
| **immediate** | Clasifica apenas se detecta el swing, sin esperar confirmación |
| **confirmed** | Solo clasifica swings ya `VALIDADO`, con un swing opuesto intermedio |

El indicador **Swing Points** sí deja elegir los 3 modos (`classificationMode`, default `STRUCTURAL`).

***

## Estructura: BOS vs CHoCH

* **BOS (Break of Structure):** el precio rompe un swing **en la dirección** de la tendencia actual → confirma continuación.
* **CHoCH (Change of Character):** el precio rompe un swing **en contra** de la tendencia actual → alerta de posible reversión.

(Ver la teoría completa en [Estructura de Mercado](/learn/fundamentals/market-structure).) Lo que documentamos acá es cómo el ISS decide **cuándo considerar que un break ocurrió de verdad**.

### Validación de la ruptura

`rangeBreakValidation` (UI, default `BODY`) define qué parte de la vela debe romper el nivel:

| Valor | Requiere |
| - | - |
| `WICK` | Cualquier parte de la vela toca/cruza el nivel |
| `BODY` (default UI) | Apertura o cierre cruza |
| `CLOSE` | Solo el cierre cruza — el más estricto |

<Warning>
  **Discrepancia UI vs backend:** el schema `CHoCHBOSConfig.break_validation` tiene default `CLOSE` (además soporta `OPEN`, `CLOSE_ABOVE` y `CLOSE_BELOW`, que no están en la UI). La UI del ISS arranca en `BODY`, no en `CLOSE`. La UI tampoco expone `require_candle_close` (default backend `true`) ni `confirmation_bars` (default backend `0`) como toggles independientes.
</Warning>

### Filtros de tamaño de ruptura

Para evitar que un micro-quiebre por 0.1 pip cuente como BOS/CHoCH real, hay 4 formas de exigir un tamaño mínimo (`breakFilterType`, default `NONE` — coincide con el backend):

| Tipo | Campo(s) UI | Default | Qué exige |
| - | - | - | - |
| **Sin filtro** (`NONE`) | — | — | Cualquier ruptura cuenta |
| **Pips** (`PIPS`) | `minBreakPips` | 10 | La ruptura debe superar el nivel por al menos N pips |
| **Porcentaje** (`PERCENTAGE`) | `minBreakPercent` | 0.5% | La ruptura debe superar el nivel por al menos N% del precio |
| **ATR** (`ATR`) | `atrMultiplier` + `atrPeriod` | 0.5 × ATR(14) | La ruptura debe superar el nivel por al menos N veces el ATR |

El backend además soporta `RANGE_PERCENT` (% del rango actual) que no está en la UI.

<Info>
  Un cuarto knob, `pipValue` (default `0.0001`), es un **campo de conveniencia solo de la UI** para convertir "pips" a unidades de precio reales según el instrumento (forex vs oro vs cripto) — no existe como tal en el schema Pydantic.
</Info>

***

## Rangos: cómo se define la "caja"

El ISS dibuja un rango dinámico (`rangeHigh`/`rangeLow`) entre dos swings — ese rango es la base de Premium/Discount y de los break lines. Hay dos conceptos que se confunden fácilmente porque comparten nombre en la UI:

<Warning>
  **Ojo con el nombre:** el campo `detectionMode` de la sección "Detección" del ISS, etiquetado como **"Modo de Swing"**, en realidad no cambia el algoritmo de detección de swings — controla `RangeDetectionMode`, es decir, **qué swing define el límite del rango**. El método de detección del swing en sí (`fractal`/`zigzag`/`atr`, visto arriba) es un campo distinto que hoy no está expuesto en esta UI.
</Warning>

| Modo (`detectionMode`) | Qué swing usa como límite del rango |
| - | - |
| **FRACTAL** (default) | El swing más **extremo** (precio máximo/mínimo) del segmento — rangos más "correctos" pero menos reactivos |
| **PREBREAK** | El swing más **reciente** antes del break — rangos más ajustados y reactivos, útil para scalping |

El backend además define `ULTIMATE` (solo considera swings desde el último CHoCH) — ese modo no se selecciona directamente acá; es, en la práctica, lo que hace el **Nivel 2** del ISS (ver abajo).

### Premium / Discount / Equilibrium

El rango se divide en zonas usando la posición del precio como % del rango (0 = low, 100 = high):

| Zona | Threshold backend (default) | Significado |
| - | - | - |
| **Discount** | debajo de `discount_threshold` (50%) | Zona favorable para comprar |
| **Premium** | arriba de `premium_threshold` (50%) | Zona favorable para vender |
| **Equilibrium** | banda de `equilibrium_zone` (±5% alrededor del 50%) | Zona de transición/indecisión |

<Warning>
  Estos tres thresholds (`RangeConfig.premium_threshold`, `discount_threshold`, `equilibrium_zone`) **no tienen ningún control en la UI del ISS hoy** — se calculan siempre con los defaults del backend (50/50, banda de 5%). Solo son ajustables llamando la API directamente. El indicador FVG sí puede *consumir* esa clasificación (Premium/Discount) para filtrar gaps, pero tampoco puede cambiar los thresholds.
</Warning>

***

## N1 vs N2 (Ultimate) — los dos niveles del ISS

El ISS puede mostrar simultáneamente **dos niveles de estructura sobre el mismo gráfico**, sin cambiar de temporalidad:

<Tabs>
  <Tab title="N1 — Estructura Micro">
    * Toggle: `showN1` (default `true`)
    * Es el análisis "normal": swings fractales del timeframe actual, rango dinámico, CHoCH/BOS.
    * Sub-toggles: `showRangeLines`, `showCHoCH`, `showBOS`, `showImpulseCount` (contador de velas de impulso desde el último break).
  </Tab>

  <Tab title="N2 — Ultimate (Macro)">
    * Toggle: `showUltimate` (default `false` — apagado por defecto)
    * **No es un timeframe distinto** — se alimenta de los eventos CHoCH del propio N1. Cada CHoCH de N1 se convierte en un candidato de swing "Ultimate" (`UltimateSwingSchema.source_choch_type`); el ISS arma un rango y detecta CHoCH/BOS **sobre esos macro-swings**, produciendo una lectura equivalente a "la estructura de un timeframe superior", pero calculada sobre el mismo gráfico.
    * Sub-toggles: `showUltimateRange`, `showUltimateCHoCH`, `showUltimateBOS`, `showUltimateImpulseCount`.
    * Eventos propios: `U-CHoCH` / `U-BOS` (prefijo "Ultimate" en el `BreakLine.type`).
  </Tab>
</Tabs>

<Tip>
  **Patrón de uso típico:** activar N2 para leer el **bias** (¿el "timeframe superior sintético" está en tendencia alcista o bajista?) y usar N1 para el **timing** de la entrada — solo tomar señales de N1 que vayan en la dirección del último evento N2. Es el mismo principio de "HTF bias + LTF entry" pero sin cambiar de gráfico.
</Tip>

### Panel de estadísticas MTF

Además de N1/N2, el ISS tiene un panel flotante opcional (`showISSStatsPanel`, default `false`) que muestra el estado de estructura de hasta 4 temporalidades simultáneas (`statsTF1`-`statsTF4`, defaults D1/H4/M15/Actual) — útil para ver confluencia multi-temporalidad de un vistazo sin cambiar de gráfico ni abrir 4 pestañas.

***

## Qué más trae el motor (y todavía no tiene UI dedicada)

El `ISSEngineConfig` completo incluye configuración para **Order Blocks**, **Fair Value Gaps** y **Liquidity Sweeps** — pero estos viven como sub-configs del motor, consumibles hoy vía API (`POST /api/iss/query`) o trading-bridge, **no como toggles del panel del indicador ISS**:

| Sub-config | Qué controla | Cómo se consume hoy |
| - | - | - |
| `order_block_config` | Punto de referencia del OB (open/low/body/CE), validación (close\_through/body\_break/wick\_touch), impulso mínimo, mitigación, expiración por toques/barras | Solo API/trading-bridge — no hay indicador de Order Blocks en el frontend todavía |
| `fvg_config` | Tamaño mínimo, tipos (BISI/SIBI/IFVG/BPR), mitigación, clasificación ARJO | El indicador **[FVG](/learn/indicators/fvg)** tiene su **propia** implementación de UI, más rica que este schema — no reutiliza `FVGConfigSchema` 1:1 |
| `liquidity_config` | Qué niveles barrer (swing highs/lows, equal highs/lows, session highs/lows), validación del sweep (wick\_only/close\_back/next\_bar\_confirm) | Solo API/trading-bridge — el ISS **detecta y expone** `liquidity_levels` en su snapshot, pero la configuración fina del sweep no tiene UI |

El engine también produce, siempre activo (no configurable desde el panel), la capa **[PD Array Matrix](/learn/indicators/pd-array-matrix)**: Breaker Blocks, Rejection Blocks, Volume Imbalances, Mitigation Blocks, un **Market Intention Score** agregado (bias ponderado -∞ a +∞ con clasificación `strong_bullish` → `strong_bearish`) y eventos **CISD** (Change In State of Delivery, cuando 3+ arrays del mismo lado fallan). Igual que Order Blocks y Liquidity, es consumible hoy solo vía API/trading-bridge, sin UI en el chart — ver [PD Array Matrix](/learn/indicators/pd-array-matrix) para el detalle completo de parámetros y cómo consultarlo.

***

## Presets

Hay **dos conjuntos de presets distintos** que no hay que confundir: los del **motor backend** (Python, usados vía API/trading-bridge para configuraciones programáticas) y los del **indicador frontend** (los que aparecen en el selector de presets cuando arrastrás el ISS al gráfico).

### Presets del motor (backend)

| Preset | Qué cambia | Perfil |
| - | - | - |
| **`conservative`** | `swing_strength=2`, `classification_mode=STRUCTURAL`, `break_validation=CLOSE`, `break_size_type=ATR` (×0.5), FVG `min_gap_atr=0.3` + mitigación por CE | Menos señales, más precisas — swing/position trader que prioriza calidad sobre cantidad |
| **`aggressive`** | `swing_strength=1`, `classification_mode=IMMEDIATE`, `break_validation=WICK`, `break_size_type=NONE`, FVG sin filtro de tamaño + mitigación full | Más señales, más rápido — scalper/day trader que necesita reaccionar ya |
| **`ict`** | `swing_strength=1`, `classification_mode=STRUCTURAL`, `validation_type=CLOSE`, `break_validation=CLOSE` + `require_candle_close`, FVG con ARJO (`min_arjo_class=J`), liquidez con `sweep_validation=next_bar_confirm` | Metodología ICT clásica, purista |

### Presets del indicador (frontend UI)

| Preset | Qué cambia | Perfil |
| - | - | - |
| **Estándar (N1)** | `showN1=true`, `showUltimate=false`, validación WICK activada | Uso general, un solo nivel de estructura |
| **Dual Level (N1+N2)** | `showN1=true`, `showUltimate=true` | Análisis multi-nivel (bias N2 + timing N1) sin cambiar de gráfico |
| **Estilo ICT** | `swingStrength=1`, `detectionMode=FRACTAL`, validación WICK, `classificationMode=STRUCTURAL`, solo N1 con CHoCH+BOS | Metodología ICT clásica en el gráfico |
| **Scalping (Solo Breaks)** | `swingStrength=1`, sin líneas de rango, CHoCH+BOS activos, sin contador de impulso, sin N2 | TFs bajos, gráfico limpio, foco en breaks |
| **Minimalista (Solo BOS)** | `swingStrength=1`, sin líneas de rango, **sin CHoCH**, solo BOS | Lectura de tendencia de un vistazo — ignora las alertas de reversión |

***

## Recetas — combinaciones útiles

<AccordionGroup>
  <Accordion title="1. Tendencia LT limpia (bias de largo plazo sin ruido)">
    Usá el indicador **Swing Points** standalone (no el ISS completo): `strength=3-5`, `showHierarchy=true`, `classificationMode=STRUCTURAL`, `showOnlyClassified=true`. Mirá solo los swings marcados **LT** — si forman HH/HL consecutivos la tendencia de largo plazo es alcista. Ignorá el ruido de los swings ST/IT que aparecen y desaparecen en el camino.
  </Accordion>

  <Accordion title="2. Scalping M1 sensible">
    ISS con `swingStrength=1`, `detectionMode=PREBREAK` (rangos más reactivos, siguen al swing más reciente en vez del extremo), `breakFilterType=NONE`, `showUltimate=false`. Partí del preset **Scalping** y ajustá `detectionMode` a `PREBREAK` manualmente — el preset de fábrica no lo cambia.
  </Accordion>

  <Accordion title="3. Estilo ICT con contexto de sweeps">
    Preset **Estilo ICT** del ISS (N1, `STRUCTURAL`, validación `CLOSE`) + indicador **FVG** con `structureContextEnabled=true`, `structureSource='ISS'`, `fractalFilterMode='CURRENT_FRACTAL'` — así el FVG solo muestra gaps dentro del fractal activo de estructura. Para los *sweeps* de liquidez en sí (barrido de highs/lows), hoy no hay indicador visual dedicado — se leen manualmente mirando mechas que rompen un swing N1 y cierran de vuelta adentro, o se consume `liquidity_levels`/`LiquiditySweepConfig` vía API/trading-bridge.
  </Accordion>

  <Accordion title="4. Vista dual: bias HTF sintético + timing LTF">
    Preset **Dual Level (N1+N2)** del ISS en un solo gráfico. Regla de uso: solo tomar entradas de N1 (CHoCH/BOS) que vayan en la **misma dirección** del último evento N2 (`U-CHoCH`/`U-BOS`). Si N1 da una señal contraria a N2, tratarla como pullback, no como reversión.
  </Accordion>
</AccordionGroup>

***

<Card title="Siguiente: indicador Swing Points (standalone)" icon="arrow-right" href="/learn/indicators/swing-points">
  La versión liviana del detector de swings del ISS — sin CHoCH/BOS ni rangos, solo puntos de giro y jerarquía.
</Card>


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