Estratégia de negociação de ETF com base em ATR e breakouts


Data de criação: 2023-12-26 16:05:55 última modificação: 2023-12-26 16:05:55
cópia: 2 Cliques: 822
1
focar em
1623
Seguidores

Estratégia de negociação de ETF com base em ATR e breakouts

Visão geral

A estratégia é uma estratégia de negociação automática de ETFs baseada na amplitude real média (ATR) e na ruptura do preço. Ela usa o ATR para calcular o ponto de parada e o ponto de parada e abrir ou fechar uma posição quando o preço quebra o máximo ou o mínimo de um determinado período.

Princípio da estratégia

A estratégia baseia-se principalmente nos seguintes princípios:

  1. Use o máximo e o mínimo de um determinado período (por exemplo, 20 linhas K) para determinar a tendência e a direção do preço. Quando o preço quebra o máximo do ciclo, faça mais; Quando o preço quebra o mínimo do ciclo, faça um vazio.

  2. Use o ATR para calcular dinamicamente o Stop Loss. A distância entre o Stop Loss e o preço de entrada é o valor do ATR de um ciclo de ATR multiplicado pelo fator ((como 2)).

  3. Use o ATR para calcular o stop. A distância entre o stop e o preço de entrada é o valor do ATR de um ciclo ATR multiplicado pelo fator ((como 1) ).

  4. O uso do multifator ATRtrailer para rastrear o stop. Quando o preço se move para o lado negativo, o stop é o ponto de parada do trailer.

A estratégia é simples e confiável, considerando a direção da tendência dos preços, o que é útil para capturar a tendência dos preços em tempo hábil; e também estabelece um stop loss e um stop position, o que é útil para aproveitar as oportunidades de lucro e controlar os riscos.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. A estratégia é simples, clara, fácil de entender e de implementar.

  2. O ATR é usado para calcular o Stop Loss, que permite o ajuste dinâmico do tamanho da posição e o controle flexível do risco.

  3. A estratégia de julgamento de quebra de ciclo é mais fácil de capturar a tendência de preços, com melhores ganhos.

  4. O Trailer Stop pode ser parado a tempo para evitar riscos excessivos.

  5. Aplica-se a variedades de tendências mais evidentes, como ETFs, ações, etc.

Análise de Riscos

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

  1. Quando os preços estão flutuando, pode haver mais sinais errados e reversão de posições.

  2. A configuração inadequada dos parâmetros do ciclo pode perder a tendência dos preços ou surpreender com um número excessivo de transações.

  3. A configuração inadequada dos parâmetros dos coeficientes pode levar à perda ou à parada excessivamente radical ou conservadora, afetando a lucratividade.

  4. Os próprios riscos dos ETFs, como o risco de política, o risco de prémio e outros, também influenciam a estratégia.

Resolução:

  1. Optimizar os parâmetros e reduzir a taxa de transação virtual.
  2. Combinação de vários fatores e filtros para determinar os sinais de transação.
  3. Parâmetros de ajuste para diferentes mercados.
  4. Investimento distribuído, controle de posições de um único ETF.

Direção de otimização

A estratégia pode ser melhorada em alguns aspectos:

  1. Os indicadores, como a média móvel, são usados para filtrar os sinais falsos.

  2. Adição de módulo de otimização de parâmetros de adaptabilidade, para otimização automática de parâmetros de acordo com diferentes ciclos e variedades.

  3. Adição de modelos de aprendizado de máquina para prever os pontos altos e baixos da próxima linha K para determinar o sinal de ruptura.

  4. Os indicadores de volume de transação devem ser considerados para evitar falsas rupturas.

  5. Optimizar o tamanho e a proporção das posições de abertura, adaptando-se às diferentes variedades e ao ambiente de mercado.

Resumir

A estratégia é clara e concisa, o mecanismo central de ruptura e o stop loss dinâmico do ATR podem efetivamente controlar o risco e bloquear o lucro. A otimização de parâmetros e a combinação de mais indicadores de filtragem podem aumentar ainda mais a capacidade de controle do fator de lucro e do risco da estratégia, uma estratégia quantitativa que vale a pena começar e otimizar continuamente.

Código-fonte da estratégia
/*backtest
start: 2023-12-18 00:00:00
end: 2023-12-21 03:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FX_minds

//@version=4
strategy("ETF tradedr", overlay=true, pyramiding=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//------------------------------ get user input
lookback                   = input(title="HH LL lookback", type=input.integer, defval=20)
ATR_periode                = input(title="ATR period", type=input.integer, defval=14)
ATR_SL_multiplier          = input(title="ATR SL multiplier", type=input.float, defval=2)
ATR_TP_multiplier          = input(title="ATR TP multiplier", type=input.float, defval=1)
trailing_SL_ATR_multiplier = input(title="ATR trailing SL multiplier", type=input.float, defval=3.5)
lookback_trailing_SL       = input(title="trailing SL lookback", type=input.integer, defval=4)
max_sequel_trades          = input(title="max sequel trades", type=input.float, defval=1)
trade_long                 = input(title= "trade long ?", type=input.bool, defval=true)
trade_short                = input(title= "trade short ?", type=input.bool, defval=false)

//------------------------------ determine entry conditions
long_condition   = barstate.isconfirmed and crossover(high, highest(high, lookback)[1])
short_condition  = barstate.isconfirmed and crossunder(low, lowest(low, lookback)[1])


//------------------------------ count open long trades
count_open_longs = 0
count_open_longs := nz(count_open_longs[1])

if (long_condition) 
    count_open_longs := count_open_longs +1
    //label.new(bar_index, low, tostring(count_open_longs, "#"), xloc.bar_index, yloc.belowbar, color.green, label.style_none, color.green, size.large)

if (short_condition)
    count_open_longs := 0


//------------------------------ count open short trades
count_open_shorts = 0
count_open_shorts := nz(count_open_shorts[1])

if (short_condition)
    count_open_shorts := count_open_shorts +1
    //label.new(bar_index, low, tostring(count_open_shorts, "#"), xloc.bar_index, yloc.belowbar, color.red, label.style_none, color.red, size.large)

if (long_condition)
    count_open_shorts := 0


//------------------------------ calculate entryprice
entryprice_long = long_condition ? close : na
entryprice_short = short_condition ? close : na


//------------------------------ calculate SL & TP
SL_distance = atr(ATR_periode) * ATR_SL_multiplier
TP_distance  = atr(ATR_periode) * ATR_TP_multiplier
trailing_SL_distance = atr(ATR_periode) * trailing_SL_ATR_multiplier

SL_long = entryprice_long - SL_distance
SL_short = entryprice_short + SL_distance

trailing_SL_short = lowest(close, lookback_trailing_SL) + trailing_SL_distance
trailing_SL_long  = highest(close, lookback_trailing_SL) - trailing_SL_distance

trailing_SL_short_signal = crossover(high, trailing_SL_short[1])
trailing_SL_long_signal = crossunder(low, trailing_SL_long[1])


//------------------------------ plot entry price & SL  
plot(entryprice_long, style=plot.style_linebr, color=color.white)
plot(SL_long, style=plot.style_linebr, color=color.red)
plot(SL_short, style=plot.style_linebr, color=color.green)
plot(trailing_SL_short, style=plot.style_linebr, color=color.red)
plot(trailing_SL_long, style=plot.style_linebr, color=color.green)


//------------------------------ submit entry orders
if (long_condition) and (count_open_longs <= max_sequel_trades) and (trade_long == true)
    strategy.entry("Long" + tostring(count_open_longs, "#"), strategy.long)
    strategy.exit("SL Long"+ tostring(count_open_longs, "#"), 
     from_entry="Long" + tostring(count_open_longs, "#"), stop=SL_long)

if (short_condition) and (count_open_shorts <= max_sequel_trades) and (trade_short == true)
    strategy.entry("Short" + tostring(count_open_shorts, "#"), strategy.short)
    strategy.exit("SL Short" + tostring(count_open_shorts, "#"), 
     from_entry="Short" + tostring(count_open_shorts, "#"), stop=SL_short)
    

//------------------------------ submit exit conditions
if (trailing_SL_long_signal)
    strategy.close("Long" + tostring(count_open_longs, "#"))
    strategy.close("Long" + tostring(count_open_longs-1, "#"))
    strategy.close("Long" + tostring(count_open_longs-2, "#"))
    strategy.close("Long" + tostring(count_open_longs-4, "#"))
    strategy.close("Long" + tostring(count_open_longs-5, "#"))
    strategy.close("Long" + tostring(count_open_longs-6, "#"))
    strategy.close("Long" + tostring(count_open_longs-7, "#"))
    strategy.close("Long" + tostring(count_open_longs-8, "#"))
    strategy.close("Long" + tostring(count_open_longs-9, "#"))
    
if (trailing_SL_short_signal)
    strategy.close("Short" + tostring(count_open_shorts, "#"))
    strategy.close("Short" + tostring(count_open_shorts-1, "#"))
    strategy.close("Short" + tostring(count_open_shorts-2, "#"))
    strategy.close("Short" + tostring(count_open_shorts-3, "#"))
    strategy.close("Short" + tostring(count_open_shorts-4, "#"))
    strategy.close("Short" + tostring(count_open_shorts-5, "#"))
    strategy.close("Short" + tostring(count_open_shorts-6, "#"))
    strategy.close("Short" + tostring(count_open_shorts-7, "#"))
    strategy.close("Short" + tostring(count_open_shorts-8, "#"))
    strategy.close("Short" + tostring(count_open_shorts-9, "#"))