La forma más rápida de enganchar un breakout en pañales es monitorear la fase de compresión crítica de volatilidad con acumulación oculta de volumen, justo antes de que el precio salga disparado.
El problema: Por qué siempre terminas comprando el top
Todo trader ha pasado por este infierno. Abres el exchange, ves una moneda con un +25% en las últimas dos horas, metes un long llevado por el FOMO y… a los tres minutos exactos el gráfico se desploma como una piedra. Enhorabuena: fuiste la liquidez de salida para los que entraron en silencio.
La mayoría de los retail traders operan como ovejas: reaccionan al movimiento cuando ya ocurrió. Cuando el activo ya va volando, los bots notifican y en los canales de Telegram todos gritan «¡To the moon!», la ballena ya está cerrando sus posiciones contra tus market orders. Si quieres dejar de financiar el profit ajeno, tienes que aprender a entrar cuando el gráfico parece aburridísimo y la volatilidad está literalmente muerta.
La mecánica: Qué pasa realmente antes del pump
El mercado alterna permanentemente entre dos fases: acumulación (compresión) y distribución (expansión). No puedes comprimir un muelle indefinidamente; tarde o temprano va a saltar.
Cuando un market maker o un fondo grande está construyendo posición en un altcoin, no puede darse el lujo de mover el precio hacia arriba porque arruinaría su promedio de entrada. Así que absorbe meticulosamente toda la oferta en un rango superestrecho. En ese momento, en el chart pasa esto:
- Caída de la amplitud: El spread entre el máximo y el mínimo diario se desploma.
- Desplome de la volatilidad histórica (HV): El gráfico se convierte en una sierra plana o en un rango lateral aburridísimo.
- Libro de órdenes seco: Las órdenes de los peces pequeños se limpian o se cancelan, y el mercado se queda congelado.
- Anomalías en el Volume Delta: El precio no se mueve ni un milímetro, pero dentro de esas velas tan estrechas empiezan a entrar compras agresivas a mercado o hay un salto brutal en el volumen relativo (RVOL).
En cuanto el float circulante (las monedas disponibles) se barre del order book, se crea un vacío. Cualquier impulso de $50k-$100k a mercado manda el precio a las nubes porque literalmente ya no quedan paredes de venta duras en el libro.
Comparativa de métricas para tu screener
Para no comerte 500 charts a mano, configuramos la filtración buscando desviaciones matemáticas específicas:
| Métrica | Valor en "Modo Muelle" | Valor de "Explosión" | Qué significa esto en billetes |
|---|---|---|---|
| BB Width (20, 2) | < 0.03 - 0.05 | > 0.15 | La volatilidad se comprimió al máximo; el ancho de las bandas de Bollinger está en mínimos de 14–30 días. |
| RVOL (Relative Vol) | > 2.2 en la compresión | > 5.0 | El precio está lateral, pero el volumen es 2-3 veces superior a lo normal. Alguien está aspirando el order book en silencio. |
| Keltner / BB Ratio | Dentro de los canales | Breakout del canal | Las bandas de Bollinger metidas completamente dentro del Canal de Keltner (el clásico TTM Squeeze). |
| Funding Rate | Cercano a 0.00% o negativo | Giro brusco a + o - | El retail aún ni se enteró. No hay apalancamiento desbalanceado. |
| Open Interest (OI) | Estable o subiendo despacio | Disparo vertical | El Interés Abierto crece en pleno rango plano: está entrando dinero pesado, no simples sardinas. |
Checklist de escaneo en 30 segundos
Si usas screeners profesionales (TradingView, Coinglass, ScalpStation o tu propio software), tu flujo de trabajo es este:
- Ordenar por BBW (Bollinger Bands Width): Pon el timeframe en 15m o 1h. Filtra la lista de menor a mayor ancho.
- Filtro de Volumen (24h): Filtra la basura sin liquidez mandando fuera shitcoins con menos de $5M–$10M diarios (no tienen liquidez y te van a reventar con slippage).
- Validación RVOL / OI: Busca la confluencia: BBW al fondo de la tabla, pero el RVOL en 1h o 15m saltando por encima del 200-300%.
- Evaluación de estructura: Abre el chart. Si ves un rango plano apretadísimo de 1-1.5% con una delta acumulada plana o en ascenso constante, esa moneda está a punto de explotar.
Agregador en Python listo para producción (Production-Ready)
Aquí tienes un script listo para correr que detecta estas anomalías. Usa ccxt, consulta el mercado de futuros, calcula el TTM Squeeze y el RVOL, y te saca por consola las monedas a punto de romper.
import asyncio
import ccxt.async_support as ccxt
import pandas as pd
import numpy as np
# Ограничение количества одновременных запросов
MAX_CONCURRENT_REQUESTS = 20
async def analyze_market(exchange, symbol, semaphore):
async with semaphore:
try:
# Запрашиваем 100 свечей на 15-минутном таймфрейме
ohlcv = await exchange.fetch_ohlcv(
symbol,
timeframe='15m',
limit=100
)
if not ohlcv or len(ohlcv) < 50:
return None
df = pd.DataFrame(
ohlcv,
columns=['time', 'open', 'high', 'low', 'close', 'volume']
)
# ===== Bollinger Bands (20, 2) =====
df['sma'] = df['close'].rolling(window=20).mean()
df['std'] = df['close'].rolling(window=20).std()
df['bb_upper'] = df['sma'] + (df['std'] * 2)
df['bb_lower'] = df['sma'] - (df['std'] * 2)
# Защита от деления на 0
df['bb_width'] = np.where(
df['sma'] != 0,
(df['bb_upper'] - df['bb_lower']) / df['sma'],
np.nan
)
# ===== Relative Volume (RVOL) =====
df['vol_sma'] = df['volume'].rolling(window=20).mean()
# Защита от деления на 0
df['rvol'] = np.where(
df['vol_sma'] != 0,
df['volume'] / df['vol_sma'],
np.nan
)
# Заменяем inf на NaN
df.replace([np.inf, -np.inf], np.nan, inplace=True)
# Проверяем, что данных достаточно
if len(df) < 52:
return None
# Последняя закрытая свеча
last_width = df['bb_width'].iloc[-2]
last_rvol = df['rvol'].iloc[-2]
last_close = df['close'].iloc[-2]
# Проверка на NaN
if pd.isna(last_width) or pd.isna(last_rvol):
return None
# Минимальная ширина полос за предыдущие 50 свечей
# НЕ включая анализируемую свечу
historical_widths = df['bb_width'].iloc[-52:-2]
if historical_widths.isna().all():
return None
min_width_50 = historical_widths.min()
# Условия поиска
is_squeezed = last_width <= (min_width_50 * 1.15)
has_volume_spike = last_rvol >= 2.5
if is_squeezed and has_volume_spike:
return {
'symbol': symbol,
'close': float(last_close),
'bb_width': round(float(last_width), 4),
'rvol': round(float(last_rvol), 2)
}
except Exception as e:
print(f"[ERROR] {symbol}: {e}")
return None
async def main():
exchange = ccxt.binance({
'enableRateLimit': True,
'options': {
'defaultType': 'future'
}
})
semaphore = asyncio.Semaphore(MAX_CONCURRENT_REQUESTS)
try:
await exchange.load_markets()
# Только USDT perpetual futures
symbols = [
symbol
for symbol in exchange.symbols
if symbol.endswith('/USDT:USDT')
]
print(f"[*] Сканирование {len(symbols)} пар на фьючерсном рынке...")
tasks = [
analyze_market(exchange, symbol, semaphore)
for symbol in symbols
]
results = await asyncio.gather(*tasks)
hot_targets = [
result
for result in results
if result is not None
]
# Сортировка по RVOL
hot_targets.sort(
key=lambda x: x['rvol'],
reverse=True
)
print("\n=== НАЙДЕННЫЕ МОНЕТЫ ПОД ИМПУЛЬС ===")
if not hot_targets:
print("Совпадений не найдено.")
return
print(
f"{'Символ':<18} | "
f"{'Цена':<15} | "
f"{'BB Width':<10} | "
f"{'RVOL':<8}"
)
print("-" * 65)
for target in hot_targets:
print(
f"{target['symbol']:<18} | "
f"{target['close']:<15.8f} | "
f"{target['bb_width']:<10} | "
f"{target['rvol']:<8}"
)
finally:
await exchange.close()
if __name__ == '__main__':
asyncio.run(main())Gestión de riesgo y gatillos de entrada: Cómo no quemar la cuenta en una falsa ruptura
Encontrar la compresión es solo la mitad del trabajo. La otra mitad es evitar que te salte el stop cuando la ballena decida hacer un Shakeout (un fakeout para cazar liquidez antes del pump real).
No entres a mercado a ciegas antes del breakout: Estar esperando el squeeze no significa tirarle un market order sin confirmación. Entra con una limit order en la parte baja del rango (si estás acumulando spot) o en la confirmación (cierre de vela de 5m/15m POR FUERA de la banda de Bollinger con volumen respaldando).
Cálculo del Stop Loss:
- Nada de stops a ojo o un 1% fijo por defecto.
- Usa la métrica ATR (Average True Range). Coloca el stop a una distancia de 1.5 * ATR desde tu punto de entrada, por detrás del extremo opuesto del rango de acumulación.
Toma de ganancias (Take Profit):
- TP1 (50% de la posición): A la distancia del primer impulso equivalente al ancho total del rango comprimido (ratio Riesgo/Beneficio mínimo 1:2). Pasa el resto a break-even.
- TP2 (50% restante): Trailing stop escalonado siguiendo las EMA9/EMA21 de 15m mientras la tendencia siga sana.
Protección contra manipulaciones: Si el precio rompe el límite de la consolidación pero el volumen cae de inmediato y la siguiente vela vuelve a meterse al rango, es una manipulación clara. No promedies a la baja: asume la pérdida de una vez y sal de ahí.
Grábate esto: Un verdadero impulso tras un squeeze no da tiempo para dudar. Si el precio rompe el rango y se queda mareando la perdiz, la jugada está muerta; cierra la posición.
Capa «Alfa» avanzada: Las señales ocultas que el 95% de los traders pasa por alto
La mayoría de los screeners se limitan a buscar una compresión de precios básica. ¿El problema? La compresión por sí sola suele terminar en un serrucho implacable que barre стопы en ambas direcciones. Para llevar tu winrate al 75-80%, necesitas una segunda capa de filtrado: el análisis del contexto en derivados.
1. Desbalance entre el Interés Abierto (OI) y la Tasa de Financiación (Funding Rate)
El «muelle» perfecto se forma cuando el precio se queda atrapado en un rango estrecho, pero en los contratos de futuros se dispara una actividad anómala:
- Escenario de Short Squeeze: El precio se comprime en un rango del 1%. El Interés Abierto (OI) se dispara entre un 15% y un 20% en un par de horas. El Funding Rate se hunde en terreno profundamente negativo (por ejemplo, -0.04%). Esto significa que los retail están metiendo shorts agresivos en pleno rango esperando el rompimiento a la baja. El market maker ve esa pared de стопы y liquidaciones arriba y lanza un latigazo en la dirección opuesta.
- Escenario de Long Squeeze: Todo sucede a la inversa. El OI sube, el funding se infla en positivo (+0.05% o más) y el precio sigue plano. Arriba no hay liquidez: la explosión será hacia abajo, barriendo a todos los longs apalancados.
2. Cascada de compresión multi-timeframe (MTF Cascade)
Un impulso en el gráfico de 15 minutos te da un movimiento del 2-4%. Un impulso que coincide con una compresión simultánea en 1H y 4H te da entre un 15% y un 50% sin despeinarse y sin retrocesos.
Busca tokens donde el BB Width se encuentre en el percentil 5% más bajo de los últimos 30 días en 4H, pero con un pico de volumen ocurriendo justo ahora en 15M (RVOL > 3.0). Ese es el momento exacto en que la temporalidad menor le quita el seguro a la granada del timeframe mayor.
Script de Pine Script listo para usar (TradingView v5)
Si prefieres visualizar las señales del screener directamente en tus gráficos de TradingView, usa este indicador. Destaca las zonas de compresión de volatilidad (cuando las bandas de Bollinger se meten dentro del canal de Keltner) y dispara alertas cuando entra un volumen fuera de lo normal.
//@version=5
indicator("Quant Squeeze & Volume Trigger [EXPERT v2]", overlay=true, max_labels_count=500)
// ======================================================
// Ajustes
// ======================================================
groupBB = "Bollinger Bands"
groupKC = "Keltner Channels"
groupVOL = "Volume"
groupTREND = "Trend Filter"
bbLength = input.int(20, "BB Longitud", minval=1, group=groupBB)
bbMult = input.float(2.0, "BB Multiplicador", minval=0.1, group=groupBB)
kcLength = input.int(20, "KC Longitud", minval=1, group=groupKC)
kcMult = input.float(1.5, "KC Multiplicador", minval=0.1, group=groupKC)
rvolThreshold = input.float(2.2, "Umbral RVOL (x)", minval=0.1, group=groupVOL)
emaLength = input.int(200, "EMA de Tendencia", minval=1, group=groupTREND)
showLongs = input.bool(true, "Mostrar LONG", group=groupTREND)
showShorts = input.bool(true, "Mostrar SHORT", group=groupTREND)
// ======================================================
// Bollinger Bands
// ======================================================
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbMult)
// Protección contra división por cero
bbWidth = bbMiddle != 0 ? (bbUpper - bbLower) / bbMiddle : na
// ======================================================
// Keltner Channels
// ======================================================
kcMa = ta.ema(close, kcLength)
// ATR es más fiable para Keltner
kcAtr = ta.atr(kcLength)
kcUpper = kcMa + (kcAtr * kcMult)
kcLower = kcMa - (kcAtr * kcMult)
// ======================================================
// Relative Volume
// ======================================================
volSma = ta.sma(volume, 20)
rvol = (not na(volSma) and volSma > 0) ? volume / volSma : na
// ======================================================
// TTM Squeeze Logic
// ======================================================
// Bollinger completamente dentro de Keltner
isSqueezed = bbUpper < kcUpper and bbLower > kcLower
// ¿Estuvo en squeeze recientemente?
wasSqueezed = isSqueezed[1]
// Salida del squeeze
squeezeReleased = wasSqueezed and not isSqueezed
// ======================================================
// Trend Filter
// ======================================================
emaTrend = ta.ema(close, emaLength)
bullTrend = close > emaTrend
bearTrend = close < emaTrend
// ======================================================
// Breakout Confirmation
// ======================================================
// Confirmación por volumen
volumeConfirmed = not na(rvol) and rvol >= rvolThreshold
// Confirmación por precio
bullBreakout = close > bbUpper
bearBreakout = close < bbLower
// ======================================================
// Anti-Spam Logic
// ======================================================
// Evitar señales consecutivas
var int lastLongBar = na
var int lastShortBar = na
cooldownBars = 10
canLong =
na(lastLongBar) or
(bar_index - lastLongBar > cooldownBars)
canShort =
na(lastShortBar) or
(bar_index - lastShortBar > cooldownBars)
// ======================================================
// Señales finales
// ======================================================
longSignal =
showLongs and
barstate.isconfirmed and
squeezeReleased and
volumeConfirmed and
bullBreakout and
bullTrend and
canLong
shortSignal =
showShorts and
barstate.isconfirmed and
squeezeReleased and
volumeConfirmed and
bearBreakout and
bearTrend and
canShort
if longSignal
lastLongBar := bar_index
if shortSignal
lastShortBar := bar_index
// ======================================================
// Visualización
// ======================================================
// Fondo durante el squeeze
bgcolor(
isSqueezed
? color.new(color.orange, 88)
: na,
title="Squeeze Background"
)
// EMA de tendencia
plot(
emaTrend,
title="EMA Trend",
color=color.blue,
linewidth=2
)
// LONG
plotshape(
longSignal,
title="LONG Signal",
style=shape.triangleup,
location=location.belowbar,
color=color.lime,
size=size.small,
text="LONG"
)
// SHORT
plotshape(
shortSignal,
title="SHORT Signal",
style=shape.triangledown,
location=location.abovebar,
color=color.red,
size=size.small,
text="SHORT"
)
// ======================================================
// Alerts
// ======================================================
alertcondition(
longSignal,
title="LONG Breakout",
message="LONG breakout detected on {{ticker}}"
)
alertcondition(
shortSignal,
title="SHORT Breakout",
message="SHORT breakout detected on {{ticker}}"
)Anatomía de las trampas: Diferenciar un breakout real de un Shakeout
Las ballenas y la gente del institucional saben perfectamente dónde están colocados los стопы de quienes operan compresiones de volatilidad. Por eso, en un 40% de los casos, antes del movimiento real meten un mechazo falso (Spring/Upthrust) para limpiar el árbol.

Cómo evitar caer en la trampa:
Fíjate en el Delta de la vela del mechazo. Si el precio rompe el límite inferior de la acumulación, deja una mecha larga por abajo y el Delta CUMULATIVO muestra compras a mercado brutales (vela roja con Delta verde), estamos ante una absorción pasiva. Un comprador pesado con órdenes límite se tragó todas las ventas de los стопы disparados.
Regla de las 3 velas: Un impulso auténtico no regresa al rango de compresión. Si tras romper la estructura el precio se vuelve a meter al rango en la primera o segunda vela, sal inmediatamente. Solo han venido a cazar liquidez.
Checklist pre-trade (5 segundos antes de hacer clic)
Antes de apretar el gatillo con una señal de tu screener de volatilidad, pasa rápidamente el token por esta lista:
| Paso | Qué verificar | Condición óptima para entrar | Red Flag (Abortar trade) |
|---|---|---|---|
| 1 | Volumen de 24h (24h Vol) | > $10,000,000 | < $2,000,000 (El slippage te va a comer el profit) |
| 2 | Comportamiento vs BTC | Bitcoin consolidando en rango o acompañando el movimiento | BTC metiendo un dump/pump agresivo del >1.5% justo ahora |
| 3 | Orderbook (Spot/Futuros) | Camino libre de muros de órdenes límite gruesas | Paredón de órdenes límite a un 0.5% del precio actual |
| 4 | Spread (Bid/Ask) | < 0.05% | > 0.2% (Pésima liquidez) |
| 5 | Distancia al nivel clave más cercano | Espacio suficiente para buscar un Risk-Reward de al menos 1:3 | El precio ya chocó contra un nivel semanal duro |
Conclusión pragmática
Los screeners de volatilidad no son una bola de cristal para adivinar el futuro. Son una herramienta brutal para ahorrar tiempo: te permiten filtrar el 98% del ruido del mercado en 30 segundos y centrarte en el 2% de activos donde las manos fuertes están cocinando un movimiento grande en este mismo momento.
No intentes adivinar la dirección dentro del rango sin la confirmación del volumen y del Delta. Deja que el mercado enseñe sus cartas primero, entra con el impulso confirmado y llévate tu 3-8% de recorrido con un riesgo ultra controlado.