La Estrategia de Momentum Estocástico es una estrategia de trading cuantitativa que combina el Índice de Momentum Estocástico (SMI) y el Índice de Fuerza Relativa (RSI). Utiliza el SMI para identificar áreas de sobrecompra y sobreventa en el mercado, con el RSI rápido actuando como un filtro de señal. También implementa un filtro corporal para una selección de señal más confiable.
El índice de impulso estocástico (SMI) es un indicador técnico común utilizado en el comercio cuantitativo que combina los puntos fuertes de los indicadores de impulso y oscilación.
Específicamente, el SMI se calcula como:
SMI = (cerca - (HH + LL) /2)/(0,5*(HH - LL)) * 100
donde HH es el precio más alto durante los últimos N días y LL es el precio más bajo.
El SMI es un indicador de los movimientos de los mercados, que incluye tanto el juicio de impulso de tendencia como el juicio de reversión de la oscilación.
El índice de fortaleza relativa (RSI) es un indicador estándar de sobrecompra/sobreventa.
Las lecturas por debajo de 20 se consideran sobrevendidas, mientras que las por encima de 80 se consideran sobrecompradas por el RSI rápido.
La estrategia también implementa un filtro corporal comprobando el tamaño del cuerpo del candelabro para filtrar ciertas señales.
Esto filtra algunas señales falsas y aumenta la confiabilidad.
Este enfoque combina el SMI, el RSI rápido y el filtro corporal en un sistema robusto de 3 partes.
Tanto el SMI como el RSI rápido son excelentes para detectar tendencias agotadas.
La capacidad de comprar tanto caídas como subidas cortas maximiza las oportunidades en todas las condiciones del mercado.
El filtro de la carrocería evita las aserraduras rechazando señales de baja convicción en condiciones agitadas.
El cambio frecuente entre largo y corto conlleva un riesgo de serrucha.
Las señales pueden agrupar a los participantes del mercado y estimular rápidas reversiones al entrar.
Los eventos extremos pueden cambiar todos los modelos.
La prueba de diferentes períodos SMI/RSI y umbrales de filtro de cuerpo podría revelar valores óptimos para mayores rendimientos.
La incorporación de paradas basadas en la volatilidad o ATR contenería mejor el riesgo de posición y de cartera.
Los modelos que predicen los niveles futuros de los indicadores podrían identificar los puntos de inflexión antes, lo que mejoraría el poder predictivo.
En resumen, al integrar el SMI, el RSI rápido y el filtro corporal, esta estrategia ha creado un sistema de sobrecompra/sobreventa bastante completo. El enfoque de múltiples señales mejora la precisión, mientras que la capacidad de comercio bidireccional y los controles de riesgos contribuyen al equilibrio.
/*backtest start: 2023-12-22 00:00:00 end: 2024-01-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usemar = input(false, defval = false, title = "Use Martingale") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") usesmi = input(true, defval = true, title = "Use SMI Strategy") usersi = input(true, defval = true, title = "Use RSI Strategy") usebod = input(true, defval = true, title = "Use Body-Filter") a = input(5, "SMI Percent K Length") b = input(3, "SMI Percent D Length") limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit") fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Fast RSI fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //Stochastic Momentum Index ll = lowest (low, a) hh = highest (high, a) diff = hh - ll rdiff = close - (hh+ll)/2 avgrel = ema(ema(rdiff,b),b) avgdiff = ema(ema(diff,b),b) SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0 SMIsignal = ema(SMI,b) //Lines plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index") plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line") plot(limit, color = black, title = "Over Bought") plot(-1 * limit, color = black, title = "Over Sold") plot(0, color = blue, title = "Zero Line") //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Signals up1 = SMIsignal < -1 * limit and close < open and body and usesmi dn1 = SMIsignal > limit and close > open and body and usesmi up2 = fastrsi < 20 and close < open and body and usersi dn2 = fastrsi > 80 and close > open and body and usersi exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //Trading profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1] mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1 lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1] if up1 or up2 if strategy.position_size < 0 strategy.close_all() strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if dn1 or dn2 if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) or exit strategy.close_all()