Tendência Donchiana Seguindo a Estratégia

Autora:ChaoZhang, Data: 2024-01-31 16:53:31
Tags:

img

Resumo

A estratégia Donchian Trend Following é desenvolvida com base no princípio do canal Donchian descrito no artigo Black Box Trend Following Lifting the Veil.

Estratégia lógica

A estratégia é baseada no indicador do canal de Donchian para julgar a direção da tendência. O canal de Donchian consiste em um canal de período mais longo e um canal de período mais curto. Quando o preço atravessa o canal de período mais longo, ele sinaliza o início de uma tendência. Quando o preço atravessa o canal de período mais curto, ele sinaliza o fim da tendência.

Especificamente, o comprimento do canal de período mais longo é de 50 dias ou 20 dias, e o comprimento do canal de período mais curto é de 50 dias, 20 dias ou 10 dias. Se o preço for igual ao preço mais alto em 50 dias, uma posição longa é aberta. Se o preço for igual ao preço mais baixo em 50 dias, uma posição curta é aberta. Se o preço for igual ao preço mais baixo em 20 ou 10 dias, as posições longas são fechadas. Se o preço for igual ao preço mais alto em 20 ou 10 dias, as posições curtas são fechadas.

Ao combinar dois canais de Donchian de períodos diferentes, ele pode determinar a direção para estabelecer posições quando uma tendência começa, e realizar stop loss oportuno quando a tendência termina.

Análise das vantagens

As principais vantagens desta estratégia são:

  1. Forte capacidade de captura de tendências. Pode rastrear as tendências de forma eficaz, identificando o início e o fim das tendências usando breakouts do Canal de Donchian.

  2. Controlo de risco adequado. Ele usa um stop loss móvel para controlar a perda de uma única negociação.

  3. Ajuste flexível dos parâmetros: a combinação de períodos de canal pode ser escolhida livremente para se adaptar a diferentes produtos e ambientes de mercado.

  4. Uma lógica de negociação simples e clara, fácil de compreender e implementar.

Análise de riscos

Os riscos desta estratégia incluem:

  1. Incapacidade de se adaptar a mercados de gama limitada, sofrerá pequenas perdas consecutivas quando a tendência não for clara.

  2. Risco de falha de ruptura. Os preços podem recuar após a ruptura do canal, causando stop loss.

  3. Risco de selecção de períodos: configurações inadequadas de períodos de canais podem conduzir à troca de ruído.

  4. Risco de diminuição do rácio Sharpe: o aumento do tamanho da posição sem ajustamento do stop loss pode levar a uma diminuição do rácio Sharpe.

As soluções são:

  1. Otimizar os parâmetros para selecionar combinações adequadas de períodos de canal.
  2. Ajustar adequadamente o tamanho da posição e o stop loss para controlar o risco.
  3. Utilize esta estratégia para produtos e mercados com tendências óbvias.

Orientações de otimização

As orientações de otimização para esta estratégia:

  1. Adicionar condições de filtragem para evitar fugas, por exemplo, combinar o volume para avaliar as verdadeiras rupturas.

  2. Otimizar a combinação de períodos de canal e o dimensionamento de posições para aumentar a taxa de lucro.

  3. A tentar a otimização do ponto de interrupção para encontrar conjuntos de parâmetros ideais.

  4. Aumentar os algoritmos de aprendizagem de máquina para otimização dinâmica e ajuste de parâmetros.

Conclusão

A estratégia de seguimento de tendências de Donchian identifica o início e o fim das tendências de preços usando canais duplos e adota o estilo de negociação de tendência com controle eficaz de perda de uma única negociação. Esta estratégia tem ajuste flexível de parâmetros e implementação fácil, tornando-se uma estratégia de seguimento de tendências muito prática.


/*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
// =============================================================================

Mais.