Skip to main content

Qué es esta página

PD Array Matrix — Teoría ya cubre el concepto ICT completo (qué es un PD array, jerarquía, Premium/Discount, catálogo). Esta página documenta la implementación real en Innova Trading: qué está efectivamente calculado, con qué parámetros, y — el punto más importante — cómo se consulta.
El PD Array Matrix completo (Order Blocks, Breaker Blocks, Rejection Blocks, Volume Imbalances, Mitigation Blocks, Market Intention Score, CISD) no tiene indicador visual en el chart hoy. Es una capa de análisis consumible exclusivamente vía trading-bridge (MCP tools para Claude Code / agentes). El motor ISS lo calcula internamente (backend/services/iss/core.py), pero el módulo de estructura que se dibuja en el gráfico (InnovaStructureModuleV2.tsx) no renderiza ninguno de estos arrays — solo swings, rangos y CHoCH/BOS. Si buscás esto en el panel de indicadores del chart, no lo vas a encontrar.

Cómo se consulta — 4 tools de trading-bridge

Todos fetchean el snapshot completo del motor ISS (POST /api/iss/query) y extraen la porción relevante: La clasificación Premium/Discount de cada array (_classify_zone) es simple: precio medio del array por encima del punto medio del rango actual → PREMIUM; por debajo → DISCOUNT.

Order Blocks

El OrderBlockConfig real usado por el motor ISS (backend/schemas/iss_engine.py, ~línea 777) es el que gobierna la detección en producción — no confundir con el dataclass OBConfig del módulo standalone backend/indicators/order_blocks/, que tiene menos campos. Algoritmo de detección (backend/indicators/order_blocks/detector.py): busca impulsos donde el movimiento desde el low/high más extremo del segmento hasta el cierre final supera min_impulse_atr × ATR(14), con al menos 60% de las velas del segmento en la dirección del impulso durante min_impulse_bars consecutivas. Luego retrocede hasta encontrar la última vela de color opuesto — esa es la vela candidata a OB. Ciclo de vida: PENDING → VALIDATED → TESTED → (INVALIDATED | EXPIRED). Invalidación: cierre que sobrepasa el lado equivocado de la zona (close < ob.low para bullish, close > ob.high para bearish). Expiración: solo por edad en estado PENDING (age > max_bars).
El detector local (backend/indicators/order_blocks/detector.py) define el estado MITIGATED pero nunca lo asigna — solo transiciona a TESTED (contador de toques sin límite) o INVALIDATED. La lógica de max_touches/mitigation_type vive en el OrderBlockConfig del schema del motor ISS, pero no está confirmado en qué punto exacto de core.py se aplica sobre el detector base. Tampoco confirmes que reference_point cambia el comportamiento de validación del detector local — la validación ahí usa siempre el rango completo (ob.high/ob.low), independientemente de qué reference_point esté configurado.
Niveles calculados: midpoint (Mean Threshold, 50%), premium_level (75%), discount_level (25%) — ver también PD Array Matrix — Teoría para la relación con la zona Premium/Discount del rango general.

Breaker Blocks

Hay dos definiciones distintas conviviendo en el código. El docstring del tool get_breaker_blocks describe el Breaker Block clásico ICT: “un OB validado se invalida (precio cierra a través); el OB invierte de rol — un OB bullish roto se vuelve breaker bajista (resistencia)”. Pero el detector real que efectivamente corre (backend/indicators/breaker_blocks/detector.py, invocado desde backend/services/iss/core.py) implementa algo distinto: “la vela en un swing point que fue roto por un CHoCH o BOS” — no deriva de un Order Block invalidado, sino de un swing estructural roto. Los campos que el tool intenta leer (breaker_type, original_type, original_ob_id) no existen en el schema real y van a mostrar "?" en la respuesta — la lógica real usa direction (bullish=soporte / bearish=resistencia), origin (choch/bos), swing_bar, swing_price, swing_classification (HH/HL/LH/LL).
Un Bullish CHoCH/BOS que rompe un swing HIGH crea un breaker bullish (soporte); un Bearish CHoCH/BOS que rompe un swing LOW crea un breaker bearish (resistencia). Ciclo de vida: ACTIVE → TESTED → (MITIGATED | INVALIDATED | EXPIRED) — mitigación cuando el precio cierra a través del CE (punto medio de la zona), invalidación cuando cierra completamente a través, expiración por age > max_age (default 100 barras).

Rejection Blocks

Zona formada por una mecha larga: desde el precio de apertura de la vela hasta la punta de la mecha (no el cuerpo). Bullish = mecha inferior larga; Bearish = mecha superior larga. Mismo ciclo de vida que los otros arrays: ACTIVE → TESTED → (MITIGATED | INVALIDATED | EXPIRED).

Volume Imbalances y Mitigation Blocks

Ninguno de los dos es un módulo independiente — no existe backend/indicators/volume_imbalance/ ni backend/indicators/mitigation_block/. Ambos viven inline dentro de otros archivos.
  • Volume Imbalance: método detect_volume_imbalances() del propio detector de FVG (backend/indicators/fvg/detector.py) — un micro-gap entre los cuerpos (no las mechas) de dos velas consecutivas. El razonamiento ICT: “el algoritmo no entregó precio eficientemente entre estos 2 puntos”.
  • Mitigation Block: método _detect_mitigation_blocks() dentro de backend/services/iss/core.py — patrón estructural de 3 puntos (Low → High → Higher Low para bullish, High → Low → Lower High para bearish) sin barrido de liquidez (a diferencia de un breaker, que sí requiere una ruptura CHoCH/BOS).

CISD — Change In State of Delivery

Regla ICT literal en el código: “When 3 PD arrays fail, your idea is flawed.” El detector (MarketIntentionScorer.detect_cisd en backend/indicators/cisd/detector.py) trackea fallos consecutivos (state == INVALIDATED) del mismo lado (bullish o bearish). Cuando se acumulan 3 o más fallos consecutivos del mismo lado (cisd_threshold=3), emite un CISDEvent. Cualquier array no-fallido resetea el contador de esa racha.
  • confidence = min(1.0, suma_de_pesos_fallados / 6.0)
  • El evento registra score_before/score_after (el score corriendo antes y después de la racha de fallos) y la lista de IDs de arrays fallados.

Market Intention Score (MIS)

Motor de scoring puro — no detecta nada, solo pondera lo que ya detectaron los detectores individuales. Vive en backend/indicators/cisd/detector.py (MarketIntentionScorer.calculate_score), invocado desde backend/services/iss/core.py. Pesos por tipo de array (PD_ARRAY_WEIGHTS): Lógica de puntos por estado (signo según dirección: bullish +1, bearish -1): score = suma de todos los puntos bullish + suma de todos los puntos bearish. Clasificación:

Recetas

get_market_intention(symbol, timeframe) te da el score y clasificación en un solo llamado — útil como filtro rápido antes de buscar una entrada específica con FVG o ISS en el chart.
get_pd_array_matrix(symbol, timeframe) lista todos los arrays activos clasificados por zona — buscá confluencia (ej. un Order Block y un FVG bullish ambos en Discount) antes de tomar una entrada, siguiendo la jerarquía de PD Array Matrix — Teoría.
get_cisd_events(symbol, timeframe, limit=10) — si ves 3+ fallos consecutivos del mismo lado con confianza alta, es la señal ICT de “tu idea está mal” — considerá invertir el sesgo en vez de insistir con la dirección original.

PD Array Matrix — Teoría

El catálogo ICT completo: jerarquía, Premium/Discount, criterios de calidad.

Innova Smart Structure (ISS)

El motor que produce los swings, rangos y eventos CHoCH/BOS que alimentan estos arrays.