stocks / docs /patterns.md
Arrechenash's picture
Initial Commit
8ec1895
|
Raw
History Blame Contribute Delete
26.2 kB

Scanner Patterns

Análisis de patrones de trading contra el scanner DSL actual. Identifica qué se puede expresar hoy y qué falta para capturar cada patrón con precisión.

Propósito: guiar la evolución del DSL — qué reglas, columnas, y funciones priorizar para cubrir la mayor cantidad de patrones con el menor esfuerzo.


Condiciones Ideales (Long Bias)

Más allá de las características específicas de cada patrón, existen condiciones estructurales que favorecen cualquier estrategia en largo. No todas son necesarias siempre, pero cuantas más se cumplan, mayor probabilidad de éxito.

Condición Descripción Filtrable hoy?
Volumen histórico Rotando el float, preferiblemente múltiplos del float total ⚠️ Proxy con volume > avg(volume, 60) * 5 + market_cap < 2B. float_shares existe en discovery/analyze, pero no está en el whitelist del scanner.
Catalizador fuerte Earnings, contratos grandes, FDA approval fase 3, partnerships ❌ No hay fuente de datos estructurados en el scanner.
Sin dilución Sin public offerings ni financiamiento dilutivo reciente ❌ No hay columna de financing. Posible via SEC filings si se integra.
Sin overhead resistance Sin niveles de resistencia histórica por encima del precio actual ❌ No hay concepto de S/R en la DSL. El 52-week high es el único "sin resistencia" implícito.
Former runner La acción ya ha mostrado capacidad de correr en el pasado (ha tenido días de volumen masivo antes) ⚠️ Proxy: max(volume, 60) > avg(volume, 252) * 3. No es exacto pero aproxima.
Low float Menor a 15M shares ❌ Sin float_shares en el scanner DSL. Proxy actual: market_cap < 2B.
Sin sobreextensión Que no haya tenido una corrida vertical inmediatamente antes del setup ❌ No hay streak_run_pct < 50 combinado con contexto. Depende del patrón.
Verde en el día Close > open, o recuperando ese nivel durante la sesión close > open. También run_pct > 0 o change_pct > 0.

La columna float_shares es una buena candidata para el scanner, pero hoy no es filtrable desde el DSL. Sí aparece en discovery/analyze y en varios proveedores, así que el camino más corto es exponerla explícitamente en el whitelist si el parquet la contiene. El resto (catalyst, dilución, overhead resistance) requieren fuentes de datos que el scanner no tiene hoy.


Resumen Ejecutivo

10 patrones analizados. Dos features ya están soportadas y una sigue siendo roadmap.

Feature Patrones que cubre Estado Esfuerzo
float_shares como columna filtrable 0/10 No implementado en el scanner DSL Horas (whitelist + verificar parquet)
$entry.open, $entry.close como referencia dinámica 8/10 Implementado Ya soportado en `
$phase.volume como columna filtrable 0/10 No implementado Medio (engine change)

Ver Features Priorizadas al final.


1. Gap&Crap

Descripción

Patrón base del cual deriva el Gap&Crap Reversal. Es el escenario esperado cuando una acción hace gap up en small caps: abre con gap, se pone roja, y sigue cayendo todo el día llenando parcial o totalmente el gap. Los shorts ganan.

No es una estrategia en largo — es el movimiento que los shorts esperan y contra el cual opera el Gap&Crap Reversal. Se documenta para entender la diferencia.

Mecánica

  1. Gap up significativo (> 15-30%) en premarket
  2. Open → se pone roja, debajo de VWAP
  3. Sigue haciendo nuevos lows durante la sesión
  4. No hay compradores que absorban la venta
  5. Gap fill parcial o completo al cierre
  6. Shorts mantienen el control todo el día

Diferencia con Gap&Crap Reversal

Gap&Crap Gap&Crap Reversal
Después del dump Sigue cayendo Encuentra soporte
Shorts Ganan (mantienen posición) Pierden (forzados a cubrir)
Longs Pierden Ganan
Volumen Normal o bajo Masivo (absorbe toda la venta)
Estructura Nuevos lows constantes Double bottom / higher lows
Resultado Gap fill Nuevos máximos

Condiciones clave

El Gap&Crap estándar es más difícil de pescar como set up en largo porque NO conviene comprarlo. Se menciona como contexto — es lo que el mercado espera, y el Reversal es lo que ocurre cuando ese escenario falla.

Expresión actual

gap_pct > 15% and close < open and close < vwap

2. Gap&Crap Reversal

Descripción

Estrategia que busca el escenario fallido del Gap&Crap: la acción abre con gap up > 30%, se pone roja y cae debajo de VWAP, los shorts atacan confiados, pero el volumen es tan masivo que absorbe toda la venta. Se forma un soporte (double bottom / higher lows), y se produce un short squeeze que lleva la acción a nuevos máximos con más volumen del que arrancó.

Mecánica

  1. Gap up > 30% en premarket
  2. Open y reversal → se pone roja, cae debajo de VWAP
  3. Shorts confiados apilan presión esperando el gap fill típico
  4. Volumen TAN masivo que absorbe toda la venta → no puede hacer nuevos lows
  5. Double bottom / higher lows debajo de VWAP
  6. Short squeeze → shorts forzados a cubrir → rompe VWAP, open, hace nuevos máximos

⚠️ Probabilidad: este evento se da ~20-30% de las veces según el playbook original. Cuando funciona, la relación R/R supera 3:1, pero no es un setup recurrente — es un evento de baja probabilidad. Operarlo sin considerar esto lleva a sobreexposición.

Condiciones clave

Condición Filtro actual
Gap 30%+ gap_pct > 30%
Caída debajo de VWAP close < vwap en dump phase ✅
No nuevos lows low > $dump.low en base phase ✅
Volumen masivo volume > avg(volume, 60) * 5
VWAP reclaim close > vwap en squeeze phase ✅
Nuevos máximos close > session_high
Float < 15M float_shares no está en whitelist
Consolidación / double bottom ❌ No hay higher lows detection multi-barra
Volumen entre fases (base vol > dump vol) $phase.volume no es filtrable

Riesgo

El último low de la base es el riesgo. Si se rompe, la tesis del reversal se derrumba — los shorts retoman el control y el gap fill continúa. Dado que es un evento de baja probabilidad (~20-30%), la disciplina con el riesgo es crítica.

Expresión actual

gap_pct > 30% sort gap_pct desc
|> $dump(close < vwap and close < $entry.open * 0.95)[09:30-10:00]
|> $base(low > $dump.low and close < vwap)[10:00-12:00]
|> $squeeze(close > vwap and close > $entry.open and close > $dump.high)[10:30-15:50]

3. Gap and Go

Descripción

Acción que hace gap en premarket con noticias, consolida debajo de su pm_high, y rompe al alza en la primera hora. Los shorts usan pm_high como riesgo y se ven forzados a cubrir cuando se rompe.

Mecánica

  1. Gap up > 15% con noticias (sin sobreextensión)
  2. Consolidación en premarket debajo de pm_high
  3. Breakout de pm_high en la primera hora con volumen
  4. Retest del breakout con menos volumen → entry
  5. Run hacia la próxima resistencia

Condiciones clave

Condición Filtro actual
Gap > 15% gap_pct > 15%
Breakout de pm_high close > pm_high
Primera hora time >= '09:30' and time <= '10:30'
Volumen sobre histórico volume > avg(volume, 60)
Sin sobreextensión (open cerca de pm_high) ❌ No hay (open - pm_high) / pm_high
Consolidación premarket (rango angosto) ❌ No hay pm_range_pct
Retest con menos volumen ❌ No hay volumen comparativo entre barras
Spike > 5% sobre BO (confirmación) ❌ No hay close > pm_high * 1.05 usable
Stuffed move detection ❌ Rechazo con más volumen que la ruptura

Riesgo

El pm_high es el riesgo. Si el precio rompe y rechaza con más volumen que la vela de ruptura (stuffed move), los shorts atrapados se liberan y el escenario se da vuelta — es el Gap&Extension.

Expresión actual

gap_pct > 15% and volume > avg(volume, 60) and market_cap < 2B
| time >= '09:30' and time <= '10:30' and close > pm_high and close > open

⚠️ Sobreextensión no filtrada: la expresión matchea cualquier acción que rompa pm_high, incluso si abrió muy lejos de ese nivel. El playbook exige que el spread entre open y pm_high sea < 15% — idealmente (open - pm_high) / pm_high < 0.10. Sin esa columna, el scanner no puede descartar Gap&Go falsos que en realidad son extensiones verticales.


4. Breakout

Descripción

Ruptura de una resistencia anterior que se convierte en soporte. El escenario ideal es el 52-week high breakout (máximo en 52 semanas, sin resistencias arriba).

Mecánica

  1. Resistencia identificable (52-week, multi-month, multi-day, HOD, pm_high)
  2. Breakout > 5% por encima del nivel + volumen mayor al día que formó la resistencia
  3. El nivel roto se transforma en soporte
  4. Retest con menos volumen que la vela de breakout → entry
  5. Fail = bull trap: rompe sin volumen, rechazo, techo falso

Condiciones clave

Condición Filtro actual
52-week high close > max(high, 252) ✅ (preset existente)
Multi-day BO close > max(high, 20)
HOD BO close > session_high
pm_high BO close > pm_high
Volumen confirmación (proxy) volume > avg(volume, 60) * 2 ⚠️ Proxy: el playbook exige "volumen mayor al día de la resistencia", no al promedio. La columna max(high,252) no expone el volumen de ESE día, así que no podemos comparar directamente.
Volumen > día de la resistencia max(high, 252) no expone el volume de ESE día
Breakout > 5% sobre el nivel ❌ No hay (close - max(high,252)) / max(high,252)
Retest con menos volumen ❌ Sin volumen comparativo
Consolidación cerca del nivel pre-BO ❌ No hay rango angosto multi-día
Bull trap (rechazo + más volumen) ❌ Secuencia de 3 momentos

Riesgo

El nivel de breakout es el riesgo (dejando espacio para fakeouts). Si el precio vuelve a perder ese nivel con volumen, es un bull trap: los compradores que entraron en el BO quedan atrapados y la presión vendedora puede acelerar la caída hasta el siguiente soporte.

Expresión actual

# 52-week BO (preset de fastapi_app.py)
close > max(high, 252) and volume > avg(volume, 60) * 2

# Multi-day BO
close > max(high, 20) and volume > avg(volume, 60)

5. Red to Green

Descripción

Misma mecánica que Gap&Crap Reversal pero sin gap previo. La acción abre roja (o se pone roja rápido), los shorts atacan, pero el volumen es suficiente para absorber la venta y eventualmente la acción recupera el open.

Mecánica

  1. Contexto: acción que perdió 40%+ desde máximos, en bounce temprano (día 2-3)
  2. Open rojo — abre debajo del close anterior, o se pone roja rápido sin hacer verde primero
  3. Caída a soporte con volumen decreciente (vendedores se agotan)
  4. Consolidación debajo del open
  5. Breakout del open con volumen > la vela de caída inicial
  6. Retest del open con menos volumen → entry

Condiciones clave

Condición Filtro actual
Verde en el día close > open
Rojo en dump phase close < open
Volumen activo volume > avg(volume, 60)
Sin gran movimiento alcista previo ❌ El playbook exige que la acción NO haya hecho un spike >3-5% antes de ponerse roja. Si primero subió y después cayó, no es R/G puro — los shorts ya cubrieron en el spike alcista.
-40% desde máximo anual ❌ No hay (max(high,252) - close) / max(high,252) > 0.40
Primeros días verdes del bounce ❌ No hay detección de secuencia multi-día
Volumen DECRECIENTE en caída ❌ No hay tendencia de volumen multi-barra
Breakout vol > caída vol ❌ Sin volumen comparativo entre fases
Volumen del open como referencia ❌ No existe columna open_volume
Contexto multi-día (rojo, rojo, verde) ❌ Sin secuencia de closes

Riesgo

El nivel del R/G es el riesgo. Si el precio vuelve a perder ese nivel, los shorts recuperan el control y es probable un desmoronamiento.

Expresión actual

close < max(close, 252) * 0.6 and volume > avg(volume, 60)
|> $dump(close < open)[09:30-10:00]
|> $base(low > $dump.low and close < open)[10:00-12:00]
|> $reclaim(close > open and close > $dump.high)[10:30-15:50]

6. VWAP Bounce

Descripción

Pullback dentro de una tendencia alcista existente. La acción ya está arriba de VWAP con volumen masivo, y el primer dip a VWAP es una oportunidad de compra porque los compradores defienden ese nivel.

No es un squeeze. No hay shorts atrapados. Es comprar el pullback en una tendencia.

Mecánica

  1. Contexto: acción ya corriendo arriba de VWAP con volumen masivo
  2. HOD > 15-20% arriba de VWAP (demuestra control comprador)
  3. Primer pullback a VWAP en la primera hora y media
  4. VWAP coincide con un soporte clave
  5. VWAP aguanta → shorts cubriendo + compradores → bounce
  6. Exit: primera resistencia arriba de VWAP

Condiciones clave

Condición Filtro actual
Arriba de VWAP close > vwap
Volumen masivo volume > avg(volume, 60) * 5
HOD 15%+ sobre VWAP (session_high - vwap) / vwap > 0.15 ⚠️ (DuckDB directo)
Dip que rebotó low < vwap and close > vwap
Ventana temporal time >= '09:30' and time <= '11:00'
Primer pullback (no 2do, 3ero) ❌ Sin contador de eventos
VWAP coincide con soporte ❌ Sin soportes históricos
Volumen >= float ❌ Sin float_shares
Tendencia multi-hora arriba de VWAP ❌ No hay "N horas consecutivas arriba de VWAP"

Riesgo

El riesgo está en VWAP. Si el nivel no aguanta y el precio cierra por debajo, los shorts retoman el control y la caída puede ser pronunciada.

Expresión actual

volume > avg(volume, 60) * 5 and close > vwap and
(session_high - vwap) / vwap > 0.15
| time >= '09:30' and time <= '11:00' and low < vwap and close > vwap

La condición (session_high - vwap) / vwap > 0.15 en el daily filter garantiza que la acción CORRIÓ por encima de VWAP antes del pullback. Sin esto, la expresión matchea cualquier acción cerca de VWAP, no un VWAP Bounce genuino.


7. VWAP Reclaim

Descripción

La acción cruza debajo de VWAP (shorts toman control temporal) y luego lo recupera con volumen. Es la fase final de Gap&Crap Reversal y Red to Green, pero como patrón independiente.

Mecánica

  1. Acción verde en el día
  2. Gran corrida inicial → session_high bien arriba
  3. Pierde VWAP → shorts confiados
  4. Consolidación en soporte → deja de hacer nuevos lows
  5. Reclaim de VWAP con volumen creciente → shorts cubren
  6. Dip al VWAP con menos volumen → entry

Condiciones clave

Condición Filtro actual
Verde en el día close > open
Gran corrida inicial (session_high - vwap) / vwap > 0.10 ⚠️
Perdió VWAP close < vwap
Reclaim close > vwap
Volumen creciente hacia reclaim ❌ Sin tendencia de volumen multi-barra
Dip vol < reclaim vol ❌ Sin volumen comparativo entre fases
Reclaim rechazado con > volumen ❌ Fail detection
Sin overhead resistance cerca ❌ Sin soportes/resistencias
Mínimos más altos post-rechazo ❌ Sin higher lows detection

Riesgo

El riesgo está en el nivel de VWAP. Si el reclaim rechaza con mayor volumen que la vela de la ruptura, los shorts retoman el control. Si además no hay soportes cercanos por debajo, el retroceso puede ser de gran magnitud. Sin embargo, si después del rechazo la acción hace mínimos más altos, aún es factible un segundo reclaim.

Expresión actual

close > open and volume > avg(volume, 60) * 3
|> $run(close > vwap and close > $entry.open and
        (session_high - vwap) / vwap > 0.10)[09:30-11:00]
|> $dump(close < vwap and session_low < $run.low * 0.98)[10:00-12:00]
|> $reclaim(close > vwap and close > $dump.close and
            volume > avg(volume, 20) * 2)[11:00-15:30]
|> $dip(close > vwap and low <= vwap and
        low > $reclaim.low * 0.98)[12:00-15:50]

8. Dip Buying Panics

Descripción

Catching a falling knife. Acciones altamente sobreextendidas (100-200%+) que sufren una caída violenta >20% por razones técnicas (stops en cascada, shorts atacando), no fundamentales. El rebote posterior se aprovecha en el long side — es mean reversion contra la tendencia previa.

Alto riesgo. Es la única estrategia que va activamente contra la tendencia de la acción.

Mecánica

  1. Stock massively extended (100-200%+ en días recientes)
  2. Stop-loss cascade → stops en cadena → caída violenta >20%
  3. Short sellers atacan → aceleran la caída
  4. Sin fundamento negativo (no dilución, no malas noticias)
  5. Caída se frena en soporte histórico
  6. Primer pánico solamente (subsiguientes menos probabilidad de rebote)

Condiciones clave

Condición Filtro actual
Streak 100%+ streak_run_pct > 100% ⚠️ (solo streaks continuas)
Caída >20% intraday (session_high - low) / session_high > 0.20
Cerca del open time < '10:30'
Reclaim de VWAP close > vwap
Primer pánico (no 2do, 3ero) ❌ Sin contador de eventos
Sin fundamento negativo ❌ Sin news/catalyst detection
Soporte histórico ❌ Sin soportes en la DSL
OTC market (preferido) ❌ Sin columna exchange
Level 2 / Time & Sales ❌ Fuera del alcance del scanner

Riesgo

El nivel de soporte del rebote es el riesgo. Si el precio lo vuelve a probar y no rebota con fuerza, los dip buyers que compraron salen rápidamente, creando un pánico mayor. El riesgo debe estar muy ajustado — es preferible salir con pérdida pequeña a quedar atrapado en medio del selloff.

Expresión actual

streak_run_pct > 100% and volume > avg(volume, 60)
|> $panic(low < vwap and (session_high - low) / session_high > 0.20 and
          close < $entry.close * 0.85 and time < '10:30')[09:30-10:30]
|> $reclaim(close > vwap and close > $panic.close * 1.05 and
            volume > avg(volume, 20) * 2)[09:45-11:00]

9. Swing Primer Día Verde

Descripción

Única estrategia que se mantiene overnight. Busca la continuidad de una corrida alcista: acción en primer día verde con rango >20%, volumen >= float, cierre fuerte cerca del HOD arriba de VWAP. Se compra en la última hora y se vende al día siguiente en el spike del open.

Mecánica

  1. Primer día verde de una corrida potencial
  2. Rango >20%, volumen >= float (rotación completa)
  3. Cierre fuerte: última hora con volumen, cerca del HOD, arriba de VWAP
  4. Historial de continuación (acción ya mostró que después de volumen masivo suele continuar)
  5. Entry: última hora, en VWAP o soporte
  6. Exit: al día siguiente en el spike del open
  7. Fail: gap down / public offering

Condiciones clave

Condición Filtro actual
Rango >20% run_pct > 20%
Volumen masivo volume > avg(volume, 60) * 5
Arriba de VWAP close > vwap
Cerca del HOD close > session_high * 0.95 ⚠️
Última hora time >= '15:00'
Primer día verde ❌ Sin secuencia multi-día red→green
Volumen >= float ❌ Sin float_shares
Última hora con volumen volume no es columna intraday estándar
Sin sell-offs >10% en última hora ❌ Sin detección de rangos en ventana temporal
Historial de continuación ❌ Imposible en scanner (requiere backtest)
Sin dilución / offerings ❌ Sin fuente de datos

Riesgo

Riesgo overnight. Es la única estrategia que expone la posición fuera del horario de mercado:

  • Durante la sesión: el riesgo está en el nivel de entrada.
  • Después del cierre: cubrir si la acción baja del close.
  • Al día siguiente: idealmente cubrir en el spike del open en mercados bullish.
  • El peor escenario es un public offering o noticias negativas que generen gap down.

Llevar registro del funcionamiento histórico antes de adoptarlo como setup principal. No todas las condiciones de mercado favorecen los swings.

Expresión actual

volume > avg(volume, 60) * 5 and run_pct > 20%
| time >= '15:00' and close > vwap and close > session_high * 0.95 and
  low > session_high * 0.85

10. Rebote del 1er Día Verde (1st Day Bounce)

Descripción

Contra-cara de Swing 1°V. Después de una corrida masiva (+100%, +200%), la acción se agota, hace pico, y comienza a bajar con menor volumen. Cuando retrajo 25-50% de las ganancias y llega a un soporte clave, se busca el primer día verde de un rebote contra-tendencia. Es un bear market rally / dead cat bounce.

Diferencia clave con Swing 1°V:

Swing 1°V Rebote 1°V
Trending UP (continuación) Trending DOWN (contra-tendencia)
Se mantiene overnight Se intraday o 1 día
Cerca del HOD RTG desde soporte
Fuerte, sigue subiendo Débil, vender en resistencia

Mecánica

  1. Corrida masiva (+100%+) con catalizador
  2. Pico → reversión con menor volumen
  3. Retracción del 25-50% de las ganancias máximas
  4. Llega a un soporte clave y lo aguanta
  5. Primer día verde después de días rojos
  6. Rebote de menor magnitud que la corrida original
  7. Fail: cierra roja → tendencia bajista continúa

Condiciones clave

Condición Filtro actual
Verde en el día close > open
Retracción 25-50% desde pico (max(high,20)-close)/max(high,20) > 0.25 and < 0.50 ⚠️
Volumen menor que corrida volume < avg(volume, 20) * 2 ⚠️
Primer día verde post días rojos ❌ Sin secuencia multi-día
Volumen del pico como referencia ❌ No hay volumen comparativo
Soporte clave ❌ Sin soportes históricos
Catalizador conocido ❌ Sin news/catalyst
Sin dilución ❌ Sin fuente de datos
Día 2-3 de tendencia bajista ❌ Sin "días desde el pico"

Riesgo

El nivel del open es el riesgo. Si la acción no logra sostener el open y cierra roja, la tendencia bajista continúa — es un setup contra-tendencia, por lo que la recompensa debe ser conservadora. Salir en la próxima resistencia, no esperar una corrida como la original.

Expresión actual

close > open and
(max(high, 20) - close) / max(high, 20) > 0.25 and
(max(high, 20) - close) / max(high, 20) < 0.50
|> $dump(close < open and close < vwap)[09:30-10:30]
|> $rtg(close > open and close > vwap)[10:00-15:50]

Features Priorizadas

🔴 Fase 1 — Lo que más patrones destrava

# Feature Esf. Impacto Descripción
1 float_shares en whitelist 🟢 Horas 6/10 Agregar al allowed_names en expression_parser.py si la columna existe en parquet.
2 $entry.open, $entry.close como ref dinámica 🟢 Horas 8/10 Exponer $entry.open, $entry.close[-1], $entry.high, $entry.low como cross-phase refs utilizables en condiciones `
3 $phase.volume como columna filtrable 🟡 1d 4/10 Permitir $dump.volume > 10M, $reclaim.volume > $dump.volume * 2 en condiciones de fase.

🟡 Fase 2 — Precisión

# Feature Esf. Impacto
4 Secuencia multi-día ("últimos N días fueron rojos") 🟡 1-2d 3/10
5 Referencia a soporte (min en ventana de días como nivel) 🟡 1-2d 5/10
6 Consolidación cerca de nivel (rango angosto multi-barra) 🟡 1d 4/10

🟢 Fase 3 — Específico de 1 patrón

# Feature Patrón
7 Retracción desde pico (25-50%) Rebote 1°V
8 Contador de eventos ("primer" pullback/panico/día) VWAP Bounce, Dip Panic, Swing 1°V, Rebote 1°V

❌ No implementable (fuera del alcance del scanner)

Feature Motivo
Level 2 / Time & Sales Datos no están en parquet ni llegan via API
Catalyst / noticias Fuera del modelo de datos actual
Dilución / public offerings Requeriría integrar SEC filings
Exchange (OTC detection) No está en parquets diarios

Matriz de Cobertura

Leyenda: G&C = Gap&Crap (estándar), G&C Rev = Gap&Crap Reversal, G&Go = Gap and Go, BO = Breakout, RtoG = Red to Green, VWAPb = VWAP Bounce, VWAPr = VWAP Reclaim, Panic = Dip Buying Panics, S1°V = Swing 1er Día Verde, R1°V = Rebote 1er Día Verde.

                        G&C G&C Rev G&Go BO RtoG VWAPb VWAPr Panic S1°V R1°V  FREC
float_shares            N/A  ❌     ❌   ❌  ❌    ❌    ❌   ❌   ❌   ❌    0/10
$entry.open ref         N/A  ✅     ✅   ✅  ✅   ✅    ✅    —    ✅   ✅    8/10
$phase.volume filtrable N/A  —      ✅   ✅  ✅   —     ✅    —    —    —    0/10
Vol. comparativo (2 cols)N/A —      ✅   ✅  ✅   —     ✅    —    —    —    0/10
Consolidación / rango   N/A  —      ✅   ✅  ✅   —     ✅    —    —    —    0/10
Secuencia multi-día     N/A  —      —    —   ✅   —     —    —    ✅   ✅    0/10
Contador de eventos     N/A  —      —    —   —    ✅    —    ✅   ✅   ✅    0/10
Soporte histórico       N/A  —      —    ✅  —    ✅    —    ✅   ✅   ✅    0/10
Retracción desde pico   N/A  —      —    —   —    —     —    —    —    ✅    1/10
Catalyst / dilución     N/A  ✅     ✅   ✅   —    —     —    ✅   ✅   ✅    0/10

N/A: Gap&Crap estándar no es una estrategia en largo, por lo que las features de scanner long no le aplican directamente.