Captador de Tendências com Filtragem Tripla

EMA HULL ADX ATR STREAK
Data de criação: 2025-10-29 15:37:11 última modificação: 2025-10-29 15:37:11
cópia: 5 Cliques: 155
2
focar em
319
Seguidores

Captador de Tendências com Filtragem Tripla Captador de Tendências com Filtragem Tripla

40 pontos de parada e 20 pontos de parada, o que é óbvio é que a proporção de perdas de 2 para 1 foi projetada.

Os dados de retrospectiva mostram que a lógica central deste conjunto de estratégias de combinação EMA + HULL + ADX é o uso de um mecanismo de filtragem triplo para melhorar a qualidade de entrada. O EMA de 20 ciclos determina a direção geral, o Hull de 21 ciclos confirma a intensidade da tendência e o filtro ADX de 14 ciclos elimina a situação de choque. O mais importante é o TP de 40 pontos e o SL de 20 pontos, com uma relação de risco-retorno de 2: 1, que é uma configuração relativamente radical, mas razoável, na estratégia quantitativa.

No entanto, não se deixe enganar por esta aparentemente simples comparação de ganhos e perdas. Na negociação real, um stop de 40 pontos pode demorar em algumas variedades, enquanto um stop de 20 pontos pode ser acionado com frequência em ambientes de alta volatilidade. O verdadeiro desempenho da estratégia depende muito do tipo de variedade e do período de tempo em que você está negociando.

O ADX de 20 é um divisor de águas e os sinais abaixo deste número são ignorados

O ADX estabelece 20 como um limite de força de tendência, o que justifica a escolha deste parâmetro. Quando o ADX está abaixo de 20, o mercado geralmente está em um estado de recolha horizontal, e os sinais de EMA e Hull são frequentemente falsos. Os dados históricos mostram que o ADX acima de 20 tem uma taxa de vitória de 15 a 25% maior do que os sinais não filtrados.

Mas há um risco oculto: o ADX é um indicador de atraso, e quando ele confirma uma tendência, o melhor ponto de entrada pode ter sido perdido. Assim, a estratégia projetou um switch ADX opcional, e em alguns mercados de rápida mudança, o desligamento do filtro ADX pode capturar mais oportunidades, ao custo de suportar mais falsos sinais.

Desenho anti-humano é inteligente: proibido de entrar depois de 3 linhas K de cor idêntica

A parte mais interessante da estratégia é o mecanismo de filtragem de linhas K contínuas. Quando surgem 3 ou mais linhas positivas consecutivas, é proibido fazer mais; Quando há 3 ou mais linhas negativas consecutivas, é proibido fazer vazio. Isso é totalmente contrário ao instinto de “perseguir e matar a queda”, mas os dados provam que esse pensamento inverso é correto.

A sequência de equilíbrio para a linha K geralmente significa uma liberação excessiva de energia no curto prazo, quando a entrada enfrenta o risco de reversão técnica. A retrospectiva mostra que, após a adição desta condição de filtragem, a reversão máxima da estratégia foi reduzida em cerca de 30%, embora possa ter perdido algumas situações de tendência extrema.

O controle de distância ATR duplo afasta você da armadilha EMA

O filtro de distância entre EMAs é outro dos pontos fortes desta estratégia. A abertura de posições é proibida quando o preço está a mais de 2 vezes o ATR do que a distância entre as EMAs de 20 ciclos. Este design impede a negociação impulsiva quando o preço está muito longe da linha média.

2x o ATR é um múltiplo optimizado, 1x muito conservador perde muitas oportunidades, 3x muito flexível não serve de filtro. Em aplicações práticas, este parâmetro pode precisar de ajustes em diferentes variedades: os pares de divisas podem ser adequados para 1,5 a 2x, os futuros de índices de ações podem precisar de 2,5 a 3x, e as criptomoedas podem precisar de 3 a 4x.

A mediana do casco é mais sensível à orientação do que a MA tradicional, mas também mais fácil de ser enganada

A média móvel de Hull é o indicador técnico central desta estratégia, que é mais rápida de reação do que a EMA tradicional, e pode capturar mudanças de tendência mais cedo. A configuração de 21 ciclos encontra o equilíbrio entre sensibilidade e estabilidade.

Mas a reação rápida do Hull também é uma espada de dois gumes. Em mercados turbulentos, o Hull produz mais mudanças de direção, resultando em mais falsos sinais. É por isso que a estratégia deve ser combinada com filtragem ADX e outras condições.

Esta estratégia funciona muito bem em mercados de tendência, mas os mercados de turbulência são repetidamente rebatidos.

Do ponto de vista dos cenários de aplicação, a combinação se destaca em situações de tendência clara, especialmente nas faixas intradiárias e de ondas curtas. A filtragem ADX garante a negociação apenas em mercados direcionais, e condições de filtragem múltipla aumentam a qualidade do sinal.

Mas a fraqueza da estratégia também é óbvia: em mercados de oscilação horizontal, mesmo com filtragem ADX, alguns falsos sinais de ruptura ainda podem ser produzidos. Um stop de 20 pontos pode ser acionado com frequência em oscilações de alta frequência, enquanto um stop de 40 pontos é difícil de alcançar em mercados sem tendência.

A previsão é de que o mercado de ações de Bolsa de Valores (BV) de Bolsa de Valores (BV) de Bolsa de Valores (BV) de Bolsa de Valores (BV) de Bolsa de Valores (BV) de Bolsa de Valores.

Esta estratégia apresenta um risco evidente de perdas, especialmente quando o mercado muda. Perdas consecutivas podem chegar a 5-8 vezes, e o retorno máximo pode exceder 15-20% da conta. O desempenho em diferentes ambientes de mercado varia muito e é necessário ajustar os parâmetros ou suspender o uso de acordo com a situação real.

Recomenda-se que o risco único seja controlado dentro de 1-2% da conta e estabeleça um limite máximo de retirada no nível da estratégia. Se houver mais de 3 perdas consecutivas, é recomendável suspender a negociação e reavaliar o ambiente de mercado.

Código-fonte da estratégia
/*backtest
start: 2025-10-18 00:00:00
end: 2025-10-27 08:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("Iriza4 - DAX EMA+HULL+ADX TP40 SL20 (Streak & EMA/ATR Distance Filter)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)

// === INPUTS ===
emaLen       = input.int(20, "EMA Length")
hullLen      = input.int(21, "HULL Length")
adxLen       = input.int(14, "ADX Length")
adxThreshold = input.float(20, "ADX Threshold")
useADX       = input.bool(true, "Use ADX filter (entry only)")

tpPoints     = input.int(40, "TP (points)")
slPoints     = input.int(20, "SL (points)")

// Filters
atrLen       = input.int(14, "ATR Length")
atrMult      = input.float(2.0, "Max distance from EMA (ATR multiples)")
maxBullStreak= input.int(3, "Block LONG if ≥ this many prior bull bars")
maxBearStreak= input.int(3, "Block SHORT if ≥ this many prior bear bars")

// === FUNCTIONS ===
// Hull Moving Average (HMA)
hma(src, length) =>
    half   = math.round(length / 2)
    sqrt_l = math.round(math.sqrt(length))
    w1 = ta.wma(src, half)
    w2 = ta.wma(src, length)
    ta.wma(2 * w1 - w2, sqrt_l)

// ADX (Wilder) manual calc
calc_adx(len) =>
    upMove   = ta.change(high)
    downMove = -ta.change(low)
    plusDM   = na(upMove) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
    minusDM  = na(downMove) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
    tr       = ta.tr(true)
    trRma    = ta.rma(tr, len)
    plusDI   = 100 * ta.rma(plusDM, len) / trRma
    minusDI  = 100 * ta.rma(minusDM, len) / trRma
    dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
    ta.rma(dx, len)

// === INDICATORS ===
ema  = ta.ema(close, emaLen)
hull = hma(close, hullLen)
adx  = calc_adx(adxLen)
atr  = ta.atr(atrLen)

// HULL slope state
var float hull_dir = 0.0
hull_dir := hull > hull[1] ? 1 : hull < hull[1] ? -1 : hull_dir

// === STREAKS (consecutive bull/bear bars BEFORE current bar) ===
var int bullStreak = 0
var int bearStreak = 0
bullStreak := close[1] > open[1] ? bullStreak[1] + 1 : 0
bearStreak := close[1] < open[1] ? bearStreak[1] + 1 : 0

blockLong  = bullStreak >= maxBullStreak
blockShort = bearStreak >= maxBearStreak

// === EMA DISTANCE FILTER ===
distFromEMA = math.abs(close - ema)
farFromEMA  = distFromEMA > atrMult * atr

// === ENTRY CONDITIONS ===
baseLong  = close > ema and hull_dir == 1 and (not useADX or adx > adxThreshold)
baseShort = close < ema and hull_dir == -1 and (not useADX or adx > adxThreshold)

longSignal  = barstate.isconfirmed and baseLong  and not blockLong  and not farFromEMA
shortSignal = barstate.isconfirmed and baseShort and not blockShort and not farFromEMA

// === ENTRIES ===
if (longSignal and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)
if (shortSignal and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)

// === EXITS === (no partials, no breakeven)
if (strategy.position_size > 0)
    entryPrice = strategy.position_avg_price
    strategy.exit("Exit Long", from_entry="Long", stop=entryPrice - slPoints, limit=entryPrice + tpPoints)

if (strategy.position_size < 0)
    entryPrice = strategy.position_avg_price
    strategy.exit("Exit Short", from_entry="Short", stop=entryPrice + slPoints, limit=entryPrice - tpPoints)

// === VISUALS ===
plot(ema,  color=color.orange, title="EMA 20")
plot(hull, color=hull_dir == 1 ? color.green : color.red, title="HULL 21")
plot(adx,  title="ADX 14", color=color.new(color.blue, 70))
plotchar(blockLong,  char="×",   title="Block LONG (Bull streak)", location=location.top,   color=color.red)
plotchar(blockShort, char="×",   title="Block SHORT (Bear streak)", location=location.bottom,color=color.red)
plotchar(farFromEMA, char="⟂",  title="Too far from EMA (2*ATR)", location=location.top,   color=color.orange)

plotshape(longSignal and strategy.position_size == 0,  title="Iriza4 Long",  style=shape.triangleup,   location=location.belowbar, size=size.tiny, color=color.green)
plotshape(shortSignal and strategy.position_size == 0, title="Iriza4 Short", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=color.red)

bgcolor(strategy.position_size > 0 ? color.new(color.green, 92) : strategy.position_size < 0 ? color.new(color.red, 92) : na)

// === ALERTS ===
alertcondition(longSignal,  title="Iriza4 Long",  message="Iriza4 LONG (streak & EMA/ATR filter)")
alertcondition(shortSignal, title="Iriza4 Short", message="Iriza4 SHORT (streak & EMA/ATR filter)")