Estrategia de cruce de la media móvil del RSI en varios plazos

El autor:¿ Qué pasa?, Fecha: 2023-11-16 16:28:22
Las etiquetas:

img

Resumen general

La estrategia de cruce de promedios móviles de RSI es una estrategia de seguimiento de tendencias a través de múltiples marcos de tiempo. Utiliza indicadores de RSI en múltiples marcos de tiempo y toma un promedio móvil ponderado de cada RSI de cada marco de tiempo. Las señales finales se generan combinando todos los promedios móviles de RSI en dos indicadores integrales y negociando las señales de cruce, que es un típico sistema de cruce de promedios móviles duales.

Principios

Esta estrategia primero calcula los indicadores del RSI en múltiples marcos de tiempo (1 minuto, 5 minutos, 15 minutos, etc.) Luego se necesita VMA de 15 períodos (media móvil ponderada) del RSI para cada marco de tiempo para obtener las líneas de media móvil del RSI.

Después de eso, todos los promedios móviles del RSI de diferentes marcos de tiempo se combinan por igual en dos señales: línea rápida y línea lenta.

Cuando la línea rápida cruza por encima de la línea lenta, se genera una señal de compra. Cuando la línea rápida cruza por debajo de la línea lenta, se genera una señal de venta. Al combinar el RSI de varios marcos de tiempo de esta manera, las señales de cruce pueden rastrear efectivamente las tendencias mientras filtran el ruido del mercado a corto plazo.

Ventajas

  1. La combinación de múltiples marcos de tiempo puede suavizar las curvas de precios y evitar de manera efectiva las falsas rupturas.

  2. El RSI indica los niveles de sobrecompra/sobreventa, evitando perseguir nuevos máximos/ mínimos.

  3. Las medias móviles dobles tienen un mejor efecto de retención que un único sistema de medias móviles.

  4. El uso de VMA en lugar de SMA reduce el impacto de las fluctuaciones a corto plazo.

Los riesgos

  1. Las estrategias de marcos de tiempo múltiples requieren una extensa afinación de parámetros, configuraciones inadecuadas pueden causar entradas buenas perdidas o entradas tardías.

  2. Los promedios móviles tienen un mal ajuste de la curva, un rendimiento inferior en los puntos de inflexión de la tendencia.

  3. La divergencia del RSI ocurre con frecuencia, las señales de reversión deben ser observadas.

Soluciones: Optimice los parámetros del marco de tiempo; Combine con otros indicadores como el MACD para determinar tendencias; Cuidado con las señales de divergencia del RSI.

Direcciones de optimización

  1. Optimizar el número de marcos de tiempo y la configuración de parámetros para capturar mejor las tendencias.

  2. Considere la posibilidad de añadir un stop loss para controlar los riesgos.

  3. Combinar otros indicadores para una mejor decisión sobre tendencias y divergencias.

  4. Prueba de diferentes parámetros del período de retención para obtener el mejor efecto de retención.

Conclusión

La estrategia de cruce de promedio móvil RSI multi-tiempo genera señales comerciales combinando indicadores de RSI de múltiples marcos de tiempo utilizando un sistema de promedio móvil, que es una estrategia típica de seguimiento de tendencias multi-tiempo.


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

//@version=4
strategy(title="RSI multitimeframe SMA crossover", shorttitle="RSI multitimeframe strategy", default_qty_type= strategy.percent_of_equity, margin_long=50, default_qty_value=150)

res1 = input(title="Res 01", type=input.resolution, defval="1")
res2 = input(title="Res 0", type=input.resolution, defval="5")
res3 = input(title="Res 1", type=input.resolution, defval="15")
res4 = input(title="Res 2", type=input.resolution, defval="15")
res5 = input(title="Res 3", type=input.resolution, defval="15")
res6 = input(title="Res 4", type=input.resolution, defval="30")
res7 = input(title="Res 5", type=input.resolution, defval="45")
res8 = input(title="Res 6", type=input.resolution, defval="60")



lengthRSI = input(15, minval=1)
lengthMA = input(15, minval=1)
lengthFMA = input(100, minval=1)
lengthFMA2 = input(150, minval=1)
Long_yes = input(defval=1, title="Long trades 0 or 1", minval=0, maxval=1)
Short_yes = input(defval=0, title="Short trades 0 or 1", minval=0, maxval=1)
src = close

// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"



// stop loss 
longLossPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.5, defval=10) * 
   0.01
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)

shortLossPerc = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.5, defval=10) * 
   0.01
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


rsi1 = rsi(src, lengthRSI)
MA1 = vwma(rsi1, lengthMA)






outD1 = security(syminfo.tickerid, res1, MA1)
outD2 = security(syminfo.tickerid, res2, MA1)
outD3 = security(syminfo.tickerid, res3, MA1)
outD4 = security(syminfo.tickerid, res4, MA1)
outD5 = security(syminfo.tickerid, res5, MA1)
outD6 = security(syminfo.tickerid, res6, MA1)
outD7 = security(syminfo.tickerid, res7, MA1)
outD8 = security(syminfo.tickerid, res8, MA1)




//plot_d0 = outD0
//plot_d1 = outD1
//plot_d2 = outD2
//plot_d3 = outD3
//plot_d4 = outD4
//plot_d5 = outD5
//plot_d6 = outD6

out_multi = ema(outD1+outD2+outD3+outD4+outD5+outD6+outD7+outD8, lengthFMA)
out_multi2 = ema(outD1+outD2+outD3+outD4+outD5+outD6+outD7+outD8, lengthFMA2)
//out_multi1 = outD2+outD3+outD4
//out_multi2 = outD4+outD5+outD6

//col0 = outD0 < 20 ? color.lime : outD0 > 80 ? color.red : color.blue
//col1 = outD1 < 20 ? color.lime : outD1 > 80 ? color.red : color.blue
//col2 = outD2 < 20 ? color.lime : outD2 > 80 ? color.red : color.blue
//col3 = outD3 < 20 ? color.lime : outD3 > 80 ? color.red : color.blue
//col4 = outD4 < 20 ? color.lime : outD4 > 80 ? color.red : color.blue
//col5 = outD5 < 20 ? color.lime : outD5 > 80 ? color.red : color.blue
//col6 = outD6 < 20 ? color.lime : outD6 > 80 ? color.red : color.blue


// plot(plot_d0,linewidth=2, color=col0)
// plot(plot_d1, linewidth=2, color=col1)
// plot(plot_d2,linewidth=2, color=col2)
// plot(plot_d3,linewidth=2, color=col3)
// plot(plot_d4,linewidth=2, color=col4)
// plot(plot_d5,linewidth=2, color=col5)
// plot(plot_d6,linewidth=2, color=col6)

long=(out_multi/8)
short=(out_multi2/8)

plot(long, linewidth=1, color=color.green)
plot(short, linewidth=1, color=color.red)

long1=crossover(long,short)
short1=crossunder(long,short)

h0 = hline(65, "Upper Band", color=color.red, linestyle=hline.style_solid, linewidth=2 )
h1 = hline(35, "Lower Band", color=color.green, linestyle=hline.style_solid, linewidth=2)


strategy.entry("buy", strategy.long, when=long1 and window() and Long_yes > 0) 
if strategy.position_size > 0
    strategy.exit(id="XL STP", stop=longStopPrice)
strategy.close("buy",when=short1 )

strategy.entry("sell", strategy.short, when=short1 and window() and Short_yes > 0) 
if strategy.position_size < 0
    strategy.exit(id="XS STP", stop=shortStopPrice)
strategy.close("buy",when=long1 )



Más.