Estrategia de seguimiento de tendencias basada en MOST y KAMA


Fecha de creación: 2024-02-29 11:04:38 Última modificación: 2024-02-29 11:04:38
Copiar: 3 Número de Visitas: 697
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias basada en MOST y KAMA

Descripción general

La estrategia utiliza una combinación de varias medias móviles, como SMA, EMA y KAMA, para identificar la dirección de la tendencia de los precios y diseñar una estrategia de seguimiento de la tendencia en función de la ruptura de los precios. Cuando los precios suben, trails the upper band como una parada; cuando los precios bajan, trails the inferior como una parada.

Principio de estrategia

La estrategia utiliza el KAMA como un indicador básico para determinar la dirección de la tendencia, ya que el KAMA es más sensible a los cambios en los precios, lo que permite identificar los giros más temprano. Al mismo tiempo, la estrategia incluye una combinación de otras múltiples medias móviles, como SMA, EMA, etc., para filtrar los precios e identificar la dirección de la tendencia principal.

La estrategia de la línea de detención de pérdidas se basa en el precio en sí mismo y en el promedio móvil. En concreto, la línea de detención de seguimiento hacia arriba se superpone a la media móvil en una proporción como un amortiguador; la línea de detención de seguimiento hacia abajo se reduce a la media móvil en una proporción como un amortiguador.

Las condiciones de entrada son: hacer más cuando el precio rompe la línea de parada de la línea superior de abajo hacia arriba; hacer vacío cuando el precio rompe la línea de parada de la línea inferior de arriba hacia abajo.

Análisis de las ventajas

La mayor ventaja de esta estrategia es que, a través de la combinación de varias medias móviles, se puede mejorar la precisión de los juicios de tendencias y reducir las falsas señales. Al mismo tiempo, la línea de stop loss de la estrategia se basa en los cambios en la dinámica de las medias móviles y puede ajustarse en función de los precios en tiempo real para responder a eventos inesperados.

Además, en comparación con la estrategia de un solo indicador, la estrategia combina las ventajas de la estrategia de seguimiento de tendencias y ruptura. En una situación de tendencia, se puede maximizar los beneficios; mientras que en una situación de crisis, se pueden reducir los daños mediante la configuración de stop loss.

Análisis de riesgos

El principal riesgo de esta estrategia es que la configuración de la línea de parada puede ser demasiado flexible y no se puede detener a tiempo. Esto se debe a que el porcentaje de retiro de la línea de parada está fijado, y si la situación cambia drásticamente y no se puede actualizar la línea de parada a tiempo, puede generar mayores pérdidas.

Además, el Moving Average en sí mismo es muy retrasado y no puede reaccionar de inmediato a los cambios de precio. Esto también puede causar que no se pueda detener a tiempo cuando el mercado cambia rápidamente.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Prueba la proporción de la línea de pérdida bajo diferentes parámetros para encontrar una combinación de parámetros más eficiente.

  2. Intentar configurar el límite de pérdidas como un cambio dinámico, ajustado según la volatilidad del mercado;

  3. Aumentar el criterio de otros indicadores, introducir más variables en el Stop Loss Basis y mejorar la adaptabilidad de las estrategias;

  4. Optimización de los parámetros de ciclo de las medias móviles para encontrar la configuración de ciclo de los mejores precios de equilibrio.

Resumir

Esta estrategia es más robusta en general, ya que determina la dirección de la tendencia a través de varias combinaciones de medias móviles y diseña un mecanismo de seguimiento de stop loss dinámico para seguir la tendencia. La ventaja es que se pueden reducir las falsas señales y controlar el riesgo mediante el control de stop loss. La desventaja es que la línea de stop loss puede estar demasiado ancha y no se puede detener rápidamente.

Código Fuente de la Estrategia
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true)

ma_length = input.int(title='Moving Average Length', minval=1, defval=3)
percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0)
src = input(title='Source', defval=close)
mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"])
T3a1 = 0.7
_type = false //input(false, title='Activate Moving Average Screening Mode')
_type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode')
activateScreener = input.bool(false, title="Activate Screener?")
showsignallabels = input(title='Show Signal Labels?', defval=true)

Var_Func(src, ma_length) =>
    valpha = 2 / (ma_length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

VAR = Var_Func(src, ma_length)
DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length)

Wwma_Func(src, ma_length) =>
    wwalpha = 1 / ma_length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

WWMA = Wwma_Func(src, ma_length)

// KAMA Calculation
Kama_Func(src, ma_length) =>
    xvnoise = math.abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = math.abs(src - src[ma_length])
    nnoise = math.sum(xvnoise, ma_length)
    nefratio = nnoise != 0 ? nsignal / nnoise : 0
    nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))
    nAMA

Zlema_Func(src, ma_length) =>
    zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, ma_length)
    ZLEMA

ZLEMA = Zlema_Func(src, ma_length)

Tsf_Func(src, ma_length) =>
    lrc = ta.linreg(src, ma_length, 0)
    lrc1 = ta.linreg(src, ma_length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, ma_length, 0) + lrs
    TSF

TSF = Tsf_Func(src, ma_length)

HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length)))

T3e1 = ta.ema(src, ma_length)
T3e2 = ta.ema(T3e1, ma_length)
T3e3 = ta.ema(T3e2, ma_length)
T3e4 = ta.ema(T3e3, ma_length)
T3e5 = ta.ema(T3e4, ma_length)
T3e6 = ta.ema(T3e5, ma_length)
T3c1 = -T3a1 * T3a1 * T3a1
T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1
T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1
T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1
T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3

getMA(src, ma_length) =>
    ma = 0.0
    ma := switch mav
        'SMA' => ta.sma(src, ma_length)
        'EMA' => ta.ema(src, ma_length)
        'WMA' => ta.wma(src, ma_length)
        'DEMA' => DEMA
        'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1)
        'VAR' => VAR
        'WWMA' => WWMA
        'ZLEMA' => ZLEMA
        'TSF' => TSF
        'HULL' => HMA
        'TILL' => T3
        'KAMA' => Kama_Func(src, ma_length)
    ma
ALL = getMA(src, ma_length)
exMov = ALL
fark = exMov * percent * 0.01
longStop = exMov - fark
longStopPrev = nz(longStop[1], longStop)
longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = exMov + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir
MOST = dir == 1 ? longStop : shortStop
cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST)
cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST)
direction = 0
direction := cro ? 1 : cru ? -1 : direction[1]
col1 = exMov > exMov[1]
col3 = exMov < exMov[1]
colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0)
if (cro)
    strategy.entry('LONG', strategy.long)
if (cru)
    strategy.close('LONG')

plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST')
plot(exMov, color=colorM, linewidth=2, title='exMov')
plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0))
plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))