
A estratégia é um sistema de rastreamento de tendências avançado, que combina filtros de média móvel de dois índices (EMA) com intervalos inteligentes e detecção de ruído, com o objetivo de fornecer um sinal de negociação claro e operável. O conceito central de design é evitar mercados turbulentos, aumentar a precisão de negociação e ser capaz de se adaptar a diferentes condições de mercado. A estratégia julga a direção da tendência através do cruzamento da linha alta da EMA com a linha baixa da EMA, ao mesmo tempo em que utiliza filtros de intervalos e filtros de taxa de flutuação para evitar negociações em ambientes horizontais ou de baixa flutuação, aumentando significativamente a taxa de sucesso das negociações.
O mecanismo central da estratégia baseia-se nos seguintes componentes-chave:
Sistema de filtragem duplo EMAA estratégia usa duas médias móveis de índices (EMA de preços altos e EMA de preços baixos) para determinar a tendência do mercado. Quando o preço está simultaneamente acima das duas linhas de EMA, gera um sinal de mais; Quando o preço está simultaneamente abaixo das duas linhas de EMA, gera um sinal de menos.
Mecanismo de detecção de intervalosA estratégia usa um algoritmo de identificação de intervalos baseado na porcentagem do intervalo de preços, que suspende automaticamente a negociação quando o mercado entra na fase de liquidação horizontal (ou seja, o intervalo de flutuação dos preços é menor do que o limiar definido). O sistema monitora continuamente o número de barras de intervalos consecutivos e ativa o filtro de intervalos apenas quando o mercado é confirmado em um estado de intervalo real, evitando perder a oportunidade inicial de ruptura.
Filtro de taxa de flutuaçãoA estratégia é capaz de identificar ambientes de baixa volatilidade e evitar a negociação nessas condições, calculando o ATR (Average True Rate of Volatility) em relação à porcentagem do preço atual. Este mecanismo garante que a negociação seja feita somente quando o mercado está suficientemente dinâmico.
Princípio de uma transação por tendênciaA estratégia implementa um mecanismo de estado de tendência que garante que apenas uma transação seja executada na mesma direção da tendência até que a direção da tendência mude. Isso evita a sobre-transação e a repetição de sinais na mesma tendência.
Visualização de espaçamento não rompidoA estratégia é capaz de detectar e mostrar áreas de integração que podem levar a uma ruptura, ajudando os comerciantes a identificar potenciais oportunidades de negociação de alta probabilidade.
Gestão de Riscos DinâmicosA estratégia oferece um stop-loss baseado no ATR ou um stop-loss de porcentagem fixa, e um stop-loss de rastreamento de SAR paralelo opcional, o que torna a gestão de risco mais flexível e adaptável às mudanças do mercado.
Alta adaptabilidadeA capacidade da estratégia de se adaptar automaticamente a diferentes condições de mercado, capturando tendências em mercados de tendência e mantendo-se vigilante em mercados de turbulência, permite que ela se mantenha robusta em vários ambientes de mercado.
Mecanismo de filtragem múltiplaA estratégia aumenta significativamente a qualidade dos sinais de negociação, reduzindo os sinais errados e as falsas rupturas de negociação, através da combinação de filtragem tripla de tendências, intervalos e oscilações.
Ajuste de taxa de flutuação inteligenteEstratégia: Ajustar o tamanho da posição de acordo com a dinâmica da volatilidade do mercado, reduzir a abertura de risco em um ambiente de alta volatilidade e maximizar o potencial de receita em um ambiente de volatilidade moderada.
Uma visualização completaA estratégia oferece uma variedade de ferramentas visuais, incluindo marcadores de intervalos, quadros de intervalos não rompidos, linhas EMA e pontos SAR, que permitem aos comerciantes entender intuitivamente o estado do mercado e a lógica da estratégia.
Controle de risco flexível: Suporte a várias estratégias de stop loss ((percentagem fixa, multiplicador ATR, rastreamento SAR), permitindo que os comerciantes escolham a melhor abordagem de gestão de risco de acordo com as preferências de risco pessoais e características do mercado.
Princípio da transação únicaO mecanismo de estado de tendência garante que cada direção de tendência seja executada apenas uma vez, evitando o excesso de negociação e o excesso de capital exposto ao risco de uma única direção.
Reversão de tendência atrasadaA solução é ajustar o parâmetro de comprimento do EMA, podendo usar um comprimento de EMA mais curto em mercados com maior volatilidade.
Mercado horizontal pouco eficienteApesar de a estratégia ter um filtro de intervalos, ela pode levar a longos períodos sem oportunidades de negociação em mercados horizontais de longo prazo, afetando a eficiência do uso de fundos. A solução é combinar a análise de múltiplos quadros temporais ou usar a estratégia alternadamente entre diferentes mercados.
Parâmetros de dependência de otimizaçãoO desempenho da estratégia é altamente dependente da configuração de parâmetros, como a duração do EMA, o limiar do intervalo e o múltiplo ATR. Diferentes mercados e prazos podem exigir diferentes combinações de parâmetros. Recomenda-se otimizar os parâmetros em determinados mercados e prazos de tempo por meio do retorno.
Risco de grandes variações súbitas: Em caso de salto de preço causado por eventos de mercado inesperados (como um grande comunicado de imprensa), o stop loss pode não ser executado no preço esperado, resultando em perdas reais superiores às esperadas. Recomenda-se o uso de regras adicionais de gestão de fundos para limitar a abertura de risco de uma única transação.
Excessiva dependência de indicadores técnicosA estratégia baseia-se exclusivamente em indicadores técnicos, ignorando os fatores fundamentais. A análise puramente técnica pode falhar em caso de mudanças fundamentais significativas. Recomenda-se a redução de posições ou a suspensão de negociações antes da publicação de dados econômicos importantes, em combinação com a análise fundamental ou o estabelecimento de um calendário de eventos de risco.
Sistema de confirmação de múltiplos quadros de tempoIntrodução de análise de múltiplos prazos pode aumentar significativamente a precisão da estratégia. Recomenda-se a adição de condições de confirmação de tendência em prazos mais altos, executando negociações apenas quando a direção da tendência de prazos mais altos coincide com a direção atual da negociação, o que pode reduzir a negociação de contra-balanço e aumentar a taxa de vitória.
Parâmetros dinâmicos se adaptamA estratégia pode integrar um mecanismo de ajuste de parâmetros de adaptação, ajustando automaticamente o comprimento do EMA, o limiar do intervalo e o múltiplo ATR, conforme a volatilidade do mercado e a intensidade da tendência. Isso permitirá que a estratégia se adapte melhor a diferentes fases do mercado.
Integração de modelos de aprendizagem de máquinaA introdução de modelos de aprendizagem de máquina para otimizar o tempo de entrada e prever a direção da ruptura de intervalos pode melhorar significativamente o desempenho da estratégia. Por exemplo, o uso de algoritmos de classificação para prever a verdadeira ou falsa ruptura de intervalos, ou o uso de modelos de regressão para prever os objetivos de preços após a ruptura.
Melhoria do filtro de taxa de flutuaçãoO filtro de taxa de flutuação atual é baseado em um simples limite percentual de ATR, que pode ser atualizado para um indicador de taxa de flutuação relativa, comparando a taxa de flutuação atual com a distribuição de taxa de flutuação histórica e identificando com mais precisão o ambiente de baixa flutuação real.
Aumentar o volume de transações confirmadasAumento da condição de confirmação de volume de transação na geração de sinais de negociação, executando transações apenas quando a ruptura de preço acompanha um aumento de volume de transação, reduzindo o risco de falsa ruptura. Esta melhoria aplica-se especialmente aos mercados de ações e mercadorias.
Algoritmos de gestão de fundos optimizadosA integração do Kelly Criterion ou de outros algoritmos avançados de gestão de fundos em estratégias que ajustam dinamicamente o tamanho das posições de acordo com a taxa de ganhos e perdas históricas permite maximizar os lucros a longo prazo e minimizar os riscos.
A estratégia de filtragem inteligente de tendências de linha de equilíbrio binária e de volatilidade é um sistema de negociação abrangente e robusto, que aumenta efetivamente a qualidade do sinal de negociação e a taxa de sucesso da negociação por meio da combinação de tecnologias de rastreamento de tendências, detecção de intervalos e filtragem de volatilidade. Seu exclusivo princípio de negociação por tendência e mecanismo dinâmico de gerenciamento de risco permitem que ele mantenha uma boa capacidade de lucratividade enquanto controla o risco.
Embora a estratégia também esteja sujeita a riscos como atraso de reversão de tendência e dependência de parâmetros, esses riscos podem ser gerenciados efetivamente por direções de otimização propostas, como confirmação de múltiplos prazos, auto-adaptação de parâmetros dinâmicos e integração de modelos de aprendizado de máquina. Com a otimização de parâmetros e gerenciamento de risco apropriados, a estratégia pode manter um desempenho estável em várias condições de mercado e é um sistema de negociação que vale a pena usar por longo tempo e melhorar continuamente.
/*backtest
start: 2024-08-01 00:00:00
end: 2025-07-30 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Dubic EMA Strategy", overlay=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
initial_capital=10000,
currency=currency.USD,
commission_value=0.1,
pyramiding=0,
calc_on_every_tick=true)
// Inputs
ema_length = input.int(40, "EMA Length")
tp_percent = input.float(2.0, "Take Profit %", step=0.1, minval=0.1) / 100
sl_offset = input.float(0.5, "Stop Loss Offset %", step=0.1, minval=0.1) / 100
// Toggles for SL/TP
use_take_profit = input.bool(true, "Use Take Profit")
use_stop_loss = input.bool(true, "Use Stop Loss")
// Range Detection
range_length = input.int(20, "Range Detection Length", minval=5)
range_threshold = input.float(2.0, "Range Threshold %", step=0.1) / 100
min_range_bars = input.int(3, "Min Range Bars", minval=1)
// Parabolic SAR
use_parabolic_sar = input.bool(true, "Use Parabolic SAR Trailing Stop")
sar_start = input.float(0.02, "SAR Start", step=0.01)
sar_increment = input.float(0.02, "SAR Increment", step=0.01)
sar_max = input.float(0.2, "SAR Maximum", step=0.01)
// ATR Stop Configuration
use_atr_stop = input.bool(true, "Use ATR Stop Instead of Fixed %")
atr_length = input.int(14, "ATR Length")
atr_mult = input.float(1.5, "ATR Multiplier", minval=0.5)
// Volatility Filter
min_atr = input.float(0.5, "Min ATR % for Trading", step=0.1) / 100
use_volatility_filter = input.bool(true, "Enable Volatility Filter")
// Unbroken Range Visualization
show_unbroken_range = input.bool(true, "Show Unbroken Range Visualization", group="Unbroken Range")
unbroken_length = input.int(20, 'Minimum Range Length', minval=2, group="Unbroken Range")
unbroken_mult = input.float(1., 'Range Width', minval=0, step=0.1, group="Unbroken Range")
unbroken_atrLen = input.int(500, 'ATR Length', minval=1, group="Unbroken Range")
upCss = input.color(#089981, 'Broken Upward', group="Unbroken Range")
dnCss = input.color(#f23645, 'Broken Downward', group="Unbroken Range")
unbrokenCss = input.color(#2157f3, 'Unbroken', group="Unbroken Range")
// Calculate Indicators
ema_high = ta.ema(high, ema_length)
ema_low = ta.ema(low, ema_length)
ema_200 = ta.ema(close, 200)
sar = ta.sar(sar_start, sar_increment, sar_max)
atr = ta.atr(atr_length)
// Volatility Filter
atr_percentage = (atr / close) * 100
sufficient_volatility = not use_volatility_filter or (atr_percentage >= min_atr * 100)
// Range Detection Logic
range_high = ta.highest(high, range_length)
range_low = ta.lowest(low, range_length)
range_size = range_high - range_low
range_percentage = (range_size / close) * 100
range_condition = range_percentage <= (range_threshold * 100)
// Consecutive range bars counter
var int range_bars_count = 0
range_bars_count := range_condition ? range_bars_count + 1 : 0
in_range = range_bars_count >= min_range_bars
// Visualize Range
bgcolor(in_range ? color.new(color.purple, 85) : na, title="Range Zone")
plot(in_range ? range_high : na, "Range High", color=color.purple, linewidth=2, style=plot.style_linebr)
plot(in_range ? range_low : na, "Range Low", color=color.purple, linewidth=2, style=plot.style_linebr)
// Trading Conditions
buy_condition = (close > ema_high) and (close > ema_low)
sell_condition = (close < ema_high) and (close < ema_low)
// Apply Filters
buy_signal = buy_condition and not in_range and sufficient_volatility
sell_signal = sell_condition and not in_range and sufficient_volatility
// Trend State Machine
var int currentTrend = 0 // 0=neutral, 1=long, -1=short
var bool showBuy = false
var bool showSell = false
trendChanged = false
if buy_signal and currentTrend != 1
currentTrend := 1
trendChanged := true
showBuy := true
showSell := false
else if sell_signal and currentTrend != -1
currentTrend := -1
trendChanged := true
showBuy := false
showSell := true
// Reset signals
showBuy := nz(showBuy[1]) and not trendChanged ? false : showBuy
showSell := nz(showSell[1]) and not trendChanged ? false : showSell
// Plot Indicators
plot(ema_high, "EMA High", color=color.blue, linewidth=2)
plot(ema_low, "EMA Low", color=color.orange, linewidth=2)
plot(ema_200, "200 EMA", color=color.white, linewidth=3)
// Plot SAR with color coding
color sarColor = strategy.position_size > 0 ? color.red :
strategy.position_size < 0 ? color.green :
color.gray
plot(use_parabolic_sar ? sar : na, "SAR", style=plot.style_circles, color=sarColor, linewidth=2)
// Plot signals
plotshape(showBuy, title="Buy Signal", text="BUY", style=shape.labelup,
location=location.belowbar, color=color.green, textcolor=color.white, size=size.tiny)
plotshape(showSell, title="Sell Signal", text="SELL", style=shape.labeldown,
location=location.abovebar, color=color.red, textcolor=color.white, size=size.tiny)
// Strategy Logic
var float long_sl = na
var float long_tp = na
var float short_sl = na
var float short_tp = na
var float long_trail_stop = na
var float short_trail_stop = na
// Position Sizing with Volatility Scaling
position_size = use_volatility_filter ? math.min(100, 100 * (min_atr * 100) / atr_percentage) : 100
// Execute trades
if (showBuy)
// Calculate stop loss and take profit
long_sl := use_atr_stop ? close - atr * atr_mult : ema_low * (1 - sl_offset)
long_tp := close * (1 + tp_percent)
long_trail_stop := use_parabolic_sar ? sar : na
strategy.close("Short", comment="Exit Short")
strategy.entry("Long", strategy.long, qty=position_size)
// Set exit orders with toggle support
if use_stop_loss or use_take_profit
strategy.exit("Long SL/TP", "Long",
stop=use_stop_loss ? long_sl : na,
limit=use_take_profit ? long_tp : na)
if use_parabolic_sar
strategy.exit("Long SAR", "Long", stop=long_trail_stop)
alert("BUY: " + syminfo.ticker, alert.freq_once_per_bar)
if (showSell)
// Calculate stop loss and take profit
short_sl := use_atr_stop ? close + atr * atr_mult : ema_high * (1 + sl_offset)
short_tp := close * (1 - tp_percent)
short_trail_stop := use_parabolic_sar ? sar : na
strategy.close("Long", comment="Exit Long")
strategy.entry("Short", strategy.short, qty=position_size)
// Set exit orders with toggle support
if use_stop_loss or use_take_profit
strategy.exit("Short SL/TP", "Short",
stop=use_stop_loss ? short_sl : na,
limit=use_take_profit ? short_tp : na)
if use_parabolic_sar
strategy.exit("Short SAR", "Short", stop=short_trail_stop)
alert("SELL: " + syminfo.ticker, alert.freq_once_per_bar)
// Update SAR trailing stops
if barstate.isrealtime and use_parabolic_sar
if strategy.position_size > 0
strategy.exit("Long SAR", "Long", stop=long_trail_stop)
else if strategy.position_size < 0
strategy.exit("Short SAR", "Short", stop=short_trail_stop)
// Plot SL/TP levels with toggle support
plot(strategy.position_size > 0 and use_stop_loss ? long_sl : na, "Long Stop", color=color.red, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and use_take_profit ? long_tp : na, "Long Take Profit", color=color.green, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 and use_stop_loss ? short_sl : na, "Short Stop", color=color.red, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 and use_take_profit ? short_tp : na, "Short Take Profit", color=color.green, style=plot.style_linebr, linewidth=2)
// Plot SAR trailing stops
plot(strategy.position_size > 0 and use_parabolic_sar ? long_trail_stop : na,
"Long Trail Stop", color=color.orange, style=plot.style_circles, linewidth=2)
plot(strategy.position_size < 0 and use_parabolic_sar ? short_trail_stop : na,
"Short Trail Stop", color=color.orange, style=plot.style_circles, linewidth=2)
// Alerts
alertcondition(showBuy, title="Buy Alert", message="BUY: {{ticker}}")
alertcondition(showSell, title="Sell Alert", message="SELL: {{ticker}}")