O recurso está a ser carregado... Carregamento...

Estratégia de ruptura adaptativa do canal com sistema de negociação dinâmico de suporte e resistência

Autora:ChaoZhang, Data: 2025-01-06 11:40:35
Tags:SRATRRRSLTPMA

img

Resumo

Esta estratégia é um sistema de negociação avançado baseado em níveis de suporte e resistência, combinando canais de tendência dinâmica com funcionalidade de gerenciamento de risco.

Princípios de estratégia

A lógica central inclui vários elementos-chave:

  1. Os níveis de suporte e resistência são calculados com base nos preços mais baixos e mais altos dentro de um período definido pelo utilizador
  2. A largura do canal dinâmico é definida através de parâmetros percentuais, construindo canais superiores e inferiores com base nos níveis de suporte e resistência
  3. Os sinais de compra são acionados quando o preço se aproxima do nível de suporte (a uma distância de 1%).
  4. O sistema calcula automaticamente os níveis de stop-loss e take-profit com base nas percentagens definidas pelo utilizador
  5. As operações são executadas apenas dentro do intervalo de tempo de backtesting especificado
  6. Os rácios risco/recompensação são calculados e exibidos em tempo real para ajudar os operadores a avaliar os retornos potenciais em relação aos riscos

Vantagens da estratégia

  1. Alta adaptabilidade: os níveis de suporte e resistência ajustam-se dinamicamente às alterações do mercado, adaptando-se a diferentes ambientes de mercado
  2. Gerenciamento de Risco Integrado: Integra o cálculo de stop-loss, take-profit e relação risco-recompensa com visualização
  3. Sinais de negociação claros: fornece sinais de entrada distintos, reduzindo o impacto do julgamento subjetivo
  4. Excelente visualização: Vários níveis de preço são exibidos de forma intuitiva através de linhas e rótulos de cores diferentes
  5. Parâmetros flexíveis: permite aos utilizadores ajustar os parâmetros com base no seu estilo de negociação pessoal e nas características do mercado

Riscos estratégicos

  1. Risco de volatilidade do mercado: pode desencadear sinais de negociação excessivos em mercados altamente voláteis
  2. Risco de Falsa Breakout: o preço aproximando-se dos níveis de suporte pode resultar em Falsa Breakouts que levem a sinais incorretos.
  3. Sensibilidade do parâmetro: o desempenho da estratégia depende muito do período de visualização e das configurações de largura do canal
  4. Limitação de negociação unidirecional: Atualmente só suporta posições longas, potencialmente perdendo oportunidades de negociação curta
  5. Dependência do tempo: a eficácia da estratégia é limitada ao intervalo de tempo especificado de backtesting

Orientações para a otimização da estratégia

  1. Adicionar Filtro de Tendência: Incorporar médias móveis ou indicadores de momento para filtrar sinais de contra-tendência
  2. Direcções de negociação completas: adicionar lógica de negociação curta para melhorar a abrangência da estratégia
  3. Otimizar a geração de sinais: integrar indicadores de volume para verificar a validade da ruptura de preços
  4. Configuração dinâmica de stop-loss: ajuste dinâmico das distâncias de stop-loss com base no ATR ou na volatilidade
  5. Melhorar a gestão de posições: ajustar dinamicamente as posições com base no rácio risco/retorno e na volatilidade do mercado

Resumo

Esta estratégia combina os principais conceitos de análise técnica - níveis de suporte / resistência e canais de tendência - para construir um sistema de negociação logicamente rigoroso e controlado pelo risco. Os pontos fortes da estratégia estão em sua adaptabilidade e gerenciamento abrangente de riscos, mas os comerciantes ainda precisam ajustar cuidadosamente os parâmetros com base nas condições do mercado e na tolerância ao risco pessoal. Através das direções de otimização sugeridas, a estratégia tem espaço para melhoria adicional e pode se desenvolver em um sistema de negociação mais abrangente e robusto.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Support and Resistance with Trend Lines and Channels", overlay=true)

// Inputs
lookback = input.int(20, title="Lookback Period for Support/Resistance", minval=1)
channelWidth = input.float(0.01, title="Channel Width (%)", minval=0.001) / 100
startDate = input(timestamp("2023-01-01 00:00"), title="Backtesting Start Date")
endDate = input(timestamp("2023-12-31 23:59"), title="Backtesting End Date")

// Check if the current bar is within the testing range
inTestingRange = true

// Support and Resistance Levels
supportLevel = ta.lowest(low, lookback)  // Swing low (support)
resistanceLevel = ta.highest(high, lookback)  // Swing high (resistance)

// Trend Lines and Channels
var line supportLine = na
var line resistanceLine = na
var line upperChannelLine = na
var line lowerChannelLine = na

// Calculate channel levels
upperChannel = resistanceLevel * (1 + channelWidth)  // Upper edge of channel
lowerChannel = supportLevel * (1 - channelWidth)  // Lower edge of channel

// Create or update the support trend line
// if na(supportLine)
//     supportLine := line.new(bar_index, supportLevel, bar_index + 1, supportLevel, color=color.green, width=2, extend=extend.right)
// else
//     line.set_y1(supportLine, supportLevel)
//     line.set_y2(supportLine, supportLevel)

// // Create or update the resistance trend line
// if na(resistanceLine)
//     resistanceLine := line.new(bar_index, resistanceLevel, bar_index + 1, resistanceLevel, color=color.red, width=2, extend=extend.right)
// else
//     line.set_y1(resistanceLine, resistanceLevel)
//     line.set_y2(resistanceLine, resistanceLevel)

// // Create or update the upper channel line
// if na(upperChannelLine)
//     upperChannelLine := line.new(bar_index, upperChannel, bar_index + 1, upperChannel, color=color.blue, width=1, style=line.style_dashed, extend=extend.right)
// else
//     line.set_y1(upperChannelLine, upperChannel)
//     line.set_y2(upperChannelLine, upperChannel)

// // Create or update the lower channel line
// if na(lowerChannelLine)
//     lowerChannelLine := line.new(bar_index, lowerChannel, bar_index + 1, lowerChannel, color=color.purple, width=1, style=line.style_dashed, extend=extend.right)
// else
//     line.set_y1(lowerChannelLine, lowerChannel)
//     line.set_y2(lowerChannelLine, lowerChannel)

// Buy Condition: When price is near support level
buyCondition = close <= supportLevel * 1.01 and inTestingRange
if buyCondition
    strategy.entry("Buy", strategy.long)

// Stop Loss and Take Profit
stopLossPercentage = input.float(1.5, title="Stop Loss Percentage", minval=0.0) / 100
takeProfitPercentage = input.float(3.0, title="Take Profit Percentage", minval=0.0) / 100

var float longStopLoss = na
var float longTakeProfit = na
if strategy.position_size > 0
    longStopLoss := strategy.position_avg_price * (1 - stopLossPercentage)
    longTakeProfit := strategy.position_avg_price * (1 + takeProfitPercentage)
    strategy.exit("Exit Buy", "Buy", stop=longStopLoss, limit=longTakeProfit)

// Visualize Entry, Stop Loss, and Take Profit Levels
var float entryPrice = na
if buyCondition
    entryPrice := close
if not na(entryPrice)
    label.new(bar_index, entryPrice, text="Entry: " + str.tostring(entryPrice, "#.##"), style=label.style_label_up, color=color.green, textcolor=color.white)

if strategy.position_size > 0
    line.new(bar_index, longStopLoss, bar_index + 1, longStopLoss, color=color.red, width=1, extend=extend.right)
    line.new(bar_index, longTakeProfit, bar_index + 1, longTakeProfit, color=color.blue, width=1, extend=extend.right)

// Risk-to-Reward Ratio (Optional)
if not na(entryPrice) and not na(longStopLoss) and not na(longTakeProfit)
    riskToReward = (longTakeProfit - entryPrice) / (entryPrice - longStopLoss)
    label.new(bar_index, entryPrice, text="R:R " + str.tostring(riskToReward, "#.##"), style=label.style_label_up, color=color.yellow, textcolor=color.black, size=size.small)

Relacionados

Mais.