Promedio móvil de superposición de retraso cero con estrategia de negociación de salida Chandelier

El autor:¿ Qué pasa?, Fecha: 2024-01-22 10:03:05
Las etiquetas:

img

Resumen general

La idea principal de esta estrategia es combinar el indicador ZLSMA (Zero Lag Overlapping Moving Average) para juzgar la dirección de la tendencia, y el indicador EC (Chandelier Exit) para encontrar puntos de entrada y salida más precisos.

Principio de la estrategia

  1. Parte del ZLSMA:

    • Se utilizará el método de regresión lineal para calcular las líneas LMA de 130 períodos respectivamente.
    • Luego superponer las dos líneas LMA para obtener el valor de diferencia asignado a eq.
    • Por último, construye la media móvil ZLSMA de superposición de Lag Cero a través de la línea LMA original más la diferencia eq.
  2. Parte CE:

    • Calcular el indicador ATR y multiplicarlo por un factor (por defecto 2) para determinar la distancia dinámica desde el punto más alto o más bajo más reciente.
    • Cuando el precio de cierre exceda la línea de stop loss larga o corta más reciente, ajustar la línea de stop loss en consecuencia.
    • Determinar la dirección larga o corta en función del cambio en el precio de cierre en relación con la línea de stop loss.
  3. Señales de entrada:

    • ZLSMA juzga la dirección de la tendencia, entra cuando CE emite la señal.
  4. Pérdida de salida:

    • Stop loss fijo y tomar ganancias para posiciones largas.
    • En el caso de una posición corta, utilizar la salida dinámica de la CE para sustituir el stop loss fijo.

Análisis de ventajas

  1. ZLSMA puede identificar la tendencia antes para evitar una falla.
  2. La CE puede ajustar de forma flexible los puntos de salida en función de la volatilidad del mercado.
  3. La relación riesgo-beneficio de la estrategia es personalizable.
  4. Diferentes métodos de stop loss y take profit utilizados para posiciones largas y cortas para controlar el riesgo.

Análisis de riesgos

  1. La configuración incorrecta de los parámetros puede aumentar la tasa de pérdida o ampliar el rango de pérdida de parada.
  2. El riesgo de que el stop loss se rompa en caso de una rápida inversión del mercado sigue existiendo.

Direcciones de optimización

  1. Los parámetros pueden optimizarse para diferentes mercados y plazos.
  2. Considerar el ajuste de los parámetros de ganancia/detención en función de la volatilidad o de ciclos específicos.
  3. Intenta combinarlo con otros indicadores o modelos para mejorar la tasa de ganancia.

Resumen de las actividades

La estrategia utiliza principalmente el promedio móvil de superposición de retraso cero para determinar la dirección de la tendencia, combinado con el indicador de salida de candelabro para encontrar puntos de entrada y salida más precisos. Las ventajas se encuentran en la relación stop / profit personalizable y el ajuste dinámico de salida de candelabro puede controlar los riesgos de acuerdo con las condiciones del mercado.


/*backtest
start: 2024-01-14 00:00:00
end: 2024-01-21 00:00:00
period: 3m
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/
// © GGkurg

//@version=5

strategy(title = "ZLSMA + Chandelier Exit", shorttitle="ZLSMA + CE", overlay=true)


var GRP1 = "take profit / stop loss"
TP = input(title='long TP%', defval=2.0,   inline = "1", group = GRP1) 
SL = input(title='long SL%', defval=2.0,    inline = "1", group = GRP1) 
TP2 = input(title='short TP', defval=2.0,    inline = "2", group = GRP1) 
SL2 = input(title='short SL', defval=2.0,    inline = "2", group = GRP1) 
//-------------------------------------------------calculations
takeProfitPrice = strategy.position_avg_price * (1+(TP/100))
stopLossPrice = strategy.position_avg_price * (1-(SL/100))
takeProfitPrice2 = strategy.position_avg_price * (1-(TP2/100))
stopLossPrice2 = strategy.position_avg_price * (1+(SL2/100))


//---------------------------------------ZLSMA - Zero Lag LSMA
var GRP2 = "ZLSMA settings"
length1 = input(title='Length', defval=130, inline = "1", group = GRP2) 
offset1 = input(title='Offset', defval=0, inline = "2", group = GRP2) 
src = input(close, title='Source', inline = "3", group = GRP2) 
lsma = ta.linreg(src, length1, offset1)
lsma2 = ta.linreg(lsma, length1, offset1)
eq = lsma - lsma2
zlsma = lsma + eq

plot(zlsma, color=color.new(color.yellow, 0), linewidth=3)


//---------------------------------------ZLSMA conditisions 
//---------long
longc1 = close > zlsma
longclose1 = close < zlsma
//---------short
shortc1 = close < zlsma
shortclose1 = close > zlsma


//---------------------------------------Chandelier Exit
var string calcGroup = 'Chandelier exit settings'
length = input.int(title='ATR Period', defval=1, group=calcGroup)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2.0, group=calcGroup)
useClose = input.bool(title='Use Close Price for Extremums', defval=true, group=calcGroup)

var string visualGroup = 'Visuals'
showLabels = input.bool(title='Show Buy/Sell Labels', defval=true, group=visualGroup)
highlightState = input.bool(title='Highlight State', defval=true, group=visualGroup)

var string alertGroup = 'Alerts'
awaitBarConfirmation = input.bool(title="Await Bar Confirmation", defval=true, group=alertGroup)

atr = mult * ta.atr(length)

longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.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
var color longFillColor = color.new(color.green, 90)
var color shortFillColor = color.new(color.red, 90)
var color textColor = color.new(color.white, 0)

longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.new(longColor, 0))
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=color.new(longColor, 0))
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(longColor, 0), textcolor=textColor)

shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.new(shortColor, 0))
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=color.new(shortColor, 0))
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(shortColor, 0), textcolor=textColor)

midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longStateFillColor = highlightState ? dir == 1 ? longFillColor : na : na
shortStateFillColor = highlightState ? dir == -1 ? shortFillColor : na : na
fill(midPricePlot, longStopPlot, title='Long State Filling', color=longStateFillColor)
fill(midPricePlot, shortStopPlot, title='Short State Filling', color=shortStateFillColor)

await = awaitBarConfirmation ? barstate.isconfirmed : true
alertcondition(dir != dir[1] and await, title='Alert: CE Direction Change', message='Chandelier Exit has changed direction!')
alertcondition(buySignal and await, title='Alert: CE Buy', message='Chandelier Exit Buy!')
alertcondition(sellSignal and await, title='Alert: CE Sell', message='Chandelier Exit Sell!')




//---------------------------------------Chandelier Exit conditisions 
//---------long
longc2 = buySignal
longclose2 = sellSignal
//---------short
shortc2 = sellSignal
shortclose2 = buySignal



//---------------------------------------Long entry and exit
if longc1 and longc2 
    strategy.entry("long", strategy.long)

if strategy.position_avg_price > 0
    strategy.exit("close long", "long", limit = takeProfitPrice, stop = stopLossPrice, alert_message = "close all orders")

if longclose1 and longclose2 and strategy.opentrades == 1
    strategy.close("long","ema long cross", alert_message = "close all orders")


//---------------------------------------Short entry and exit
if shortc1 and shortc2 
    strategy.entry("short", strategy.short)

if strategy.position_avg_price > 0
    strategy.exit("close short", "short", limit = takeProfitPrice2, stop = stopLossPrice2, alert_message = "close all orders")

if shortclose1 and shortclose2 and strategy.opentrades == 1
    strategy.close("close short","short", alert_message = "close all orders")




Más.