Estrategia de tendencia cruzada de la media móvil doble

El autor:¿ Qué pasa?, Fecha: 2023-11-22 17:29:04
Las etiquetas:

img

Resumen general

La estrategia de tendencia de cruce de media móvil doble es una estrategia de seguimiento de tendencia que genera señales de compra y venta cuando las líneas de media móvil rápida y lenta se cruzan.

Estrategia lógica

La estrategia utiliza principalmente los siguientes indicadores para la evaluación:

  1. Las líneas de promedio móvil rápido y lento: cruz dorada para la señal de compra, cruz de muerte para la señal de venta.

  2. MACD: línea MACD por encima de la línea de señal y MACD ascendente más bajo para la señal alcista.

  3. RSI: RSI por encima de 50 para alcista, por debajo de 50 para bajista.

  4. Oscilador impresionante (AO): AO cruzando por encima de la línea 0 para comprar, cruzando por debajo para vender.

  5. Tres medias móviles diarias: cruce de la MA diaria de período más corto por encima de la MA diaria de período más largo como señal de compra.

La estrategia combina múltiples marcos de tiempo e indicadores para generar una lógica de compra y venta. Produce órdenes de compra cuando múltiples indicadores muestran señales alcistas al mismo tiempo, y órdenes de venta cuando surgen señales bajistas, para rastrear la tendencia.

Análisis de ventajas

La estrategia tiene las siguientes ventajas:

  1. La combinación de múltiples indicadores reduce las señales falsas y mejora la precisión.

  2. La incorporación de múltiples marcos de tiempo identifica una dirección de tendencia más amplia.

  3. El ajuste de parámetros proporciona una buena rentabilidad.

  4. Adopta un stop loss móvil para controlar el riesgo y limitar las pérdidas.

  5. Seguimiento automatizado de tendencias sin intervención manual, reduciendo los costes.

Análisis de riesgos

También tiene algunos riesgos:

  1. En los mercados de rango limitado, pueden ocurrir más cambios, optimizando los parámetros para reducir las señales no válidas.

  2. Los eventos del Cisne Negro podrían causar un fuerte descenso.

  3. La lógica compleja de compra / venta se basa en grandes datos históricos para encontrar parámetros óptimos.

  4. La configuración inadecuada de stop loss conduce a una salida prematura.

Direcciones de optimización

La estrategia puede mejorarse en los siguientes aspectos:

  1. Prueba más combinaciones de indicadores para señales más estables y precisas, como índice de volatilidad, OBV, etc.

  2. Optimizar los parámetros del indicador con aprendizaje automático y algoritmos genéticos para reducir el exceso de negociación.

  3. Introducir técnicas de conjunto de modelos para integrar señales de múltiples modelos estratégicos independientes, mejorando la robustez.

  4. Entrar en el comercio en un marco de tiempo más largo, salir en un marco de tiempo más bajo.

  5. Construir un módulo de control de riesgos cuantitativos con límites estrictos en el porcentaje de pérdida de parada por operación, extracción máxima, etc.

Resumen de las actividades

La estrategia de tendencia de cruce de promedio móvil doble utiliza cruces de MA rápidos y lentos como señales comerciales, junto con MACD, RSI para juzgar la dirección de la tendencia para el seguimiento automatizado de tendencias. Existe un espacio de optimización significativo al incorporar más indicadores, ajuste de parámetros, conjuntos de modelos, etc. para una mejor eficacia de la estrategia.


/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('SteffVans', shorttitle='SteffVans strategy', overlay=true, process_orders_on_close = true)

// Input settings
macd_fast_length = input(12)
macd_slow_length = input(26)
macd_signal_length = input(9)

// Calculate MACD values
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)
mg = ta.lowest(signal_line, 30) >= -0

// RSI
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1)
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
RSI = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))


//  AO
AO = ta.sma((high + low) / 2, 5) - ta.sma((high + low) / 2, 34)
crossaosell = AO < AO[1] and AO[1] < AO[2] and AO[2] > AO[3]  and ta.lowest(low,3)

// Uptrend sma
len1 = input.int(5, minval=1)
len2 = input.int(10, minval=1)
len3 = input.int(20, minval=1)
src = input(close)

out1 = ta.sma(src, len1)
out2 = ta.sma(src, len2)
out3 = ta.sma(src, len3)



// Timeframe 
macdl60 = request.security(syminfo.tickerid, "60", signal_line,lookahead = barmerge.lookahead_on)
ao = request.security(syminfo.tickerid, "60", AO,lookahead = barmerge.lookahead_on)
rsi = request.security(syminfo.tickerid, "60", RSI,lookahead = barmerge.lookahead_on)
good = request.security(syminfo.tickerid, "60", mg,lookahead = barmerge.lookahead_on)
bad = request.security(syminfo.tickerid, "60", crossaosell,lookahead = barmerge.lookahead_on)

ma1 = request.security(syminfo.tickerid, "D", out1,lookahead = barmerge.lookahead_on)
ma2 = request.security(syminfo.tickerid, "D", out2, lookahead = barmerge.lookahead_on)
ma3 = request.security(syminfo.tickerid, "D", out3, lookahead = barmerge.lookahead_on)






// Kriteria BUY and SELL
uptrend1 =  request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) > ma1 and ma1 > ma3 and ma2 > ma3
uptrend2 = ta.lowest(ma1,12) > ta.lowest(ma3,12) and ta.lowest(ma2,12) > ta.lowest(ma3,12) 


 

// Triger BUY and SELL 
cross1 = ao > ao[1] and ao[1] < ao[2] and ao > 0 and good and rsi >= 60 and uptrend1
cross2 = ao > 0 and ao[1] < 0 and good and rsi >=50 and uptrend1
cross3 =  ao > 0 and ao[1] < 0 and not good and uptrend2 and uptrend1
cross4 =  ao > ao[1] and ao[1] > ao[2] and ao[2] < ao[3] and ao[3] < ao[4]  and not good and uptrend2 and uptrend1

s1 = ao < ao[1] and ao[1] < ao[2] and ao[2] < ao[3] and ao > 0 and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
s2 =  ao < 0 and ao < ao[2] and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1 

// Variabel Buy dan Sell
buySignal = false
sellSignal = false

// Syarat masuk Buy
buyCondition =  cross1 or cross2 or cross3 or cross4
if buyCondition
    buySignal := true

// Syarat masuk Sell
sellCondition = s1 or s2
if sellCondition
    sellSignal := true

// Reset sinyal jika ada sinyal berulang
if buySignal and sellSignal
    sellSignal := false
if sellSignal and buySignal
    buySignal := false

// Logika perdagangan
if buySignal
    strategy.entry("Buy", strategy.long, comment = "BUY")
if sellSignal
    strategy.close("Buy")


plotshape(cross1,title = "Stefkuy1", style = shape.labelup, location = location.belowbar, color = color.green,text = "1", textcolor = color.white,size = size.small)
plotshape(cross2,title = "Stefkuy2", style = shape.labelup, location = location.belowbar, color = color.green, text = "2", textcolor= color.white, size = size.small)
plotshape(cross3,title = "StefVan1", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "3", textcolor= color.white,size = size.small)
plotshape(cross4,title = "StefVan2", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "4", textcolor= color.white,size = size.small)


Más.