Estrategia de impulso estocástico de triple pila


Fecha de creación: 2024-01-26 12:15:20 Última modificación: 2024-01-26 12:15:20
Copiar: 2 Número de Visitas: 768
1
Seguir
1617
Seguidores

Estrategia de impulso estocástico de triple pila

Descripción general

La estrategia de la dinámica aleatoria de la triple superposición es una estrategia de comercio de la línea corta típica. Se computan tres indicadores de dinámica aleatoria de diferentes parámetros de configuración, y se superponen en múltiples, para formar una señal de comercio. Cuando los tres indicadores de dinámica aleatoria muestran al mismo tiempo una señal de sobrecompra o sobreventa, se compra o se vende.

Principio de estrategia

El indicador central de esta estrategia es el indicador de movimiento aleatorio (SMI). La fórmula de cálculo del indicador SMI es la siguiente:

SMI = 100 * EMA(EMA(收盘价-最高价和最低价的中点,N1),N2) / 0.5 * EMA(EMA(最高价-最低价,N1),N2)

N1 y N2, respectivamente, son las longitudes de los parámetros. El índice SMI tiene un rango de toma de valores entre -100 y 100. Cuando el SMI es superior a 0 indica que el precio de cierre se encuentra en la mitad superior del rango de precios del día, y cuando es inferior a 0 indica que el precio de cierre se encuentra en la mitad inferior del rango de precios.

Al igual que los tradicionales indicadores de stoch, los indicadores SMI pueden generar señales de reversión cuando superan la línea de sobrecompra (como 40) y la línea de sobreventa (como 40). Cuando el indicador SMI cruza su media móvil, genera una señal de compra; cuando el indicador SMI cruza su media móvil, genera una señal de venta.

La estrategia se superpone con tres grupos de indicadores SMI con diferentes configuraciones de parámetros, configurados para:

  • SMI1: %K de longitud 10 ciclos, %K de suavizado 3 ciclos
  • SMI2: %K de longitud 20 ciclos, %K de suavizado 3 ciclos
  • SMI3: %K de longitud 5 ciclos, %K de suavizado 3 ciclos

Cuando los tres indicadores SMI muestran al mismo tiempo sobrecompra o sobreventa, se emite una señal de negociación. Esto puede filtrar eficazmente las señales falsas y mejorar la calidad de la señal.

Ventajas estratégicas

  • Análisis de ciclo de tiempo múltiple, juicio integral, filtración eficaz de ruido
  • El SMI mejora la facilidad de uso del indicador de Stoch
  • Utilizando la triple superposición, la fiabilidad es más alta que un solo indicador
  • Ajuste de parámetros flexibles y ajustables
  • Aplicable para operaciones de línea corta de alta frecuencia

Riesgo estratégico

  • La superposición de múltiples indicadores hace que haya un cierto retraso
  • Las líneas cortas son frecuentes y los costos de las transacciones son altos.
  • Riesgo de coincidencia de datos de retroalimentación
  • Riesgo de fallo de parámetros tras cambios en la estructura del mercado

Las medidas para mitigar el riesgo:

  • Optimización de parámetros para reducir el retraso
  • Ajuste adecuado de los tiempos de tenencia para reducir los costos de las transacciones
  • Aumentar las pruebas estadísticas y la robustez
  • Parámetros de ajuste dinámico

Optimización de la estrategia

  • Prueba de diferentes combinaciones de parámetros SMI
  • Aumentar los indicadores estadísticos para evaluar la estabilidad de los parámetros
  • En combinación con otros indicadores auxiliares, como el volumen de intercambio, la banda de Brin, etc.
  • Parámetros de conmutación basados en el entorno dinámico del mercado
  • Optimización de las estrategias de stop loss

Resumir

La estrategia de la dinámica aleatoria de la triple superposición se basa en tres grupos de diferentes parámetros de la configuración de los indicadores SMI, que se juzga en conjunto en varios períodos de tiempo, para formar una señal de comercio de venta y compra de alta calidad. En comparación con un solo indicador, la estrategia puede filtrar más ruido y mejorar la estabilidad.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Stochastic Momentum multi strategy", "Stochastic Momentum Index multi strategy", overlay=false)

q = input(10, title="%K Length")
r = input(3, title="%K Smoothing Length")
s = input(3, title="%K Double Smoothing Length")
nsig = input(10, title="Signal Length")
matype = input("ema", title="Signal MA Type")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought = input(40, title="Overbought Level", type=float)
oversold = input(-40, title="Oversold Level", type=float)

trima(src, length) => sma(sma(src,length),length)
hma(src, length) => wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
dema(src, length) => 2*ema(src,length) - ema(ema(src,length),length)
tema(src, length) => (3*ema(src,length) - 3*ema(ema(src,length),length)) + ema(ema(ema(src,length),length),length)
zlema(src, length) => ema(src,length) + (ema(src,length) - ema(ema(src,length),length))

smi = 100 * ema(ema(close-0.5*(highest(q)+lowest(q)),r),s) / (0.5 * ema(ema(highest(q)-lowest(q),r),s))
sig = matype=="ema" ? ema(smi,nsig) : matype=="sma" ? sma(smi,nsig) : matype=="wma" ? wma(smi,nsig) : matype=="trima" ? trima(smi,nsig) : matype=="hma" ? hma(smi,nsig) : matype=="dema" ? dema(smi,nsig) : matype=="tema" ? tema(smi,nsig) : matype=="zlema" ? zlema(smi,nsig) : ema(smi,nsig)

p_smi = plot(smi, title="SMI", color=aqua)
p_sig = plot(sig, title="Signal", color=red)

// plotchar(crossover(smi, sig), title= "low", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi, sig), title= "high", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////2
q2 = input(20, title="%K Length 2")
r2 = input(3, title="%K Smoothing Length 2")
s2 = input(3, title="%K Double Smoothing Length 2")
nsig2 = input(10, title="Signal Length 2")
matype2 = input("ema", title="Signal MA Type 2")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought2 = input(40, title="Overbought Level 2", type=float)
oversold2 = input(-40, title="Oversold Level 2", type=float)

trima2(src2, length2) => sma(sma(src2,length2),length2)
hma2(src2, length2) => wma(2*wma(src2, length2/2)-wma(src2, length2), round(sqrt(length2)))
dema2(src2, length2) => 2*ema(src2,length2) - ema(ema(src2,length2),length2)
tema2(src2, length2) => (3*ema(src2,length2) - 3*ema(ema(src2,length2),length2)) + ema(ema(ema(src2,length2),length2),length2)
zlema2(src2, length2) => ema(src2,length2) + (ema(src2,length2) - ema(ema(src2,length2),length2))

smi2 = 100 * ema(ema(close-0.5*(highest(q2)+lowest(q2)),r2),s2) / (0.5 * ema(ema(highest(q2)-lowest(q2),r2),s2))
sig2 = matype2=="ema" ? ema(smi2,nsig2) : matype2=="sma 2" ? sma(smi2,nsig2) : matype2=="wma 2" ? wma(smi2,nsig2) : matype2=="trima 2" ? trima2(smi2,nsig2) : matype2=="hma 2" ? hma2(smi2,nsig2) : matype=="dema 2" ? dema2(smi2,nsig2) : matype2=="tema 2" ? tema2(smi2,nsig2) : matype2=="zlema 2" ? zlema2(smi2,nsig2) : ema(smi2,nsig2)

p_smi2 = plot(smi2, title="SMI 2", color=aqua)
p_sig2 = plot(sig2, title="Signal2", color=red)

// plotchar(crossover(smi2, sig2), title= "low2", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi2, sig2), title= "high2", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////3
q3 = input(5, title="%K Length 3")
r3 = input(3, title="%K Smoothing Length 3")
s3 = input(3, title="%K Double Smoothing Length 3")
nsig3 = input(10, title="Signal Length 3")
matype3 = input("ema", title="Signal MA Type 3")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought3 = input(40, title="Overbought Level 3", type=float)
oversold3 = input(-40, title="Oversold Level 3", type=float)

trima3(src3, length3) => sma(sma(src3,length3),length3)
hma3(src3, length3) => wma(2*wma(src3, length3/2)-wma(src3, length3), round(sqrt(length3)))
dema3(src3, length3) => 2*ema(src3,length3) - ema(ema(src3,length3),length3)
tema3(src3, length3) => (3*ema(src3,length3) - 3*ema(ema(src3,length3),length3)) + ema(ema(ema(src3,length3),length3),length3)
zlema3(src3, length3) => ema(src3,length3) + (ema(src3,length3) - ema(ema(src3,length3),length3))

smi3 = 100 * ema(ema(close-0.5*(highest(q3)+lowest(q3)),r3),s3) / (0.5 * ema(ema(highest(q3)-lowest(q3),r3),s3))
sig3 = matype3=="ema" ? ema(smi3,nsig3) : matype3=="sma 3" ? sma(smi3,nsig3) : matype3=="wma 3" ? wma(smi3,nsig3) : matype3=="trima 3" ? trima3(smi3,nsig3) : matype3=="hma 3" ? hma3(smi3,nsig3) : matype=="dema 3" ? dema3(smi3,nsig3) : matype3=="tema 3" ? tema3(smi3,nsig3) : matype3=="zlema 3" ? zlema3(smi3,nsig3) : ema(smi3,nsig3)

p_smi3 = plot(smi3, title="SMI 3", color=aqua)
p_sig3 = plot(sig3, title="Signal3", color=red)

// plotchar(crossover(smi3, sig3) and crossover(smi2, sig2) and crossover(smi, sig), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi3, sig3) and crossunder(smi2, sig2) and crossunder(smi, sig), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)
plotchar (((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
plotchar (((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)

// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

longCondition = ((smi3 < sig3) and (smi2 < sig2) and (smi < sig))
shortCondition = ((smi3 > sig3) and (smi2 > sig2) and (smi > sig))

// buy = longCondition == 1 and longCondition[1] == 1 ? longCondition : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// === ALERTS ===
strategy.entry("L", strategy.long, when=buy)

strategy.entry("S", strategy.short, when=sell)

alertcondition(((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title='Low Fib.', message='Low Fib. Buy')
alertcondition(((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title='High Fib.', message='High Fib. Low')