Estrategia de seguimiento de tendencia con media móvil exponencial única y trailing stop


Fecha de creación: 2024-01-08 11:37:44 Última modificación: 2024-01-08 11:37:44
Copiar: 1 Número de Visitas: 649
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencia con media móvil exponencial única y trailing stop

Descripción general

Esta estrategia se combina con el uso de un solo índice de las medias móviles lisas (SESMA) y el acompañamiento de la suspensión de pérdidas en torno a la escalera de la escalera de Donchis, formando una estrategia de seguimiento de tendencias muy estable y eficiente. SESMA como la línea principal para identificar la dirección de la tendencia de los precios.

Principio de estrategia

La estrategia se compone de dos indicadores centrales:

  1. SESMA: SESMA se inspira en el pensamiento de la EMA, al mismo tiempo que mejora los parámetros, lo que hace que la curva sea más suave y la latencia sea menor. La dirección y la relación de precios de SESMA para juzgar la tendencia de los precios.

  2. Mecanismo de seguimiento de la pérdida: en combinación con los precios más altos, más bajos y el indicador ATR, se calcula en tiempo real la línea de pérdida de los puntos altos y bajos. Es un mecanismo de pérdida de ajuste dinámico, que puede ajustar la amplitud de la pérdida de suspensión en función de la volatilidad del mercado y la tendencia. La relación de la línea de pérdida con el precio se utiliza para determinar el momento de la salida de la posición a par.

La base de entrada de esta estrategia es que el precio rompa el SESMA. La señal de salida se activa por la línea de parada. Se puede configurar si se muestra el marcador.

Ventajas estratégicas

  1. Las mejoras en la metodología de cálculo de SESMA pueden reducir los retrasos y mejorar la capacidad de captura de tendencia.
  2. El mecanismo de detención de pérdidas de seguimiento puede ajustar la amplitud de detención de pérdidas en función de las fluctuaciones en tiempo real, evitando que las detenciones de pérdidas sean demasiado relajadas o demasiado cercanas.
  3. Marcaje de entrada y salida para auxiliar el juicio visual.
  4. Parámetros personalizables para diferentes variedades y optimización de parámetros

Riesgos y direcciones de optimización

  1. En el caso de una reversión de la tendencia, el stop loss puede ser activado para provocar una salida prematura.
  2. Los parámetros de SESMA se pueden optimizar para encontrar la longitud óptima.
  3. Los parámetros ATR también pueden probar diferentes longitudes de ciclo.
  4. Las pruebas muestran el efecto de la marca.

Resumir

La estrategia integra el juicio de tendencias con los indicadores de control de riesgos, formando una estrategia de seguimiento de tendencias más sólida. En comparación con la simple estrategia de medias móviles, la estrategia capta tendencias con mayor flexibilidad y reduce los retrocesos. La optimización de parámetros permite que la estrategia tenga un mejor efecto en diferentes mercados.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai
strategy('Chandelier Exit ZLSMA Strategy', shorttitle='CE_ZLSMA', overlay = true, initial_capital = 1000, default_qty_value = 10, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = false, process_orders_on_close = true, commission_value = 0.075)

// -- Colors --
color maximumYellowRed = color.rgb(255, 203, 98) // yellow
color rajah = color.rgb(242, 166, 84) // orange
color magicMint = color.rgb(171, 237, 198)
color languidLavender = color.rgb(232, 215, 255)
color maximumBluePurple = color.rgb(181, 161, 226)
color skyBlue = color.rgb(144, 226, 244)
color lightGray = color.rgb(214, 214, 214)
color quickSilver = color.rgb(163, 163, 163)
color mediumAquamarine = color.rgb(104, 223, 153)
color carrotOrange = color.rgb(239, 146, 46)

// -- Inputs --
length = input(title='ATR Period', defval=1)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2)
showLabels = input(title='Show Buy/Sell Labels ?', tooltip='Created by Chandelier Exit (CE)', defval=false)
isSignalLabelEnabled = input(title='Show Signal Labels ?', defval=true)
useClose = input(title='Use Close Price for Extrema ?', defval=true)
zcolorchange = input(title='Enable Rising/Decreasing Highlightning', defval=false)
zlsmaLength = input(title='ZLSMA Length', defval=50)
offset = input(title='Offset', defval=0)

// -- CE - Credits to @everget --
float haClose = float(1) / 4 * (open[1] + high[1] + low[1] + close[1])
atr = mult * ta.atr(length)[1]

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

shortStop = (useClose ? ta.lowest(haClose, length) : ta.lowest(haClose, length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := haClose < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := haClose > shortStopPrev ? 1 : haClose < longStopPrev ? -1 : dir

buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=mediumAquamarine, textcolor=color.white)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=carrotOrange, textcolor=color.white)

changeCond = dir != dir[1]

// -- ZLSMA - Credits to @netweaver2011 --
lsma = ta.linreg(haClose, zlsmaLength, offset)
lsma2 = ta.linreg(lsma, zlsmaLength, offset)
eq = lsma - lsma2
zlsma = lsma + eq

zColor = zcolorchange ? zlsma > zlsma[1] ? magicMint : rajah : languidLavender
plot(zlsma, title='ZLSMA', linewidth=2, color=zColor)

// -- Signals --
var string isTradeOpen = ''
var string signalCache = ''

bool enterLong = buySignal and ta.crossover(haClose, zlsma) 
bool exitLong = ta.crossunder(haClose, zlsma) 
bool enterShort = sellSignal and ta.crossunder(haClose, zlsma)
bool exitShort = ta.crossover(haClose, zlsma)

if (signalCache == 'long entry')
    signalCache := ''
    enterLong := true
else if (signalCache == 'short entry')
    signalCache := ''
    enterShort := true

if (isTradeOpen == '')
    if (exitShort and (not enterLong))
        exitShort := false
    if (exitLong and (not enterShort))
        exitLong := false   
    if (enterLong and exitShort)
        isTradeOpen := 'long'
        exitShort := false
    else if (enterShort and exitLong)
        isTradeOpen := 'short'
        exitLong := false
    else if (enterLong)
        isTradeOpen := 'long'
    else if (enterShort)
        isTradeOpen := 'short'
else if (isTradeOpen == 'long')
    if (exitShort)
        exitShort := false
    if (enterLong)
        enterLong := false
    if (enterShort and exitLong)
        enterShort := false
        signalCache := 'short entry'
    if (exitLong)
        isTradeOpen := ''
else if (isTradeOpen == 'short')
    if (exitLong)
        exitLong := false
    if (enterShort)
        enterShort := false
    if (enterLong and exitShort)
        enterLong := false
        signalCache := 'long entry'
    if (exitShort)
        isTradeOpen := ''

plotshape((isSignalLabelEnabled and enterLong) ? zlsma : na, title='LONG', text='L', style=shape.labelup, color=mediumAquamarine, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and enterShort) ? zlsma : na, title='SHORT', text='S', style=shape.labeldown, color=carrotOrange, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitLong) ? zlsma : na, title='LONG EXIT', style=shape.circle, color=magicMint, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitShort) ? zlsma : na, title='SHORT EXIT', style=shape.circle, color=rajah, size=size.tiny, location=location.absolute)

barcolor(color=isTradeOpen == 'long' ? mediumAquamarine : isTradeOpen == 'short' ? carrotOrange : na)

// -- Long Exits --
if (exitLong and strategy.position_size > 0)
    strategy.close('long', comment='EXIT_LONG')

// -- Short Exits --
if (exitShort and strategy.position_size < 0)
    strategy.close('short', comment='EXIT_SHORT')

// -- Long Entries --
if (enterLong)
    strategy.entry('long', strategy.long, comment='ENTER_LONG')

// -- Short Entries --
if (enterShort)
    strategy.entry('short', strategy.short, comment='ENTER_SHORT')