
A estratégia baseia-se no comportamento de ruptura dos preços de mercado em níveis críticos de preços e aumenta a confiabilidade dos sinais de negociação através da utilização da média móvel e do índice de direção média (ADX) como filtro. O sistema utiliza um quadro de tempo de 1 hora para construir áreas de ruptura de resistência de suporte dinâmico através da identificação dos pontos altos e baixos do eixo central e, ao mesmo tempo, estabelece um mecanismo de parada de perda de percentual fixo para controlar o risco quando essas áreas de ruptura de preços emitem sinais de negociação.
Os princípios centrais da estratégia baseiam-se no comportamento de ruptura dos preços nos pontos críticos de resistência de suporte, combinando a direção da tendência e a filtragem da intensidade do mercado, formando um sistema de negociação completo. Os princípios concretos de implementação incluem:
Identificação de pontos de resistência de suporteO sistema usa o método de Pivot Points para identificar níveis de preços importantes.ta.pivothigheta.pivotlowFunção que calcula os pontos altos e baixos do eixo central com 5 ciclos como parâmetros padrão e usa esses pontos como pontos de resistência e suporte potenciais.
Gestão regional dinâmicaO sistema usa uma estrutura de arrays:supportLevelseresistanceLevelsArmazenamento de resistência de suporte, e através de funções personalizadasf_add_levelGestão inteligente desses níveis de preços. Esta função garante que os novos níveis adicionados tenham uma distância suficiente dos níveis existentes (default 2%), evitando a superlotação das áreas, enquanto limita a retenção de até 5 níveis mais recentes.
Filtros de confirmação de tendênciaA estratégia usa a média móvel simples de 50 ciclos (SMA) como indicador de direção da tendência. Considere o excesso somente quando o preço estiver acima da média e o espaço somente quando estiver abaixo da média, seguindo a tendência geral do mercado.
Verificação de força de mercado: Avaliação da força do mercado através da função ADX (Average Directional Index) personalizada. O valor do ADX deve ser maior do que o limite definido (default 25), garantindo a entrada de negociação somente quando o mercado é suficientemente forte para evitar falsas rupturas em um ambiente de mercado fraco.
Geração de sinal de entrada:
Mecanismo de gestão de riscosA estratégia usa um parâmetro de stop loss de porcentagem fixa, um parâmetro de stop loss de 15% e um parâmetro de stop loss de 10%, e um parâmetro de stop loss de 10% e um parâmetro de stop loss de 10%. Uma vez que o preço atinge esses níveis, o sistema elimina automaticamente a posição e reinicia a negociação.
Com base em uma análise profunda do código, a estratégia tem as seguintes vantagens significativas:
Mecanismo de confirmação múltipla: A combinação de resistência de ruptura de suporte, a direção da tendência e a força do triplo ADX reduz o risco de falsa ruptura. Comparado com um único indicador, o mecanismo de confirmação múltipla aumenta a confiabilidade do sinal de negociação.
Áreas de resistência de suporte dinâmicoO sistema identifica e gerencia de forma dinâmica os suportes e resistências, adaptando-se a diferentes cenários de mercado. Mantém até 5 suportes e resistências mais recentes, garantindo que a estratégia se concentre nos níveis de preços mais relevantes.
Aglomerados regionais inteligentes: Com o parâmetro de porcentagem de largura máxima de área ((maxZoneWidthPct), evita-se o recomputo de resistências de suporte muito próximas, reduzindo a redundância de sinais.
Cálculo de ADX personalizado: A estratégia usa funções ADX personalizadas para garantir a precisão e a flexibilidade do cálculo do indicador, através do cálculo direto da amplitude real, do movimento direcional e do processamento suave.
Configuração de parâmetros flexívelA estratégia oferece vários parâmetros ajustáveis, incluindo comprimento do eixo central, período de retrocesso, largura máxima da área, porcentagem de stop-loss e limite de ADX, que o usuário pode otimizar de acordo com diferentes condições de mercado e preferências de negociação.
Controle de risco claroO principal objetivo é fornecer uma estrutura clara de gerenciamento de risco para cada transação, evitando perdas excessivas em uma única transação, enquanto se bloqueia um lucro razoável.
Visualização intuitivaEstratégia: Marca os suportes de resistência e os sinais de negociação no gráfico, fornecendo um feedback visual intuitivo por meio da codificação de cores (suporte verde, resistência vermelha) e etiquetas (longo, curto, EXIT) para facilitar a análise de retorno e monitoramento em tempo real.
Apesar do bom desenho da estratégia, existem os seguintes riscos e limitações potenciais:
Falso avanço em um mercado altamente volátil: Em um ambiente de mercado de alta volatilidade, os preços podem frequentemente romper a resistência de suporte e depois voltar para a faixa original, resultando em um aumento de sinais de falsa ruptura. Método de Solução: Pode-se considerar o aumento do ciclo de confirmação, exigindo que os preços permaneçam por algum tempo após a ruptura ou formem uma forma específica para confirmar o sinal.
Excessiva dependência de suportes e resistências históricasA estratégia baseia-se na formação histórica de suportes e resistências, que podem ser invalidados por mudanças fundamentais na estrutura do mercado (como eventos de notícias importantes). Solução: Considere a adição de um mecanismo de ajuste dinâmico para ajustar automaticamente os suportes e resistências de acordo com a volatilidade do mercado.
Limitação de percentual fixo de stop lossA percentagem fixa de stop loss pode não ser adequada para todos os cenários de mercado, pode ser muito grande em mercados de baixa volatilidade e pode ser muito pequena em mercados de alta volatilidade. Solução: Pode-se considerar o ajuste dinâmico do nível de stop loss com base no ATR.
Risco de reversão de tendênciaUsar o SMA de 50 ciclos como um indicador de tendência pode atrasar a reação inicial de uma reversão de tendência, resultando em uma entrada de tendência quando a tendência está prestes a terminar. Método de Solução: Considere adicionar um indicador de tendência de curto prazo mais sensível ou um indicador de momentum como um julgamento auxiliar.
Estratégias de computação intensivaA estratégia requer a computação e manutenção de múltiplos conjuntos e indicadores em tempo real, podendo enfrentar desafios de desempenho em ambientes de negociação de alta frequência ou com recursos limitados. Soluções: otimização da eficiência do algoritmo, redução de cálculos desnecessários ou consideração de redução da frequência de atualização.
Sensibilidade do parâmetroA estratégia de desempenho é sensível a configurações de parâmetros, como comprimento do eixo central, o threshold ADX, e a escolha inadequada de parâmetros pode levar a excesso de negociação ou a oportunidades perdidas. Solução: estabelecer uma estrutura de otimização de parâmetros através do teste de desempenho de parâmetros em diferentes condições de mercado.
Com base em uma análise aprofundada do código da estratégia, os seguintes são potenciais direções de otimização:
Mecanismo de parâmetros de adaptaçãoIntrodução de mecanismos para ajustar automaticamente os parâmetros-chave de acordo com a volatilidade do mercado. Por exemplo, aumentar o limiar ADX ou a largura da área de resistência de suporte durante a alta volatilidade e reduzir esses parâmetros durante a baixa volatilidade, para que a estratégia se adapte melhor a diferentes condições de mercado. Isso reduz os erros de negociação em condições de mercado inadequadas.
Análise de Multi-Framas de TempoAumento da confirmação de resistência de suporte para um período mais longo. A qualidade do sinal pode ser melhorada ao identificar áreas de resistência de suporte em um diagrama ou gráfico de perímetro que coincidem com os níveis em um gráfico de 1 hora atual.
Confirmação de transação: Combinação com análise de volume de transação para verificar a eficácia de uma brecha. Brechas realmente eficazes geralmente são acompanhadas por um aumento significativo no volume de transações, e o risco de falsas brechas causadas por baixo volume de transações pode ser reduzido através da adição de condições de filtragem de volume de transação.
Paragem dinâmica: Definição dinâmica de níveis de stop loss com base na volatilidade do mercado (como o ATR), em vez de percentagens fixas. Isso torna a gestão de risco mais flexível, podendo ajustar automaticamente os níveis de proteção de acordo com as condições atuais do mercado, estabelecendo um stop loss mais flexível em mercados de alta volatilidade e um stop loss mais apertado em mercados de baixa volatilidade.
Mecanismo de bloqueio parcial de lucrosIntrodução de um mecanismo de lucro intercalar, que permite mover o stop loss para o preço de custo ou bloquear parte do lucro após atingir um determinado nível de lucro. Esta abordagem pode reduzir o risco de retirada, mantendo um alto potencial de lucro.
Integração de indicadores emocionaisConsidere a integração de indicadores de sentimento de mercado (como VIX ou indicadores de fraqueza relativa) como condição de filtragem adicional. O sentimento de mercado geralmente afeta a sustentabilidade da ruptura, e pode aumentar a compreensão da estratégia sobre o estado do mercado, aumentando a dimensão de análise de sentimento.
Classificação de resistência de suporteIntrodução de um mecanismo de avaliação de resistência de suporte, com base no número de testes históricos e a duração do tempo de formação, para avaliar a intensidade de cada nível. Desta forma, pode-se priorizar os níveis de preços mais fortes e mais propensos a produzir uma resposta eficaz.
Otimização de aprendizagem de máquinaConsidere o uso de métodos de aprendizagem de máquina para otimizar a seleção de parâmetros e a geração de sinais. Os algoritmos de aprendizagem de máquina podem ajudar a identificar as combinações de parâmetros e condições de mercado mais eficazes, analisando padrões de negociação bem sucedidos e fracassados em dados históricos.
O sistema de negociação quantitativa do filtro ADX é um sistema de negociação integrado, bem projetado, que combina vários elementos-chave da análise técnica. A estratégia identifica e monitora os pontos de resistência de suporte, combinando a direção da tendência e a filtragem da força do mercado, criando um mecanismo de geração de sinais de negociação relativamente confiável.
A principal vantagem da estratégia reside no seu mecanismo de confirmação múltipla e na sua estrutura de gestão de risco, que reduz o risco de false breakouts e limita os potenciais prejuízos de uma única transação. Além disso, a estratégia oferece uma grande variedade de opções de configuração de parâmetros, permitindo aos traders a flexibilidade de ajustes de acordo com as preferências de risco individuais e o ambiente de mercado.
No entanto, a estratégia também enfrenta alguns desafios, como o risco de brechas falsas em mercados altamente voláteis, a limitação de stop-loss fixos e a sensibilidade dos parâmetros. O desempenho da estratégia deverá ser melhorado ainda mais com a introdução de medidas de otimização, como mecanismos de parâmetros adaptativos, análise de múltiplos quadros temporais, confirmação de volume de negócios e gerenciamento de risco dinâmico.
Em geral, trata-se de uma estratégia de negociação quantitativa com clareza lógica e design racional, adequada para o uso de comerciantes com um certo entendimento da análise técnica e da estrutura do mercado. A estratégia tem o potencial de manter um desempenho estável em diferentes ambientes de mercado por meio de otimização contínua e adaptação às mudanças do mercado.
/*backtest
start: 2024-05-30 00:00:00
end: 2025-05-29 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("S/R Breakout Strategy (1H) with Trend and ADX Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// ─────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────
pivotLen = input.int(5, title="Pivot Length")
lookbackBars = input.int(300, title="Lookback Bars")
maxZoneWidthPct = input.float(2.0, title="Max Zone Width %")
tpLong = input.float(0.15, title="Take Profit % (Long)")
slLong = input.float(0.10, title="Stop Loss % (Long)")
tpShort = input.float(0.10, title="Take Profit % (Short)")
slShort = input.float(0.10, title="Stop Loss % (Short)")
allowLong = input.bool(true, title="Allow Long Trades")
allowShort = input.bool(true, title="Allow Short Trades")
// ADX settings
adxThreshold = input.float(25.0, title="ADX Threshold")
adxLen = input.int(14, title="ADX Length")
// Trend filter: 50-period moving average
ma50 = ta.sma(close, 50)
// ─────────────────────────────────────────────────────────────
// CUSTOM ADX FUNCTION
// ─────────────────────────────────────────────────────────────
// This function calculates ADX using the common method based on true range,
// directional movement and smoothing it with the RMA.
f_adx(len) =>
// true range for the current bar
tr = ta.tr
// Calculate upward and downward moves
upMove = high - high[1]
downMove = low[1] - low
// Determine directional movements
plusDM = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
// Smooth the values using RMA (running moving average)
smPlusDM = ta.rma(plusDM, len)
smMinusDM = ta.rma(minusDM, len)
smTR = ta.rma(tr, len)
// Calculate the directional indicators, avoid division by zero
plusDI = (smTR != 0) ? 100 * smPlusDM / smTR : 0.0
minusDI = (smTR != 0) ? 100 * smMinusDM / smTR : 0.0
diSum = plusDI + minusDI
dx = (diSum != 0) ? 100 * math.abs(plusDI - minusDI) / diSum : 0.0
// Smooth the DX to get ADX
ta.rma(dx, len)
// Compute ADX value using the custom function
adxValue = f_adx(adxLen)
// ─────────────────────────────────────────────────────────────
// PIVOT DETECTION & SUPPORT/RESISTANCE LEVELS
// ─────────────────────────────────────────────────────────────
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow = ta.pivotlow(low, pivotLen, pivotLen)
// Declare arrays for support and resistance levels
var float[] supportLevels = array.new_float()
var float[] resistanceLevels = array.new_float()
// Function to add a level into the provided array if it meets the criteria.
// Always returns a float (0.0) for consistency.
f_add_level(arr, newLevel) =>
if array.size(arr) == 0
array.push(arr, newLevel)
else
shouldAdd = true
for i = 0 to (array.size(arr) - 1)
existing = array.get(arr, i)
if math.abs(existing - newLevel) / newLevel * 100 <= maxZoneWidthPct
shouldAdd := false
if shouldAdd
array.push(arr, newLevel)
if array.size(arr) > 5
array.shift(arr)
0.0
// Update support and resistance arrays once sufficient bars have formed
if bar_index > pivotLen * 2
if not na(pivotLow)
f_add_level(supportLevels, pivotLow)
if not na(pivotHigh)
f_add_level(resistanceLevels, pivotHigh)
// ─────────────────────────────────────────────────────────────
// TRADE MANAGEMENT VARIABLES
// ─────────────────────────────────────────────────────────────
var bool inTrade = false
var bool isLong = false
var float entryPrice = na
// Signal flags
longSignal = false
shortSignal = false
// Detect long signal: price crosses above support level
if array.size(supportLevels) > 0
for i = 0 to (array.size(supportLevels) - 1)
lvl = array.get(supportLevels, i)
if low < lvl and close > lvl
longSignal := true
// Detect short signal: price crosses below resistance level
if array.size(resistanceLevels) > 0
for i = 0 to (array.size(resistanceLevels) - 1)
lvl = array.get(resistanceLevels, i)
if high > lvl and close < lvl
shortSignal := true
// ─────────────────────────────────────────────────────────────
// ENTRY CONDITIONS & EXECUTION
// ─────────────────────────────────────────────────────────────
if not inTrade
// Long entry: require long signal, price above 50MA, and ADX above threshold
if allowLong and longSignal and close > ma50 and adxValue > adxThreshold
strategy.entry("Long", strategy.long)
label.new(x=bar_index, y=low, text="LONG", xloc=xloc.bar_index, style=label.style_label_up, color=color.green, textcolor=color.white)
entryPrice := close
isLong := true
inTrade := true
// Short entry: require short signal, price below 50MA, and ADX above threshold
else if allowShort and shortSignal and close < ma50 and adxValue > adxThreshold
strategy.entry("Short", strategy.short)
label.new(x=bar_index, y=high, text="SHORT", xloc=xloc.bar_index, style=label.style_label_down, color=color.red, textcolor=color.white)
entryPrice := close
isLong := false
inTrade := true
// ─────────────────────────────────────────────────────────────
// EXIT CONDITIONS
// ─────────────────────────────────────────────────────────────
if inTrade
ret = isLong ? (close - entryPrice) / entryPrice : (entryPrice - close) / entryPrice
tp = isLong ? tpLong : tpShort
sl = isLong ? slLong : slShort
if ret >= tp or ret <= -sl
strategy.close_all()
label.new(x=bar_index, y=close, text="EXIT", xloc=xloc.bar_index, style=label.style_label_left, color=color.orange, textcolor=color.black)
inTrade := false
entryPrice := na
// ─────────────────────────────────────────────────────────────
// ALERT CONDITIONS
// ─────────────────────────────────────────────────────────────
alertcondition(longSignal and allowLong, title="Long Breakout", message="🚀 Long breakout on {{ticker}} at {{close}}")
alertcondition(shortSignal and allowShort, title="Short Breakout", message="🔻 Short breakout on {{ticker}} at {{close}}")