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

Autora:ChaoZhang, Data: 2023-10-10 10:50:21
Tags:

Resumo

Esta estratégia usa o indicador ATR para definir pontos de stop loss dinâmicos e ajustar posições de stop loss com base em flutuações de preços, a fim de controlar riscos. Principalmente, entra em longo quando 5EMA cruza acima de 20EMA, e depois usa o indicador ATR para definir posições de stop loss e take profit. A posição de stop loss será ajustada de acordo com os movimentos de preços para bloquear mais lucros.

Estratégia lógica

A estratégia julga primeiro se o 5EMA cruza acima do 20EMA para ir longo. Depois de entrar, calcula os múltiplos ATR do preço de entrada para o preço atual usando o indicador ATR e define a posição de stop loss em 1.5ATR abaixo do preço de entrada. À medida que o preço sobe, a posição de stop loss é gradualmente elevada para aumentar os lucros da posição.

Em especial, a estratégia define as seguintes variáveis:

  • preço de entrada: preço de entrada
  • Stop_price: preço de stop loss
  • Take_profit_price: preço do take profit
  • atr_down: linha descendente do ATR
  • atr_up: ATR linha de cima
  • atr_current: linha ATR atual
  • atr_ref: Valor ATR

Após a entrada, ele calcula atr_ref como o valor atual do ATR e atr_div como os múltiplos do ATR do preço de entrada para o preço atual. Em seguida, define as posições de atr_down, atr_current e atr_up com base no atr_div. O preço de stop loss stop_price é definido em 1,5ATR abaixo do preço de entrada.

À medida que o preço sobe, comparando o preço atual avg e atr_up, se o avg cruzar acima de atr_up, recalcula as posições da linha atr_div e ATR, aumentando gradualmente a linha de stop loss para aumentar os lucros.

Se o preço subir acima de 3ATR do preço de entrada, ele irá fechar parcialmente a posição para bloquear os lucros, e definir tookProfit para verdadeiro.

Vantagens

  1. O uso do indicador ATR para ajustar dinamicamente a perda de parada pode definir uma distância de parada razoável com base na volatilidade do mercado.

  2. Segue as tendências, limitando as perdas.

  3. O mecanismo de lucro parcial bloqueia algum lucro e reduz o risco.

Riscos

  1. O indicador ATR não é sensível a fortes inversões e lacunas.

  2. As EMAs não podem determinar a inversão da tendência, podendo entrar em novas posições nas inversões da tendência.

  3. Alta probabilidade de perdas após lucro parcial.

  4. Os parâmetros necessitam de uma maior otimização, sendo necessário ajustar o 1,5ATR para parar e o 3ATR para tirar lucro para diferentes produtos.

Melhorias

  1. Considere a adição de outros indicadores de stop loss como o canal Donchian para compensar o atraso do ATR.

  2. Teste diferentes médias móveis ou adicione o MACD etc. para julgar a inversão da tendência.

  3. Otimizar os rácios de lucro parcial e a frequência para diferentes produtos.

  4. Optimização de parâmetros nos múltiplos de ATR para parar e tirar lucro.

  5. O desempenho do teste durante tendências fracas pode desativar a estratégia durante tendências fracas.

Resumo

A estratégia tem uma lógica clara de usar o ATR para gerenciamento dinâmico de stop loss, que é sua maior força. No entanto, o próprio ATR tem limitações como atraso. Adicionar outros indicadores de stop e tendência irá melhorá-lo.


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

Mais.