Estratégia de stop loss dinâmica baseada em ATR


Data de criação: 2023-10-10 10:50:21 última modificação: 2023-10-10 10:50:21
cópia: 4 Cliques: 936
1
focar em
1617
Seguidores

Visão geral

A estratégia usa o indicador ATR para definir o ponto de parada dinâmico, ajustando a posição de parada de acordo com a amplitude da flutuação dos preços, para realizar o controle de risco. A estratégia faz várias entradas principalmente através da formação de um garfo de ouro nos dias 5 e 20 da EMA, e depois usa o indicador ATR para definir a posição de parada e a posição de parada. A posição de parada é ajustada de acordo com a flutuação dos preços, para bloquear mais lucros.

Princípio da estratégia

A estratégia primeiro julga fazer uma entrada extra quando a EMA de 5 dias atravessa a EMA de 20 dias. Após a entrada, use o indicador ATR para calcular o múltiplo de ATR do preço de entrada do preço atual, definindo a posição de parada como 1,5 ATR abaixo do preço de entrada.

A estratégia define as seguintes variáveis:

  • entry_price: preço de entrada
  • stop_price: preço de parada
  • take_profit_price: preço de parada
  • atr_down: linha ATR abaixo
  • atr_up: linha ATR superior
  • atr_current: linha ATR atual
  • atr_ref: Valor do ATR

Depois de entrar, at_ref é calculado como o valor do ATR atual, at_div é o múltiplo do ATR entre o preço de entrada e o preço atual. Depois, at_div é definido como sendo o at_down, at_current e at_up. O preço de parada é o preço de parada abaixo de 1,5 ATR.

À medida que o preço sobe, se o atr_up for usado em cima da avg, o atr_div e a posição correspondente de atr_up serão recalculados, aumentando o lucro da posição.

Se o preço exceder o preço de entrada 3ATR, será parcialmente liquidado para bloquear o lucro, neste momento, o símbolo de takeProfit é definido como verdadeiro. Se o preço continuar a subir, a posição de parada será aumentada. Se a parada for acionada, o takeProfit será julgado. Se a parada tiver sido parcialmente bloqueada, a posição restante será liquidada, caso contrário, a posição será liquidada.

Vantagens estratégicas

  1. Usando o indicador ATR para ajustar dinamicamente a posição de parada, pode-se definir uma distância de parada razoável de acordo com a volatilidade do mercado.

  2. Em casos de perdas limitadas, corte de lucro seguindo a tendência. A linha de parada será gradualmente aumentada, deixando os lucros se acumularem.

  3. O mecanismo de parada parcial pode bloquear parte dos lucros, reduzindo o risco. Depois, a posição de parada continua a subir, permitindo que os lucros continuem a funcionar.

Risco estratégico

  1. O indicador ATR não é sensível a rupturas anormais e não pode lidar com os riscos gerados por gaps.

  2. A EMA não pode determinar se a tendência está se revertendo, podendo entrar em novas posições quando a tendência se reverte.

  3. A probabilidade de reverter os prejuízos após uma paralisação parcial é maior.

  4. Parâmetros de otimização insuficientes, 1.5 ATR Stop Loss e 3 ATR Stop Loss precisam ser ajustados para diferentes variedades.

Otimização de Estratégia

  1. Pode-se considerar a inclusão de outros indicadores de stop loss, como o canal Donchian, para evitar o atraso do indicador ATR.

  2. Pode-se testar diferentes indicadores de mediana ou adicionar MACD para determinar a reversão da tendência.

  3. Pode-se otimizar a proporção e a frequência de bloqueios parciais, que podem ter configurações diferentes para diferentes variedades.

  4. Adição de parâmetros de otimização para testar o efeito de parada de perda de diferentes ATRs. Adição da função de parada de perda de passo.

  5. Testar o desempenho durante uma tendência mais fraca, e considerar ativar a estratégia somente quando a tendência é mais forte.

Resumir

A ideia geral da estratégia é clara e fácil de entender, e o uso do ATR para ajustar dinamicamente o stop loss para controlar o risco de negociação é sua maior vantagem. Mas o ATR em si é atrasado e a configuração dos parâmetros precisa ser otimizada.

Código-fonte da estratégia
/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
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/
// © ekinbasarkomur

//@version=5
strategy("[EKIN] ATR Exit Strategy", overlay=true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = true)

// Simple EMA tracking
fastEMA = ta.ema(close, 5)
slowEMA = ta.ema (close, 20)
atr = ta.atr(14)

// We define entry price for future reference
var float entry_price = na
// We define stop and take profit for future calculations
var float stop_price = na
var float take_profit_price = na

// We define atr limtim its here
var float atr_down = na
var float atr_up = na
var float atr_current = na
var float atr_ref = na

avg = (low + high) / 2

// Conditions
enterCondition = ta.crossover(fastEMA, slowEMA)
var bool tookProfit = false
timePeriod = time >= timestamp(syminfo.timezone, 2021, 12, 15, 0, 0)
InTrade = strategy.position_size > 0

// Go long if conditions are met
if (enterCondition and timePeriod and not InTrade)
    // Calculate and update variables
    entry_price := avg
    atr_ref := atr
    atr_div = int((avg - entry_price) / atr_ref)
    atr_down := entry_price + (atr_ref * (atr_div - 1.5))
    atr_up := entry_price + (atr_ref * (atr_div + 1))
    atr_current := entry_price + (atr_ref * atr_div) 
    stop_price := (entry_price - (atr_ref * 1.5))
    take_profit_price := (entry_price + (atr_ref * 3))
    strategy.order("buy", strategy.long, qty = 2)

// Enter here if in position
if InTrade or tookProfit
    stopCondition = avg < stop_price
    takeProfitCondition = avg > take_profit_price

    if avg < atr_down
        stopCondition := true

    // Move stop price and exit price if price for each atr price increase
    if avg > atr_up
        if tookProfit
            atr_ref := atr
        atr_div = int((avg - entry_price) / atr_ref)
        atr_down := entry_price + (atr_ref * (atr_div - 1))
        atr_up := entry_price + (atr_ref * (atr_div + 1))
        atr_current := entry_price + (atr_ref * atr_div) 

    // Take half of the investment if current price is 3 atr higher than entry price
    if (takeProfitCondition and timePeriod and InTrade and not tookProfit)
        strategy.order("take_half_profit", strategy.short, qty = 1)
        tookProfit := true

    // Exit position if conditions are met and reset the variables
    if (stopCondition and timePeriod and InTrade)
        if tookProfit
            strategy.order("exit", strategy.short, qty = 1)
        else
            strategy.order("stop_loss", strategy.short, qty = 2)

        tookProfit := false

// Plot EMA's
plot(fastEMA, color = color.blue)
plot(slowEMA, color = color.yellow)

// Plot ATR Limit/Stop positions
profit_plot = plot(series = InTrade?atr_up:na, title = "profit", color = color.green, style=plot.style_linebr)
close_plot = plot(series = InTrade?atr_current:na, title = "close", color = color.white, style=plot.style_linebr)
stop_plot = plot(series = InTrade?atr_down:na, title = "stop_loss", color = color.red, style=plot.style_linebr)
fill(profit_plot, close_plot, color = color.new(color.green, 80))
fill(close_plot, stop_plot, color =color.new(color.red,80))