Stormer Multi-EMA Pullback — análise + plano de implementação

Source: vídeo YouTube Dzncfb_Fmgs "SETUP PARA OPERAR CRIPTOMOEDAS EM QUALQUER PRAZO OPERACIONAL", extraído via NotebookLM (transcrição completa em capile-project-vault/raw/chats-claude/2026-04-26-stormer-video-Dzncfb-transcript.md).

Setup em 1 frase

Trend-following pullback com 7 EMAs simultâneas alinhadas + entrada no rompimento da máxima do candle de touch + stop atrás da EMA inferior + alvo 3R (parcial em 2R).

Regras formais

Indicadores

Filtro de tendência (gate obrigatório)

LONG: EMA20 > EMA25 > EMA30 > EMA35 > EMA40 > EMA45 > EMA50 (todas alinhadas e ordem correta, tendência alta clara).

SHORT: ordem invertida.

Skip: lateralização, médias se cruzando, "bagunça".

Entrada LONG (em 4 fases)

  1. Detecção: alinhamento confirmado E preço recua e toca uma das EMAs. Preferência: 2ª ou 3ª EMA (EMA25 ou EMA30) — recuo já "descansou".
  2. Pendência: arma stop-buy +1 tick acima do high do candle de touch. Vale só pro próximo candle.
  3. Roll-forward: se não acionar no próximo candle, move stop-buy pra +1 tick acima do high desse novo candle. Repete a cada bar.
  4. Cancela: se algum candle fechar abaixo da EMA50 (média mais longa). Tendência quebrou.

Stop loss

Alvo

Filtro extra: squeeze

Win rate esperado

TFs e ativos

Cruzamento com infra existente

componente Stormer infra capile-bot atual gap
7 EMAs alinhadas src/indicators/ema.py (1 EMA por chamada) ✅ trivial — chamar 7 vezes
Filtro alinhamento estrito nenhum equivalente 🟡 helper novo (10 LOC)
Pullback toca EMA src/strategy/pullback.py (EMA9+EMA21+candle) 🟡 setup diferente
Stop-buy order acima do high (entrada condicional) engine entra no close do bar 🔴 engine não suporta — precisa simular
Stop atrás de EMA inferior (não % fixo nem ATR) atual: −2% fixo ou X×ATR 🟡 stop dinâmico baseado em EMA — fácil
Alvo 3R atual: 1.8R 🟡 só param
Realização parcial em 2R engine já suporta partial_take_profit_pct

Maior desafio: stop-buy order

O engine atual entra no close do bar de signal. Stormer entra no rompimento da máxima do bar de touch durante o bar SEGUINTE (e roll-forward).

Pra simular fielmente, engine precisa: 1. Detectar bar de touch → marca "armed" com entry_trigger = touch_high + tick 2. Bar seguinte: se high >= entry_trigger: entra em entry_trigger. 3. Se não atingiu: atualiza entry_trigger = max(entry_trigger, novo_high + tick) (move pra cima... espera, NÃO. Boss disse "máxima do candle seguinte"). Re-lendo:

"se a entrada não for acionada no candle seguinte, a ordem deve ir sendo movida para a máxima (ou mínima, na venda) do candle seguinte sucessivamente"

Move pra máxima do candle seguinte (que pode ser maior OU menor que o original). Em essência: stop-buy fica sempre 1 tick acima do high da barra IMEDIATAMENTE anterior (rolling).

Em código:

# bar de touch detectado em i:
entry_trigger = candles.high.iloc[i] + tick
armed = True

# pra cada bar seguinte j:
while j < len(candles) and armed:
    # check cancel: close abaixo da EMA50?
    if candles.close.iloc[j] < ema50.iloc[j]:
        armed = False; break
    # check trigger
    if candles.high.iloc[j] >= entry_trigger:
        # entry no preço entry_trigger (não no close)
        entry_at(entry_trigger, j)
        break
    # roll-forward
    entry_trigger = candles.high.iloc[j] + tick
    j += 1

Esse comportamento "armed pendente" é diferente de tudo no engine atual mas é factível adicionar.

Plano de implementação

Fase 1 — MVP simplificado (~50 LOC, ~1h)

Fase 2 — Fiel ao Stormer (~150 LOC, ~3h)

Recomendação

Começar pela Fase 1 MVP: - Se passar WF em algum símbolo/TF, vale Fase 2 pra teste mais realista. - Se falhar em todos, Fase 2 não vai salvar (a entrada otimista geralmente FAVORECE backtest, não desfavorece).

Hipóteses testáveis priorizadas

# nome mecânica params TFs esforço edge esperado
1 stormer_multi_ema_pullback (MVP) 7 EMAs alinhadas + touch 2ª/3ª EMA + entry close + stop EMA inferior + target 3R EMAs [20,25,30,35,40,45,50], target_R=3 1d, 4h baixo (50 LOC) wr ~40%, expectancy +0.6R
2 stormer_multi_ema + partial 2R igual #1 + scale-out 50% no 2R + partial=0.5 1d, 4h trivial (já temos partial no engine) ⚠ partial sofreu bias intra-bar antes — validar 15m
3 stormer_multi_ema FIEL (Fase 2) + stop-buy entry condicional acima do high de touch igual #1 mas entry diferente 1d, 4h médio (150 LOC engine) provavelmente reduz n_trades e wr melhora
4 stormer_multi_ema + squeeze filter só entra quando EMAs estão estreitas (próx do squeeze) std EMAs/close < threshold 1d baixo menos trades, magnitude maior

Observações pré-WF

Próximo passo

Implementar Fase 1 + sweep WF em 7 símbolos × {1d, 4h}.

Cross-references

Strategies: [[../strategy/bollinger_breakout]] Regimes: [[../regimes/trending_up]]