Estrategia de negociación de salida con media móvil superpuesta de retardo cero combinada con línea voladiza


Fecha de creación: 2024-01-22 10:03:05 Última modificación: 2024-01-22 10:03:05
Copiar: 0 Número de Visitas: 1897
1
Seguir
1617
Seguidores

Estrategia de negociación de salida con media móvil superpuesta de retardo cero combinada con línea voladiza

Descripción general

La idea principal de esta estrategia es combinar el indicador de la superposición de la media móvil de cero retrasos (ZLSMA) para determinar la dirección de la tendencia, y el indicador de la salida de la línea de la suspensión (CE) para buscar entradas y salidas más precisas. ZLSMA es un indicador de tendencia, que puede determinar los cambios en la tendencia antes.

Principio de estrategia

  1. La sección ZLSMA:

    • Las líneas LMA de longitud de 130 ciclos se calculan por separado utilizando el método de regresión lineal.
    • Luego se superponen las dos líneas LMA para obtener el diferencial asignado a eq.
    • Finalmente, se añade el diferencial eq a través de la línea LMA original para formar una media móvil superpuesta a cero ZLSMA .
  2. Sección CE:

    • Calcula el indicador ATR y multiplica por el coeficiente ((default2)) para determinar la distancia dinámica desde el punto más alto o más bajo más cercano.
    • Cuando el precio de cierre excede la línea de parada más cercana o la línea de parada en blanco, ajuste la línea de parada en consecuencia.
    • Hacer más acciones en la dirección de la posición de los precios de cierre con respecto a la línea de parada.
  3. Tiempo de ingreso:

    • ZLSMA determina la dirección de la tendencia y la CE entra cuando da la señal.
  4. La salida de pérdidas:

    • Los cables largos tienen paradas y paradas fijas.
    • El cortocircuito sustituye la salida dinámica de la CE por la parada fija.

Análisis de las ventajas

  1. ZLSMA puede detectar las tendencias con anticipación y evitar falsas rupturas.
  2. La CE puede ajustar el punto de salida con flexibilidad según la volatilidad del mercado.
  3. El riesgo-beneficio de la estrategia se puede personalizar.
  4. La línea larga y corta utilizan un método diferente de detención de pérdidas para controlar el riesgo.

Análisis de riesgos

  1. La configuración incorrecta de los parámetros puede aumentar la tasa de entrada o ampliar el rango de parada.
  2. Si las cosas cambian rápidamente, existe el riesgo de que se rompa el tope.

Dirección de optimización

  1. Se puede probar la optimización de parámetros para diferentes mercados y períodos de tiempo.
  2. Se puede considerar ajustar los parámetros de stop loss en función de la tasa de fluctuación o de un ciclo específico.
  3. Se puede intentar combinar con otros indicadores o modelos para mejorar la rentabilidad.

Resumir

La estrategia utiliza una superposición de medias móviles con cero retrasos para determinar la dirección de la tendencia, en combinación con un indicador de salida de la línea de la suspensión para buscar un momento de salida de entrada más preciso. La ventaja de la estrategia reside en la posibilidad de personalizar el porcentaje de stop loss, y el ajuste dinámico de la salida de la línea de la suspensión para controlar el riesgo según las condiciones del mercado.

Código Fuente de la Estrategia
/*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")