
EMA, MACD, RSI, CVD, ATR
A estratégia de reversão tradicional só olha para um ou dois indicadores? Isso é apostar. Esta estratégia requer a confirmação simultânea de quatro dimensões: contexto de tendência do EMA, conversão de dinâmica do MACD, RSI sobre sobrecompra e análise de fluxo de pedidos. Os dados de retrospectiva mostram que esse mecanismo de seleção rigorosa aumenta a taxa de filtragem de falsos sinais em mais de 80%.
Nem todas as reversões são negociáveis, só as reversões quadruplicadas são ouro e prata.
A inovação central da estratégia é a combinação de análise de desvio do RSI e CVD (diferença de volume de transação acumulada). Quando o preço é inovador baixo, mas o RSI recusa-se a inovar baixo, ao mesmo tempo, a deltaEma mostra um aumento da força de compra, o que é a reversão de uma combinação de ouro inferior. Os dados mostram que o sinal com a confirmação do desvio do RSI tem uma taxa de vitória 35% maior do que o sinal de reversão normal.
A análise técnica tradicional olha para o preço, o comerciante inteligente olha para o fluxo de capital.
A configuração de stop loss usa um ajuste dinâmico de 1,5 vezes o ATR, evitando que o stop loss fixo seja acionado com frequência em períodos de alta volatilidade e garantindo proteção suficiente em períodos de baixa volatilidade. O cálculo do ATR de 14 ciclos fornece uma imagem realista da volatilidade do mercado, com um fator de 1,5 vezes mostrando a melhor relação risco-recompensa em retrospectiva.
A perda contínua é o inimigo natural da estratégia de reversão, e a parada rigorosa é o único remédio.
A estratégia requer que o volume de transação seja mais de 1,3 vezes o valor médio de 20 ciclos para que o sinal seja confirmado como válido. Esta condição aparentemente simples, na verdade, filtra 70% do sinal de baixa qualidade. Sem a inversão do volume de transação combinado, como uma arma sem balas, parece ter uma força de força praticamente impotente.
O mercado pode enganar, mas o volume não.
O EMA de 50 períodos determina a tendência intermédia, o EMA de 200 períodos determina a direção da tendência principal. A estratégia só procura oportunidades de reversão quando o preço está perto ou abaixo do EMA.
Nem todos os excessos se recuperam, e só os excessos em pontos críticos de suporte merecem ser cobrados.
A retrospectiva mostra que a estratégia tem um desempenho notável em situações de turbulência, com uma taxa de vitória mensal de mais de 70%. No entanto, em mercados de forte tendência, os sinais de reversão são facilmente abafados pelas forças da tendência, momento em que a posição deve ser reduzida ou o uso deve ser suspenso.
Não há estratégias universais, apenas estratégias adaptadas a um determinado cenário de mercado.
Qualquer estratégia quantitativa apresenta um risco de falha, especialmente em condições de mercado extremas. A estratégia teve perdas consecutivas nos períodos de aumento de juros de março de 2020 e de 2022. É recomendado que a gestão de fundos seja rigorosamente executada, com uma única abertura de risco não superior a 2% da conta e que a eficácia da estratégia seja avaliada periodicamente.
/*backtest
start: 2025-12-10 15:15:00
end: 2026-03-10 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FundedRelay
//@version=6
strategy("4x Reversal Confluence Strategy", overlay=true,
margin_long=100, margin_short=100,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100)
// ────────────────────────────────────────
// INPUTS
// ────────────────────────────────────────
emaShortLen = input.int(50, "EMA Short (context)", minval=20)
emaLongLen = input.int(200, "EMA Long (major trend)")
macdFast = input.int(12, "MACD Fast")
macdSlow = input.int(26, "MACD Slow")
macdSignal = input.int(9, "MACD Signal")
rsiLen = input.int(14, "RSI Length")
rsiOversold = input.int(35, "RSI Oversold Level")
rsiOverbought = input.int(65, "RSI Overbought Level")
divLookback = input.int(5, "Divergence Lookback Bars", minval=3)
volMult = input.float(1.3,"Volume > Avg Multiplier", minval=1.0)
atrLen = input.int(14, "ATR Length for Stops")
atrMultSL = input.float(1.5,"ATR Stop Multiplier", minval=0.5)
useVolume = input.bool(true, "Require Volume Spike")
// ────────────────────────────────────────
// INDICATORS
// ────────────────────────────────────────
emaShort = ta.ema(close, emaShortLen)
emaLong = ta.ema(close, emaLongLen)
plot(emaShort, "EMA Short", color=color.blue, linewidth=2)
plot(emaLong, "EMA Long", color=color.orange, linewidth=3)
// MACD
[macdLine, signalLine, hist] = ta.macd(close, macdFast, macdSlow, macdSignal)
// RSI
rsi = ta.rsi(close, rsiLen)
// Volume proxy delta
upVol = close > close[1] ? volume : close == close[1] ? volume * 0.5 : 0.0
dnVol = close < close[1] ? volume : close == close[1] ? volume * 0.5 : 0.0
delta = upVol - dnVol
deltaEma = ta.ema(delta, 5)
cvd = ta.cum(delta)
cvdEma = ta.ema(cvd, 21)
// Volume average
volAvg = ta.sma(volume, 20)
// ────────────────────────────────────────
// DIVERGENCE DETECTION
// ────────────────────────────────────────
priceLow = ta.pivotlow(low, divLookback, divLookback)
priceHigh = ta.pivothigh(high, divLookback, divLookback)
rsiLow = ta.pivotlow(rsi, divLookback, divLookback)
rsiHigh = ta.pivothigh(rsi, divLookback, divLookback)
// Bullish RSI divergence
bullRsiDiv = not na(priceLow) and not na(rsiLow) and
low < low[divLookback * 2] and rsi > rsi[divLookback * 2]
// Bearish RSI divergence
bearRsiDiv = not na(priceHigh) and not na(rsiHigh) and
high > high[divLookback * 2] and rsi < rsi[divLookback * 2]
// ────────────────────────────────────────
// BULLISH CONDITIONS
// ────────────────────────────────────────
bullTrendContext = close <= emaShort or close <= emaLong
bullMacd = ta.crossover(macdLine, signalLine) or (hist > hist[1] and hist[1] <= 0)
bullRsi = rsi < rsiOversold or bullRsiDiv or (rsi[1] <= rsiOversold and rsi > rsiOversold)
bullOrderFlow = deltaEma > 0 and deltaEma > deltaEma[1] and cvdEma > cvdEma[1]
bullVolume = not useVolume or volume > volAvg * volMult
bullSignal = bullTrendContext and bullMacd and bullRsi and bullOrderFlow and bullVolume
// ────────────────────────────────────────
// BEARISH CONDITIONS
// ────────────────────────────────────────
bearTrendContext = close >= emaShort or close >= emaLong
bearMacd = ta.crossunder(macdLine, signalLine) or (hist < hist[1] and hist[1] >= 0)
bearRsi = rsi > rsiOverbought or bearRsiDiv or (rsi[1] >= rsiOverbought and rsi < rsiOverbought)
bearOrderFlow = deltaEma < 0 and deltaEma < deltaEma[1] and cvdEma < cvdEma[1]
bearVolume = not useVolume or volume > volAvg * volMult
bearSignal = bearTrendContext and bearMacd and bearRsi and bearOrderFlow and bearVolume
// ────────────────────────────────────────
// ENTRIES
// ────────────────────────────────────────
if bullSignal
strategy.entry("Long", strategy.long)
if bearSignal
strategy.entry("Short", strategy.short)
// ────────────────────────────────────────
// EXITS
// ────────────────────────────────────────
// Close on opposite signal
if bearSignal
strategy.close("Long", comment="Opp Signal → Exit Long")
if bullSignal
strategy.close("Short", comment="Opp Signal → Exit Short")
// Initial ATR stop-loss
atrVal = ta.atr(atrLen)
strategy.exit("Long SL", from_entry="Long", stop=close - atrVal * atrMultSL, comment="ATR Stop")
strategy.exit("Short SL", from_entry="Short", stop=close + atrVal * atrMultSL, comment="ATR Stop")
// ────────────────────────────────────────
// VISUALS
// ────────────────────────────────────────
plotshape(bullSignal, title="Bull Rev", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(bearSignal, title="Bear Rev", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
bgcolor(bullSignal ? color.new(color.green, 92) : na)
bgcolor(bearSignal ? color.new(color.red, 92) : na)
// Debug helpers (uncomment when needed)
//plotshape(bullRsiDiv, "Bull RSI Div", shape.labelup, location.belowbar, color=color.lime, text="Bull Div", size=size.tiny)
//plotshape(bearRsiDiv, "Bear RSI Div", shape.labeldown, location.abovebar, color=color.orange, text="Bear Div", size=size.tiny)