Pressione ESC para fechar

Screener de Volatilidade Cripto: Ache Breakouts em 30s

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étricaValor 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.15Volatilidade 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.0Preç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 RatioDentro dos canaisRompimento do canalAs Bandas de Bollinger entraram totalmente pra dentro do Canal de Keltner (o clássico TTM Squeeze).
Funding RatePerto de 0.00% ou negativoPicos repentinos para + ou -A sardinhada ainda não entendeu o que tá rolando. Sem alavancagem desproporcional.
Open Interest (OI)Estável ou subindo levementeExplosão de altaO 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.

Shakeout
 

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:

PassoO que validarPadrão para entradaSinal de perigo (Abortar)
1Volume 24h> $10,000,000< $2,000,000 (O slippage vai corroer seu lucro)
2Correlação com o BTCBitcoin consolidado ou acompanhando o ativoBitcoin dropando/pampando >1.5% no exato momento
3Book de Ofertas (Spot/Futuros)Sem grandes paredes de ordens limitadas logo à frenteMuro de ordens limitadas a 0.5% do preço atual
4Spread (Bid/Ask)< 0.05%> 0.2% (Iliquidez pura)
5Distância para o próximo nívelEspaço livre para andar pelo menos 1:3Preç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.

Resumir este post do blog com:

FAQ

A identificação precoce de moedas antes da expansão exige filtrar o estreitamento das Bandas de Bollinger (BB Width abaixo de 0,05) combinado a um pico de Volume Relativo (RVOL acima de 2,5). Essa estrutura indica acumulação institucional e liquidação do livro de ofertas antes da injeção de volatilidade. Traders analisam os tempos gráficos de 15m e 1h monitorando a elevação do Open Interest e Funding Rate neutro para confirmar a ausência de alavancagem excessiva do varejo.

A configuração ideal combina Bandas de Bollinger (período 20, desvio padrão 2,0) e Canais de Keltner (período 20, multiplicador ATR 1,5) para isolar a condição de TTM Squeeze. O filtro deve exigir volume diário mínimo de US$ 10 milhões para evitar slippage, delimitando BB Width abaixo de 0,05 e RVOL superior a 2,2. A inclusão da EMA 200 no tempo gráfico de 15m elimina sinais contra a tendência e entradas falsas em lateralizações.

O breakout verdadeiro sustenta o fechamento do preço fora das bandas de volatilidade com expansão contínua do Delta de Volume Acumulado (CVD), enquanto o fakeout retorna imediatamente para dentro da consolidação. Uma ruptura válida impede que o preço reentre na zona de compressão dentro de duas a três velas. Caso o preço rompa a extremidade mas apresente absorção passiva agressiva via ordens limite, o market maker está capturando liquidez de stop antes da reversão.
Piter Wacker

I am a trading specialist with expertise in market analysis, risk management, and investment strategies. I focus on identifying opportunities, executing trades with discipline, and delivering consistent results.

...

Deixe seu parecer

O seu endereço de e-mail não será publicado. Campos obrigatórios estão marcados *