En la carga de los recursos... Cargando...

Estrategia de tendencia basada en MOST y KAMA

El autor:¿ Qué pasa?, Fecha: 2024-02-29 11:04:38
Las etiquetas:

img

Esta estrategia combina múltiples promedios móviles como SMA y EMA para identificar la dirección de la tendencia del precio, y establece líneas de stop loss basadas en el avance del precio para diseñar una estrategia de seguimiento de la tendencia. Cuando los precios suben, sigue la banda superior como un stop loss; cuando los precios caen, sigue el límite inferior como un stop loss. La ventaja de la estrategia es que la combinación de múltiples promedios móviles puede suavizar los datos de precios e identificar tendencias; El diseño dinámico de stop loss evita paradas demasiado sensibles. El riesgo de la estrategia es que la configuración de la línea de stop loss puede ser demasiado floja para detener la pérdida a tiempo.

Principio de la estrategia

Esta estrategia utiliza KAMA como base para juzgar la dirección de la tendencia, porque KAMA responde a los cambios de precios de manera más sensible y puede identificar los giros de antemano.

La configuración de la línea de stop-loss de la estrategia se basa en el precio mismo y el promedio móvil. Específicamente, la línea de stop-loss ascendente es el promedio móvil más una proporción como búfer; La línea de stop-loss descendente es el promedio móvil menos una proporción como búfer. Esto permite una stop-loss inmediata cuando los precios se invierten.

Las condiciones de entrada son largas cuando los precios atraviesan la línea de stop loss al alza desde abajo hacia arriba; cortas cuando los precios atraviesan la línea de stop loss a la baja desde arriba hacia abajo.

Análisis de ventajas

La mayor ventaja de esta estrategia es que al combinar múltiples promedios móviles, se puede mejorar la precisión del juicio de tendencia y se pueden reducir las señales falsas.

Además, en comparación con las estrategias de indicador único, esta estrategia combina las ventajas del seguimiento de tendencias y las estrategias de avance.

Análisis de riesgos

El principal riesgo de esta estrategia es que la configuración de la línea de stop loss puede ser demasiado flexible para detener la pérdida a tiempo. Esto se debe a que la relación de retroceso de la línea de stop loss es fija, si hay un cambio violento en el mercado, la línea de stop loss no se puede actualizar a tiempo, lo que puede conducir a mayores pérdidas.

Además, el promedio móvil en sí tiene una alta histeresis y no puede reaccionar inmediatamente a los cambios de precios.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Prueba diferentes ajustes de parámetros para las relaciones de la línea de pérdida de parada para encontrar mejores combinaciones de parámetros;

  2. Tratar de hacer que la línea de stop loss cambie dinámicamente según el grado de fluctuación del mercado;

  3. Aumentar otros indicadores para juzgar, introducir más variables en la base de stop loss para mejorar la adaptabilidad de la estrategia;

  4. Optimizar los parámetros del ciclo de la media móvil para encontrar la mejor configuración del ciclo para suavizar los precios.

Resumen de las actividades

En general, esta estrategia es bastante robusta, combinando múltiples promedios móviles para determinar la dirección de la tendencia, y diseñando un mecanismo de stop loss dinámico con el objetivo de seguir las tendencias. Las ventajas son que puede reducir señales falsas, controlar riesgos a través de stop loss; La desventaja es que la línea de stop loss puede ser demasiado amplia para detener la pérdida rápidamente.


/*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))


Más.