Estratégia de acompanhamento de tendências Donichan


Data de criação: 2024-01-31 16:53:31 última modificação: 2024-01-31 16:53:31
cópia: 0 Cliques: 647
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendências Donichan

Visão geral

A estratégia de acompanhamento de tendências do dólar é uma estratégia de acompanhamento de tendências desenvolvida de acordo com o princípio do canal do dólar descrito no artigo Black Box Trend Following Lifting the Veil . A estratégia usa o canal do dólar para determinar a tendência de preços e, de acordo com a inovação de preços, criar posições de alta ou baixa para fazer o over or short.

Princípio da estratégia

A estratégia baseia-se no indicador de canais de Donizetti para determinar a direção da tendência. Os canais de Donizetti consistem em um canal de ciclo mais longo e um canal de ciclo mais curto. Quando o preço quebra o canal de ciclo mais longo, o julgamento começa como uma tendência; Quando o preço quebra o canal de ciclo mais curto, o julgamento termina como uma tendência.

Especificamente, o canal de ciclo mais longo tem uma duração de 50 dias ou 20 dias, e o canal de ciclo mais curto tem uma duração de 50 dias, 20 dias ou 10 dias. Se o preço for igual ao preço mais alto em 50 dias, abriremos um pacote; se o preço for igual ao preço mais baixo em 50 dias, abriremos um pacote vazio. Se o preço for igual ao preço mais baixo em 20 dias ou 10 dias, eliminaremos o pacote; se o preço for igual ao preço mais alto em 20 dias ou 10 dias, eliminaremos o pacote vazio.

Desta forma, através de uma combinação de dois canais de Donizetti de diferentes períodos, é possível determinar a direção de um posicionamento no início da tendência e parar a perda no final da tendência.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. A capacidade de capturar tendências é forte. A partir de uma ruptura do canal do dónio para determinar o início e o fim da tendência, a tendência pode ser efetivamente seguida.

  2. Controle de risco em ação. Uso de stop loss móvel para controlar perdas individuais.

  3. Ajuste de parâmetros flexível. Pode escolher livremente a combinação de ciclos do canal, adaptando-se a diferentes variedades e ambientes de mercado.

  4. Uma lógica de transação simples e clara. Fácil de entender e de implementar.

Análise de Riscos

A estratégia também apresenta os seguintes riscos:

  1. Quando a tendência não é visível, haverá vários ajustes de pequena magnitude, levando a perdas de parada.

  2. Risco de fracasso de ruptura. O preço pode voltar a ser chamado após a ruptura do canal, causando um stop loss.

  3. Risco de escolha do ciclo. Se o ciclo de passagem for configurado incorretamente, isso levará ao trading in noise.

  4. Risco de queda na Sharpe Ratio. Se você aumentar a posição sem ajustar o limite de perda, você corre o risco de queda na Sharpe Ratio.

Resolução:

  1. Parâmetros de otimização, seleção de combinações de ciclos de passagem adequados.
  2. Ajustar adequadamente a posição e a amplitude do stop loss para controlar o risco.
  3. A estratégia é usada em variedades e mercados com tendências.

Direção de otimização

A estratégia pode ser otimizada em várias direções:

  1. Aumentar as condições de filtragem e evitar o whipsaws. Indicadores de potência de ligação, por exemplo, para determinar a verdadeira ruptura.

  2. Optimizar a combinação e o controle de posições do ciclo de canalização, melhorar a taxa de perda e ganho. Pode ser introduzido um mecanismo de parada de perda adaptável.

  3. Tente otimizar o ponto de ruptura para encontrar a melhor combinação de parâmetros.

  4. Adicionar algoritmos de aprendizagem de máquina para otimizar e ajustar dinamicamente os parâmetros.

Resumir

A estratégia de acompanhamento de tendências de Donizetti é uma estratégia de acompanhamento de tendências muito prática, com flexibilidade e facilidade de implementação. Mas também é necessário ter em conta a falta de rentabilidade em situações de choque e os riscos associados à escolha de parâmetros. Com otimização adicional, é possível obter melhores resultados da estratégia.

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,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=2, slippage=2)

// =============================================================================
// VARIABLES
// =============================================================================

donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50')
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 = false)

// =============================================================================
// 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 VERTICAL COLOR BAR
// =============================================================================

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 DONCHIAN 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='Close in end')

// =============================================================================
// END
// =============================================================================