Estrategia de indicadores de doble impulso estocástico

El autor:¿ Qué pasa?, Fecha: 2023-10-07 16:45:25
Las etiquetas:

Resumen general

Esta estrategia utiliza dos indicadores de impulso estocástico (SMI y RSI) para señales largas y cortas, junto con el martingala y el filtro corporal para la selección de señales comerciales, con el objetivo de capturar las tendencias a medio plazo y las fluctuaciones de precios.

Estrategia lógica

La estrategia juzga largo y corto usando dos indicadores estocásticos SMI y RSI. El SMI se calcula sobre la base de la media móvil del rango de barras y el precio de cierre, bueno para identificar puntos de reversión. El RSI compara el poder de los toros y los bajistas para determinar el estado de sobrecompra y sobreventa. La estrategia va largo cuando el SMI está por debajo de -50 y el RSI está por debajo de 20; va corto cuando el SMI está por encima de 50 y el RSI está por encima de 80.

Para filtrar las falsas rupturas, la estrategia también utiliza 1/3 de la SMA corporal de 10 períodos como condición del filtro de ruptura.

Además, la estrategia adopta martingale opcional, que es escalar lotes en operaciones perdedoras, tratando de recuperar las pérdidas anteriores.

La funcionalidad de pruebas de retroceso prueba la estrategia introduciendo un rango de fechas.

Análisis de ventajas

La estrategia combina dos indicadores estocásticos y filtros, capaces de identificar eficazmente los puntos de inversión, capturar las tendencias a medio plazo y rastrear las fluctuaciones de precios.

  • SMI tiene una fuerte capacidad de reconocimiento de puntos de inversión y puede determinar las condiciones de sobrecompra y sobreventa de manera efectiva.
  • La adición de RSI evita las operaciones perdidas.
  • El filtro corporal elimina las fallas y mejora la precisión de la señal.
  • La estrategia de martingale opcional permite recuperar parte de las pérdidas.

Análisis de riesgos

  • Como indicadores rezagados, el SMI y el RSI tienen riesgos de perseguir máximos y matar mínimos.
  • Martingale conlleva el riesgo de acelerar las pérdidas.
  • Los filtros pueden filtrar algunas señales válidas en mercados variados.

Los riesgos pueden mitigarse optimizando los parámetros SMI y RSI para reducir la probabilidad de persecución/muerte, utilizando la martingale estratégicamente controlando la proporción y los tiempos de escalado y habilitando filtros discrecionales basados en las condiciones del mercado.

Direcciones de optimización

  • Optimizar los parámetros del SMI y del RSI para una mejor eficacia de juicio.
  • Ajustar los parámetros del filtro para reducir la probabilidad de filtrar señales válidas.
  • Optimice los tiempos y la proporción de escalado de Martingale.
  • Incorporar indicadores de tendencia para evitar el comercio contra la tendencia.
  • Añadir stop loss para limitar las pérdidas en operaciones individuales.

Resumen de las actividades

La estrategia combina indicadores estocásticos duales para capturar los puntos de inversión, con filtros y martingale para la selección y persecución de señales comerciales. Puede identificar efectivamente las tendencias a medio plazo y rastrear las fluctuaciones de precios, adecuado para los inversores que persiguen una alta tasa de ganancia. Preste atención a los riesgos de mercado de retraso y rango de indicadores, maneje los riesgos mediante optimización de parámetros y stop loss.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title = "CS Basic Scripts - Stochastic Special (Strategy)", shorttitle = "Stochastic Special", 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")

//Backtesting Input Range
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 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > 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()

Más.