Estratégia de acompanhamento de tendências do canal Donchian


Data de criação: 2024-01-22 12:30:05 última modificação: 2024-01-22 12:30:05
cópia: 0 Cliques: 645
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendências do canal Donchian

Visão geral

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.

Princípio da estratégia

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Análise de vantagens

  1. Identificar de forma eficaz as tendências de longo prazo e evitar o ruído do mercado de curto prazo.

  2. O mecanismo de parada automática pode limitar os prejuízos individuais

  3. O stop ATR pode ser ajustado de acordo com a volatilidade do mercado, reduzindo a probabilidade de o stop ser atingido.

  4. Pode optar por fechar automaticamente a posição quando não puder negociar, gerenciando o risco de negociação.

  5. A lógica da estratégia é simples, clara e fácil de entender.

Análise de Riscos

  1. 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.

  2. 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.

  3. 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.

  4. No mundo real, o stop loss não pode ser executado com 100% de certeza. Em casos extremos, pode ser ignorado e causar perdas.

Direção de otimização

  1. Ajustar os parâmetros do canal Donchian para otimizar o efeito da identificação de tendências.

  2. Combinado com outros indicadores de confirmação de sinais de negociação, como MACD, KDJ, etc., eleva a estabilidade da estratégia.

  3. 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

  4. Teste o impacto de diferentes períodos de detenção sobre o efeito geral para determinar o melhor período de detenção.

  5. Considere a possibilidade de ajustar dinamicamente o tamanho da posição e aumentar a posição em uma situação de tendência.

Resumir

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.

Código-fonte da estratégia
/*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
// =============================================================================