
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.
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.
A estratégia tem as seguintes vantagens:
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.
Controle de risco em ação. Uso de stop loss móvel para controlar perdas individuais.
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.
Uma lógica de transação simples e clara. Fácil de entender e de implementar.
A estratégia também apresenta os seguintes riscos:
Quando a tendência não é visível, haverá vários ajustes de pequena magnitude, levando a perdas de parada.
Risco de fracasso de ruptura. O preço pode voltar a ser chamado após a ruptura do canal, causando um stop loss.
Risco de escolha do ciclo. Se o ciclo de passagem for configurado incorretamente, isso levará ao trading in noise.
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:
A estratégia pode ser otimizada em várias direções:
Aumentar as condições de filtragem e evitar o whipsaws. Indicadores de potência de ligação, por exemplo, para determinar a verdadeira ruptura.
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.
Tente otimizar o ponto de ruptura para encontrar a melhor combinação de parâmetros.
Adicionar algoritmos de aprendizagem de máquina para otimizar e ajustar dinamicamente os parâmetros.
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.
/*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
// =============================================================================