A estratégia de seguimento de tendências do canal de Donchian é uma estratégia de seguimento de tendências baseada no indicador do canal de Donchian.
A ideia principal desta estratégia é utilizar um canal de Donchian de período mais longo para determinar a direção da tendência principal e um canal de Donchian de período mais curto como sinal para entrada e stop loss.
Calcule o preço de fechamento mais alto e o preço de fechamento mais baixo durante um longo período (por exemplo, 50 dias) para construir o Canal Donchian. Uma quebra acima da faixa superior indica uma tendência de alta, enquanto uma quebra abaixo da faixa inferior indica uma tendência de queda. Isso determina a direção da tendência principal.
Usar o preço de fechamento mais alto e o preço de fechamento mais baixo durante um curto período (por exemplo, 20 dias) como critérios de entrada e stop loss.
Ao manter uma posição longa, se o preço cair abaixo da faixa inferior de curto período, parar com perda. Ao manter uma posição curta, se o preço romper acima da faixa superior de curto período, parar com perda.
O stop loss é definido em N vezes ATR. Isso se ajusta automaticamente com base na volatilidade do mercado, tornando menos provável que o stop loss seja atingido.
Há uma opção para fechar posições antes do final da sessão de negociação ou manter posições até atingir o stop loss.
A estratégia considera tanto a identificação de tendências quanto o stop loss de lucro.
Identifica eficazmente as tendências a médio e longo prazo sem ser interferido por ruídos de mercado a curto prazo.
Limites automáticos do mecanismo de stop loss por perda comercial.
O sistema ATR permite ajustar a distância de parada com base na volatilidade do mercado, reduzindo a probabilidade de uma parada de perda ser atingida.
Fechar automaticamente as posições quando não for possível gerir os riscos na negociação.
Uma lógica estratégica simples e clara que seja fácil de entender.
Em mercados não em tendência, a estratégia pode gerar mais transações, aumentando os custos de negociação e as chances de perda.
Apesar de possuir um mecanismo de stop loss, as diferenças de preço em condições voláteis podem penetrar no ponto de stop loss causando diretamente grandes perdas.
O cálculo do ATR baseia-se exclusivamente em dados históricos e não pode prever com precisão os movimentos futuros dos preços e a volatilidade.
As ordens de stop loss podem não ser sempre preenchidas na negociação ao vivo, podendo ser ignoradas em condições de volatilidade extrema causando perdas.
Ajustar os parâmetros do canal de Donchian para otimizar o desempenho de identificação de tendências.
Incorporar outros indicadores como MACD, KDJ para confirmar sinais de negociação e melhorar a estabilidade da estratégia.
Adicione stop loss para mover o ponto de stop loss junto com o preço, limitando ainda mais as perdas.
Teste o impacto de diferentes períodos de retenção para obter resultados globais ideais.
Considere ajustar dinamicamente o dimensionamento das posições, ampliando as posições em condições de tendência.
A estratégia de seguimento de tendências do canal Donchian integra a identificação de tendências e o controle de riscos. O objetivo é gerar retornos excessivos identificando tendências enquanto controla os riscos de cauda com mecanismos de stop loss. Esta estratégia é adequada para identificar e capturar tendências de preços de médio a longo prazo. Com otimização de parâmetros e melhorias de mecanismos, pode alcançar resultados positivos constantes.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Donchian", overlay=true, calc_on_every_tick=true) // ============================================================================= // VARIABLES // ============================================================================= donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10') permit_long = input.bool(title = 'Permit long', defval = true) permit_short = input.bool(title = 'Permit short', defval = true) risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25) stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5) atrLen = input.int(title="ATR Length", defval=20) close_in_end = input.bool(title = 'Close in end', defval = true) permit_stop = input.bool(title = 'Permit stop', defval = true) // ============================================================================= // CALCULATIONS // ============================================================================= donch_len_big = donch_string == '50/20' ? 50 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 20 : donch_string == '100/100' ? 100 : na donch_len_small = donch_string == '50/20' ? 20 : donch_string == '50/50' ? 50 : donch_string == '20/20' ? 20 : donch_string == '20/10' ? 10 : donch_string == '100/100' ? 100 : na big_maxclose = ta.highest(close, donch_len_big) big_minclose = ta.lowest(close, donch_len_big) small_maxclose = ta.highest(close, donch_len_small) small_minclose = ta.lowest(close, donch_len_small) atrValue = ta.atr(atrLen)[1] tradeWindow = true // ============================================================================= // NOTOPEN QTY // ============================================================================= risk_usd = (risk_percent / 100) * strategy.equity atr_currency = (atrValue * syminfo.pointvalue) notopen_qty = risk_usd / (stopOffset * atr_currency) // ============================================================================= // LONG STOP // ============================================================================= long_stop_price = 0.0 long_stop_price := strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price: strategy.position_size > 0 ? long_stop_price[1] : na // ============================================================================= // SHORT STOP // ============================================================================= short_stop_price = 0.0 short_stop_price := strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price : strategy.position_size < 0 ? short_stop_price[1] : na // ============================================================================= // PLOT BG VERTICAL COLOR // ============================================================================= cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long cross_dn = strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short bg_color = cross_up ? color.green : cross_dn ? color.red : na bg_color := color.new(bg_color, 70) bgcolor(bg_color) // ============================================================================= // PLOT HORIZONTAL LINES // ============================================================================= s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black") plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black") plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow") plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red") plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia") // ============================================================================= // ENTRY ORDERS // ============================================================================= if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long strategy.entry("Long", strategy.long, qty=notopen_qty) if (strategy.position_size >= 0) and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short strategy.entry("Short", strategy.short, qty=notopen_qty) // ============================================================================= // EXIT ORDERS // ============================================================================= if strategy.position_size > 0 and permit_stop strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price) if strategy.position_size < 0 and permit_stop strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price) // ========== if strategy.position_size > 0 and close == small_minclose and not barstate.islast strategy.close(id="Long", comment='Donch') if strategy.position_size < 0 and close == small_maxclose and not barstate.islast strategy.close(id="Short", comment='Donch') // ========== if close_in_end if not tradeWindow strategy.close_all(comment='In end') // ============================================================================= // END // =============================================================================