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.
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:
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.
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.
Segue as tendências, limitando as perdas.
O mecanismo de lucro parcial bloqueia algum lucro e reduz o risco.
O indicador ATR não é sensível a fortes inversões e lacunas.
As EMAs não podem determinar a inversão da tendência, podendo entrar em novas posições nas inversões da tendência.
Alta probabilidade de perdas após lucro parcial.
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.
Considere a adição de outros indicadores de stop loss como o canal Donchian para compensar o atraso do ATR.
Teste diferentes médias móveis ou adicione o MACD etc. para julgar a inversão da tendência.
Otimizar os rácios de lucro parcial e a frequência para diferentes produtos.
Optimização de parâmetros nos múltiplos de ATR para parar e tirar lucro.
O desempenho do teste durante tendências fracas pode desativar a estratégia durante tendências fracas.
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))