
La idea principal de esta estrategia es calcular los puntos de parada para las líneas largas y cortas basándose en el indicador ATR, generando una señal de negociación cuando el precio rompe estas líneas de parada. Tiene funciones de seguimiento de tendencias y captura de shocks a la vez.
La estrategia utiliza el índice ATR de N períodos ATR multiplicado por un factor para calcular la línea de parada de largo y largo a ambos lados. La fórmula de cálculo es la siguiente:
长线止损 = 最高价 - ATR * 系数
短线止损 = 最低价 + ATR * 系数
Cuando el precio sube, haga más para romper la línea de parada larga, y cuando el precio baje, haga más para romper la línea de parada corta. Después de hacer más, siga en tiempo real la fluctuación del precio para mover la línea de parada.
Este método, que utiliza la banda ATR como punto de parada, puede capturar adecuadamente la tendencia de los precios, siempre que se garantice el riesgo de parada. Cuando se produce una señal de ruptura significativa en los precios, se puede eliminar eficazmente la falsa ruptura.
La mayor ventaja de esta estrategia es que se puede ajustar automáticamente el stop loss, capturar la tendencia de los precios y controlar el riesgo. Las ventajas específicas son las siguientes:
La configuración de stop-loss flotante basada en el indicador ATR permite ajustar el stop-loss en función de la volatilidad del mercado y controlar eficazmente las pérdidas individuales.
La señal se genera de manera penetrante, eliminando parte del ruido y evitando el repunte y el repunte.
Ajuste de la línea de parada en tiempo real para seguir la fluctuación de los precios, evitar que la parada se relaje demasiado y bloquear más ganancias.
La estrategia también tiene algunos riesgos, que se centran principalmente en la configuración de los puntos de parada y la forma en que se generan las señales. Los puntos de riesgo específicos son los siguientes:
El ciclo y el coeficiente incorrectos de ATR pueden causar pérdidas demasiado amplias o demasiado estrechas.
La brecha de señales puede perder la oportunidad de una tendencia temprana.
El seguimiento de pérdidas al final de la tendencia puede estar retrasado y no se puede salir perfectamente.
La respuesta consiste principalmente en ajustar los parámetros para que el stop loss sea más razonable, o ayudar a otros indicadores a juzgar las tendencias y señales.
La estrategia puede seguir optimizándose en los siguientes aspectos:
Establecer un segundo nivel de pérdidas para controlar aún más el riesgo.
En combinación con otros indicadores para juzgar tendencias, mejorar la calidad de la señal.
Añadir una estrategia de parada móvil para aumentar los beneficios si la tendencia continúa.
Optimización de los parámetros ATR y de los ciclos y coeficientes para que el stop loss esté más cerca de las fluctuaciones reales de los precios.
Esta estrategia es muy práctica en su conjunto, ya que permite ajustar automáticamente los puntos de parada para controlar eficazmente el riesgo, mientras que se obtiene una buena ganancia mediante el seguimiento de tendencias. Podemos optimizar y mejorar la estrategia aún más junto con otros métodos de análisis sobre la base original, para que sea más estable e inteligente.
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
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/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)
atr = mult * atr(length)
longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir
var color longColor = color.green
var color shortColor = color.red
longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)
shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)
midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)
longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)
long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")
start = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")
window() => true
slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")
lastBuyPrice = strategy.position_avg_price
diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0
s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0
strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")
if long_short
strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
strategy.close("SHORT", when = window() and buySignal)
strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")