Indice de impulso estocástico y estrategia de negociación cuantitativa basada en el RSI

El autor:¿ Qué pasa?, Fecha: 2023-12-12 15:20:29
Las etiquetas:

img

Resumen general

Esta estrategia se basa principalmente en dos indicadores - Índice de Momento Estocástico (SMI) e Índice de Fuerza Relativa (RSI). También incorpora filtro de color y filtro del cuerpo de la vela como condiciones de juicio auxiliares. Las señales de negociación se generan en base a las señales de compra y venta de SMI y RSI, combinadas con condiciones de filtro.

Estrategia lógica

Esta estrategia se basa en los indicadores SMI y RSI para el juicio. El SMI juzga principalmente si una acción está sobrecomprada o sobrevendida, mientras que el RSI determina la fuerza relativa de una acción. Cuando ambos indicadores dan señales de compra al mismo tiempo, se desencadenará una acción de compra. La lógica específica es la siguiente:

  1. Cuando el SMI está sobrevendido (por debajo del límite inferior), se considera una señal de compra
  2. Cuando el RSI está por debajo del umbral, se considera una señal de compra
  3. Cuando tanto el SMI sobrevendido como el RSI por debajo del umbral correspondiente se producen, se activa una señal de compra.
  4. La lógica de la señal de venta es similar

Además, esta estrategia tiene un modo de señales duales. Este modo requiere señales SMI y RSI para activar cualquier operación. Esto puede reducir eficazmente las señales falsas.

Además, el filtro de color y el filtro del cuerpo de la vela están incorporados. Estos filtros requieren un cuerpo de vela relativamente grande y la última vela se cierra más alta que la abierta. Esto puede evitar aún más las fallas comerciales.

Ventajas

  1. Utilice SMI para sobrecomprado/sobrevendido y RSI para la fuerza relativa, la doble confirmación puede reducir las señales falsas
  2. El modo de doble señal puede disminuir en gran medida las operaciones ineficaces
  3. Los filtros de color y de cuerpo pueden filtrar los brotes falsos con eficacia
  4. La lógica de la estrategia es simple y limpia.
  5. La mayoría de los parámetros son personalizables

Riesgos y optimización

  1. SMI y RSI pueden producir más señales falsas cuando se usan solos, necesitan un examen cuidadoso
  2. En el modo de doble señal, se pueden perder buenas oportunidades comerciales si los parámetros no se establecen correctamente
  3. Puede probar la rentabilidad de la estrategia bajo diferentes parámetros periódicos para encontrar la combinación óptima de parámetros
  4. Puede evaluar los parámetros de umbral mediante simulación o backtesting
  5. Puede considerar incorporar más filtros para optimizar la estrategia

Resumen de las actividades

Esta estrategia integra las señales de los indicadores SMI y RSI y genera órdenes de negociación a través de la confirmación doble. También se implementan filtros de color y filtro del cuerpo de la vela para filtrar las fallas. La estrategia tiene un flujo lógico simple y limpio, y la mayoría de los parámetros son personalizables. Se puede lograr un mejor rendimiento ajustando los parámetros en consecuencia.


/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", 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")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(2018, defval = 2018, 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), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
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)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(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(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//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]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    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)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    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()

Más.