
A estratégia de acompanhamento de tendências de canal de Donchian é uma estratégia de acompanhamento de tendências baseada no indicador de canal de Donchian. Ela usa canais de Donchian de diferentes comprimentos para identificar tendências de preços e gerar sinais de negociação quando os preços atravessam o canal.
A principal ideia da estratégia é usar o canal Donchian de longo período para determinar a direção da grande tendência, usando o canal Donchian de curto período como sinal de entrada e parada. O objetivo é capturar a tendência de preços na linha média e longa, evitando ser confundido com as flutuações de curto prazo no mercado.
Calcular o preço máximo de fechamento e o preço mínimo de fechamento de um longo período (por exemplo, 50 dias) constrói o canal de Donchian. Quando o preço quebra o canal de alta, ele é alto, e quando o preço quebra o canal de baixa, ele é baixo.
Calcule o preço máximo de fechamento e o preço mínimo de fechamento de um período curto (por exemplo, 20 dias) como critérios de entrada e parada. Quando o preço quebra o canal longo, se o preço de fechamento também quebra o canal curto, a entrada é a mais/nulo.
Quando se mantém uma posição multihead, se o preço cair abaixo da linha curta, o preço é interrompido. Quando se mantém uma posição headless, o preço é interrompido se a linha curta for interrompida.
O ponto de parada é definido como N vezes o ATR. Isso pode ser ajustado automaticamente de acordo com a volatilidade do mercado, o que ajuda a reduzir a possibilidade de o stop ser ativado.
Pode-se optar por fechar a posição antes do final da negociação, ou manter a posição até a parada. Isso pode ser controlado por um parâmetro de entrada.
A estratégia leva em conta simultaneamente o discernimento de tendências e a parada de lucros, captando a tendência dos preços e controlando o risco, e é adequada para operações de linha média e longa.
Identificar de forma eficaz as tendências de longo prazo e evitar o ruído do mercado de curto prazo.
O mecanismo de parada automática pode limitar os prejuízos individuais
O stop ATR pode ser ajustado de acordo com a volatilidade do mercado, reduzindo a probabilidade de o stop ser atingido.
Pode optar por fechar automaticamente a posição quando não puder negociar, gerenciando o risco de negociação.
A lógica da estratégia é simples, clara e fácil de entender.
Em mercados onde não há uma tendência clara, as estratégias geram mais transações, o que aumenta os custos de transação e a possibilidade de perda.
Embora haja um mecanismo de parada de perdas, em situações excepcionais, as lacunas de preços podem cair diretamente acima do ponto de parada e causar grandes perdas.
A ATR é calculada apenas com base em dados históricos, não prevendo com precisão o futuro e a volatilidade, e a distância real de parada pode ser muito grande ou pequena.
No mundo real, o stop loss não pode ser executado com 100% de certeza. Em casos extremos, pode ser ignorado e causar perdas.
Ajustar os parâmetros do canal Donchian para otimizar o efeito da identificação de tendências.
Combinado com outros indicadores de confirmação de sinais de negociação, como MACD, KDJ, etc., eleva a estabilidade da estratégia.
Aumentar o Stop Loss móvel, permitindo que o ponto de Stop Loss se mova com o preço, limitando ainda mais os prejuízos
Teste o impacto de diferentes períodos de detenção sobre o efeito geral para determinar o melhor período de detenção.
Considere a possibilidade de ajustar dinamicamente o tamanho da posição e aumentar a posição em uma situação de tendência.
A estratégia de acompanhamento de tendências do canal Donchian integra o julgamento de tendências com o controle de riscos, obtendo o excess return através da identificação de tendências, enquanto o mecanismo de parada controla o risco da cauda. A estratégia é adequada para identificar e capturar tendências de preços de linha média e longa, obtendo um retorno positivo estável após a otimização de parâmetros e a suplementação do mecanismo.
/*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
// =============================================================================