EMA de precios con optimización estocástica basada en el aprendizaje automático

El autor:¿ Qué pasa?, fecha: 2024-01-26 14:57:08
Las etiquetas:

img

Resumen general

Esta estrategia combina el promedio móvil suave con el indicador estocástico para capturar más oportunidades en las tendencias. Utiliza principalmente dos promedios móviles exponenciales con diferentes períodos para generar señales de negociación, junto con el cruce de la línea K y la línea D en el indicador estocástico para la selección del momento de entrada, con el fin de obtener una mayor rentabilidad en las tendencias.

Principio de la estrategia

La estrategia utiliza promedios móviles suaves de 12 y 26 períodos. Cuando la línea rápida cruza por encima de la línea lenta desde abajo, vaya largo. Cuando la línea rápida cruza por debajo de la línea lenta desde arriba, vaya corto. Para filtrar señales falsas, requiere que las líneas rápidas y lentas estén en la misma dirección, con la línea rápida por encima de la línea lenta para largo, y la línea rápida por debajo de la línea lenta para corto.

El cruce de la línea K y la línea D en el indicador estocástico se utiliza para la selección del momento de entrada. Cuando la línea K cruza por encima de la línea D desde debajo de la línea de sobrecompra, vaya largo. Cuando la línea K cruza por debajo de la línea D desde encima de la línea de sobreventa, vaya corto.

La media móvil fluida determina la dirección de la tendencia, mientras que el indicador estocástico filtra el ruido y selecciona el momento de entrada.

Ventajas de la estrategia

  • La media móvil suave en sí tiene la característica de seguir tendencias, fácil de rastrear tendencias
  • Utilice Stochastic para filtrar el ruido y mejorar la rentabilidad
  • La combinación de MA rápidos y lentos permite entrar cuando el MA rápido retrocede hacia el MA lento, obteniendo un mejor riesgo-recompensa
  • El cruce de la línea K y la línea D proporciona una mayor optimización del tiempo

Por lo tanto, esta estrategia podría seguir la tendencia de manera selectiva para aprovechar las oportunidades, obteniendo una mayor rentabilidad.

Análisis de riesgos

  • Alto riesgo de salida prematura en el corto plazo. Las señales pueden ser negadas o atrapadas cuando el MA rápido retrocede a un MA lento
  • Como sigue la tendencia, no puede adaptarse rápidamente a una inversión drástica de la tendencia, lo que conduce a grandes pérdidas.

Para reducir esos riesgos, podríamos establecer un stop loss, o adoptar parámetros MA más moderados.

Direcciones de optimización

La estrategia podría optimizarse aún más en los siguientes aspectos:

  1. Prueba de diferentes combinaciones de parámetros de MA para encontrar el óptimo
  2. Prueba de diferentes combinaciones de parámetros estocásticos
  3. Añadir una estrategia de stop loss
  4. Añadir un stop loss dinámico basado en la volatilidad
  5. Optimización de parámetros de ensayo en diferentes productos y plazos
  6. Utilice algoritmos de aprendizaje automático para optimizar parámetros

Además, las estrategias de stop loss podrían reducir eficazmente el riesgo y mejorar la estabilidad.

Conclusión

La estrategia integra los puntos fuertes de Smooth Moving Average y Stochastic para seguir la tendencia, al tiempo que selecciona un mejor momento de entrada. Es fácil de operar, con riesgo controlable y gran valor práctico. Su rendimiento podría mejorarse aún más a través de pruebas y optimización continuas. Proporciona a los comerciantes cuánticos un modelo eficiente y estable de seguimiento de tendencias.


/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")

Más.