A forma mais rápida de pegar um breakout logo no começo é monitorar a fase de compressão crítica de volatilidade junto com o acúmulo silencioso de volume, antes mesmo do preço explodir.
O Problema: Por que você sempre compra no topo
Todo trader já passou por esse inferno. Você abre a corretora, vê uma moeda subindo +25% nas últimas duas horas, entra com FOMO no long e… exatamente três minutos depois o gráfico despenca feito uma pedra. Parabéns, você virou liquidez para a galera que entrou no sapatinho.
A maioria dos players opera igual manada: só reage quando a bomba já estourou. Quando o ativo tá voando, os alertas tão apitando e o feed do Telegram tá surtando com "foguete não tem ré", o player grande já tá desovando a posição na sua ordem a mercado. Se você quer parar de bancar o lucro dos outros, precisa aprender a entrar quando o gráfico parece o bagulho mais chato do mundo e a volatilidade tá literalmente morta.
A Mecânica: O que realmente rola antes do tiro
O mercado vive alternando entre duas fases: acumulação (compressão) e distribuição (expansão). Não dá pra comprimir uma mola pra sempre, uma hora ela dispara.
Quando um market maker ou um fundo grande tá montando posição em uma altcoin, ele não pode sair puxando o preço pra cima, senão estraga o preço médio dele. Então o cara vai engolindo toda a oferta bem de boa dentro de um intervalo estreito. Nessa hora, rola o seguinte no gráfico:
- Diminuição da amplitude: A diferença entre a máxima e a mínima do dia despenca.
- Queda na Volatilidade Histórica (HV): O gráfico vira um "eletrocardiograma morto" ou uma consolidação super estreita.
- Livro de ofertas seco: As ordens dos pequenos vão sendo stopadas ou canceladas, o mercado simplesmente trava.
- Anomalias no Volume Delta: O preço fica imóvel, mas dentro dos candles começam a entrar boletadas violentas a mercado ou um aumento bizarro no volume relativo (RVOL).
Assim que o free float (as moedas moscando no mercado) é limpo do book, rola um vácuo. Qualquer boletada a mercado de $50k a $100k manda o preço pra lua, porque não sobrou mais nada de ordem limite pesada travando a alta.
Análise comparativa das métricas para o screener
Pra não ter que ficar olhando 500 gráficos no braço, a gente configura um filtro baseado em desvios matemáticos específicos:
| Métrica | Valor na "Mola Comprimida" | Valor na "Explosão" | O que isso significa na prática (no bolso) |
|---|---|---|---|
| BB Width (20, 2) | < 0.03 - 0.05 | > 0.15 | Volatilidade espremida no limite, largura das Bandas de Bollinger no menor nível dos últimos 14–30 dias. |
| RVOL (Relative Vol) | > 2.2 na compressão | > 5.0 | Preço andou de lado, mas o volume tá 2x a 3x acima do normal. Tem alguém "rapatando" o book em silêncio. |
| Keltner / BB Ratio | Dentro dos canais | Rompimento do canal | As Bandas de Bollinger entraram totalmente pra dentro do Canal de Keltner (o clássico TTM Squeeze). |
| Funding Rate | Perto de 0.00% ou negativo | Picos repentinos para + ou - | A sardinhada ainda não entendeu o que tá rolando. Sem alavancagem desproporcional. |
| Open Interest (OI) | Estável ou subindo levemente | Explosão de alta | O interesse aberto subindo no meio da consolidação indica dinheiro institucional entrando, não só varejo. |
Algoritmo de busca em 30 segundos
Se você usa screeners profissionais (TradingView, Coinglass, ScalpStation ou algum script próprio), o seu checklist é esse aqui:
- Ordenar por BBW (Bollinger Bands Width): Coloque no tempo gráfico de 15m ou 1h. Filtre do menor valor para o maior.
- Filtro de Volume (24h): Tire fora shitcoins mortas com volume diário abaixo de $5M–$10M (sem liquidez você toma um slippage pesado na execução).
- Verificação de RVOL / OI: Procure a confluência: BBW lá no fundo e RVOL de 1h ou 15m dando um salto acima de 200-300%.
- Avaliação da estrutura: Abra o gráfico. Se você ver um flat reto travado dentro de 1-1.5% com a Delta Cumulativa dando um estalo pra cima, a moeda tá no ponto de bala antes do estouro.
Agregador Python Profissional (Production-Ready)
Aqui tá o script pronto pra caçar essas anomalias. Ele roda com ccxt, puxa dados do mercado de futuros, calcula o TTM Squeeze e o RVOL, e joga no terminal a lista dos ativos prestes a 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())Gerenciamento de Risco e Entrada: Como não devolver a banca num violino
Achar a compressão é só metade do trabalho. A outra metade é não ser stopado naquele Shakeout safado que o big player dá pra buscar liquidez antes do movimento real começar.
Não entre a mercado antes do breakout: Esperar o squeeze não significa entrar vendado ou comprado às cegas. Entre com ordem limite no fundo do caixote (se estiver montando posição no spot) ou na confirmação (candle de 5m/15m fechando FORA da Banda de Bollinger acompanhado de volume).
Cálculo do Stop-Loss:
- Nada de stop "de orelha" ou fixo em 1%.
- Use o indicador ATR (Average True Range). Posicione o stop a uma distância de 1.5 * ATR do ponto de entrada, atrás da extremidade oposta da consolidação.
Realização de Lucro (Take Profit):
- TP1 (50% da posição): Na projeção do primeiro estalo, equivalente à amplitude total da consolidação (R/R de 1:2). Puxa o stop do restante pro zero a zero (breakeven).
- TP2 (50% da posição): Trailing stop escalonado conduzido pela EMA9/EMA21 de 15m enquanto a tendência de alta se mantiver limpa.
Proteção contra o Falso Rompimento: Se o preço rasgar o limite da consolidação mas o volume murchar na hora, e o candle seguinte engolfar de volta pra dentro do caixote — é manipulação na certa. Não faça preço médio, aceite o stop pequeno imediatamente.
Guarde isso: rompimento verdadeiro pós-squeeze não dá tempo de pensar. Se o preço rompeu e ficou engasgando, o movimento gorou. Zere a posição e vida que segue.
Camada "Alpha" Avançada: Os Sinais Ocultos que 95% dos Traders Não Enxergam
A maioria dos screeners busca apenas o afunilamento básico do preço. O problema? Compressão isolada costuma virar violino, stopando a galera dos dois lados. Para jogar sua taxa de acerto para a faixa de 75-80%, você precisa de uma segunda camada de filtro: a análise do contexto de derivativos.
1. Desbalanço de Open Interest (OI) e Funding Rate
A "mola comprimida" perfeita acontece quando o preço fica afunilado num caixote estreito, mas o mercado de futuros dá sinais de atividade anômala:
- Cenário de Short Squeeze: O preço consolida em um range de 1%. O Open Interest (OI) dispara 15-20% em poucas horas. O Funding Rate afunda no terreno negativo (ex: -0.04%). Isso indica que as sardinhas estão vendendo o lateral feito loucas, apostando num rompimento para baixo. O market maker enxerga esse caminhão de stops e liquidações no topo e dá o gatilho na direção oposta.
- Cenário de Long Squeeze: O inverso absoluto. O OI sobe, o funding fica super positivo (+0.05% para cima) e o preço não sai do lugar. Não tem liquidez na compra — a porrada vai ser para baixo, varrendo os alavancados no buy.
2. Cascatas Múltiplas de Compressão (MTF Cascade)
Um estopim no gráfico de 15m rende um tiro de 2% a 4%. Agora, um estopim que alinha com compressão no 1H e no 4H entrega rasgadas sem retorno de 15% a 50%.
Busque moedas em que o BB Width esteja no percentil 5% inferior dos últimos 30 dias no 4H, enquanto rola um pico de volume no 15M agora mesmo (RVOL > 3.0). É o exato momento em que o tempo gráfico menor puxa o pino da granada do tempo gráfico maior.
Script Pronto em Pine Script (TradingView v5)
Se você curte plotar os sinais do screener direto no gráfico do TradingView, roda esse indicador. Ele destaca no gráfico as zonas de compressão de volatilidade (quando as Bandas de Bollinger entram no Canal de Keltner) e dispara alertas quando entra volume anômalo.
//@version=5
indicator("Quant Squeeze & Volume Trigger [EXPERT v2]", overlay=true, max_labels_count=500)
// ======================================================
// Configurações
// ======================================================
groupBB = "Bollinger Bands"
groupKC = "Keltner Channels"
groupVOL = "Volume"
groupTREND = "Filtro de Tendência"
bbLength = input.int(20, "Comprimento BB", minval=1, group=groupBB)
bbMult = input.float(2.0, "Multiplicador BB", minval=0.1, group=groupBB)
kcLength = input.int(20, "Comprimento KC", minval=1, group=groupKC)
kcMult = input.float(1.5, "Multiplicador KC", minval=0.1, group=groupKC)
rvolThreshold = input.float(2.2, "Gatilho RVOL (x)", minval=0.1, group=groupVOL)
emaLength = input.int(200, "EMA de Tendência", minval=1, group=groupTREND)
showLongs = input.bool(true, "Exibir LONG", group=groupTREND)
showShorts = input.bool(true, "Exibir SHORT", group=groupTREND)
// ======================================================
// Bollinger Bands
// ======================================================
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbMult)
// Proteção contra divisão por zero
bbWidth = bbMiddle != 0 ? (bbUpper - bbLower) / bbMiddle : na
// ======================================================
// Keltner Channels
// ======================================================
kcMa = ta.ema(close, kcLength)
// ATR é mais confiável 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
// ======================================================
// Lógica do TTM Squeeze
// ======================================================
// Bollinger totalmente dentro do Keltner
isSqueezed = bbUpper < kcUpper and bbLower > kcLower
// Teve compressão recente
wasSqueezed = isSqueezed[1]
// Liberação do squeeze
squeezeReleased = wasSqueezed and not isSqueezed
// ======================================================
// Filtro de Tendência
// ======================================================
emaTrend = ta.ema(close, emaLength)
bullTrend = close > emaTrend
bearTrend = close < emaTrend
// ======================================================
// Confirmação de Rompimento
// ======================================================
// Confirmação por volume
volumeConfirmed = not na(rvol) and rvol >= rvolThreshold
// Confirmação por preço
bullBreakout = close > bbUpper
bearBreakout = close < bbLower
// ======================================================
// Lógica Anti-Spam
// ======================================================
// Evita sinais em sequência
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)
// ======================================================
// Sinais Finais
// ======================================================
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
// ======================================================
// Visualização
// ======================================================
// Fundo durante o squeeze
bgcolor(
isSqueezed
? color.new(color.orange, 88)
: na,
title="Fundo do Squeeze"
)
// EMA de tendência
plot(
emaTrend,
title="EMA Tendência",
color=color.blue,
linewidth=2
)
// LONG
plotshape(
longSignal,
title="Sinal LONG",
style=shape.triangleup,
location=location.belowbar,
color=color.lime,
size=size.small,
text="LONG"
)
// SHORT
plotshape(
shortSignal,
title="Sinal SHORT",
style=shape.triangledown,
location=location.abovebar,
color=color.red,
size=size.small,
text="SHORT"
)
// ======================================================
// Alertas
// ======================================================
alertcondition(
longSignal,
title="Rompimento de LONG",
message="Rompimento de LONG detectado em {{ticker}}"
)
alertcondition(
shortSignal,
title="Rompimento de SHORT",
message="Rompimento de SHORT detectado em {{ticker}}"
)Anatomia das Armadilhas: Diferenciando um Rompimento Real de um Shakeout
O player institucional sabe perfeitamente onde está o stop de quem opera compressão de volatilidade. Por isso, em cerca de 40% das vezes rola uma violinada (Spring/Upthrust) antes do movimento de verdade.

Como não cair nessa pegadinha:
Fique atento ao Delta do candle de agulhada. Se o preço rasga o suporte da consolidação, deixa um pavio longo para baixo e o Delta Cumulativo mostra agressão pesada de compra a mercado (candle vermelho com delta verde), temos uma Absorção passiva. O comprador institucional botou o peito e absorveu todas as ordens de venda da galera stopada.
A Regra dos 3 Candles: Um impulso verdadeiro não devolve para dentro da zona de compressão. Se logo após o rompimento o preço afunda de volta para a consolidação no primeiro ou segundo candle, caia fora imediatamente. Foi só caça de liquidez.
Checklist Pré-Trade (5 Segundos Antes do Clique)
Antes de boletar no sinal do screener de volatilidade, passe a moeda por esse checklist rápido:
| Passo | O que validar | Padrão para entrada | Sinal de perigo (Abortar) |
|---|---|---|---|
| 1 | Volume 24h | > $10,000,000 | < $2,000,000 (O slippage vai corroer seu lucro) |
| 2 | Correlação com o BTC | Bitcoin consolidado ou acompanhando o ativo | Bitcoin dropando/pampando >1.5% no exato momento |
| 3 | Book de Ofertas (Spot/Futuros) | Sem grandes paredes de ordens limitadas logo à frente | Muro de ordens limitadas a 0.5% do preço atual |
| 4 | Spread (Bid/Ask) | < 0.05% | > 0.2% (Iliquidez pura) |
| 5 | Distância para o próximo nível | Espaço livre para andar pelo menos 1:3 | Preço colado num suporte/resistência do gráfico semanal |
Direto ao Ponto
Screeners de volatilidade não são bola de cristal para prever o futuro. Eles servem para poupar seu tempo, filtrando em meio minuto 98% do ruído do mercado para você focar nos 2% de ativos onde a mão pesada dos institucionais está montando posição agora.
Não tente adivinhar o lado do estouro durante a compressão sem confirmação de volume e delta. Deixe o mercado mostrar as cartas primeiro, entre no fluxo do rompimento confirmado e garanta seus 3 a 8% de scalp com risco ultra controlado.