Tendencia siguiendo una estrategia basada en el cruce de la media móvil

El autor:¿ Qué pasa?, Fecha: 2023-10-24 11:02:52
Las etiquetas:

img

Resumen general

Esta estrategia utiliza principalmente la cruz de oro y la cruz muerta de los promedios móviles y el avance de las medias móviles para tomar decisiones largas y cortas. Se hace largo cuando el promedio móvil de corto período cruza el promedio móvil de largo período y se hace corto cuando el promedio móvil de corto período cruza por debajo del promedio móvil de largo período.

Principios

  1. Calcular dos medias móviles, EMA1 y EMA2, con períodos diferentes.

  2. Determinar si la EMA1 cruza la EMA2, si es así, ir largo.

  3. Determinar si la EMA1 se cruza por debajo de la EMA2, si es así, corta.

  4. Determinar si el precio de cierre rompe la EMA1 como señal de entrada.

  5. Mecanismo de salida: establecer un stop loss fijo o utilizar el canal Donchian para establecer un stop loss.

Principales funciones utilizadas:

  • ema ((): calcular la media móvil exponencial
  • cruce ((): determinar si la EMA1 cruza la EMA2
  • crossunder ((): determinar si la EMA1 se cruza por debajo de la EMA2
  • elevación (() / caída ((): determinar si el precio está subiendo o bajando
  • valuewhen(): devuelve valores diferentes basados en la condición

Ventajas

  1. Lógica sencilla, fácil de entender e implementar.

  2. Utilice el rasgo de tendencia siguiente de las medias móviles para realizar un seguimiento efectivo de las tendencias.

  3. La combinación de la brecha de precio cerrado de la vela ayuda a evitar las brechas falsas.

  4. Uso flexible de diferentes combinaciones de medias móviles adaptables a diferentes períodos.

  5. El mecanismo de stop loss controla el riesgo.

Los riesgos

  1. Las frecuentes cruces de oro y cruces muertas durante la consolidación del mercado causan problemas.

  2. Los puntos de stop loss fijos pueden ser demasiado rígidos para ajustarse en función de los cambios del mercado.

  3. Las medias móviles se retrasan y pueden perder señales de reversión en los puntos de inflexión.

  4. Un juicio preciso de la pendiente media móvil necesaria para filtrar los falsos avances.

  5. La selección de parámetros requiere precaución, la frecuencia inadecuada o el retraso pueden afectar el rendimiento de la estrategia.

Optimización

  1. El cruce de la línea cero del MACD puede ayudar a determinar las tendencias y a filtrar las consolidaciones.

  2. Añadir el canal Donchian para la línea de stop loss dinámico para mejorar la stop loss fija.

  3. Añadir bandas de Bollinger para juzgar tendencias fuertes o débiles, evitando operaciones ineficaces durante las consolidaciones del mercado.

  4. Optimizar las combinaciones de parámetros de la media móvil y probar el rendimiento real de diferentes estrategias de período.

  5. Considere la posibilidad de añadir medias móviles ancladas para reducir el retraso.

Conclusión

La lógica general de esta estrategia es simple y clara, utilizando técnicas clásicas de negociación de cruce de promedios móviles, y combinando la ruptura de candlestick para la entrada para filtrar eficazmente señales falsas.


/*backtest
start: 2023-09-01 00:00:00
end: 2023-10-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title='Mega crypto bot strategy', shorttitle='megacryptobot_Strategy', overlay=true, pyramiding=0, initial_capital=10000, currency=currency.USD)

//Candle body resistance Channel-----------------------------//
len = 34
src = input(close, title="Candle body resistance Channel")
out = sma(src, len)
last8h = highest(close, 13)
lastl8 = lowest(close, 13)
bearish = cross(close,out) == 1 and falling(close, 1)
bullish = cross(close,out) == 1 and rising(close, 1)
channel2=input(false, title="Bar Channel On/Off")
ul2=plot(channel2?last8h:last8h==nz(last8h[1])?last8h:na, color=black, linewidth=1, style=linebr, title="Candle body resistance level top", offset=0)
ll2=plot(channel2?lastl8:lastl8==nz(lastl8[1])?lastl8:na, color=black, linewidth=1, style=linebr, title="Candle body resistance level bottom", offset=0)
//fill(ul2, ll2, color=black, transp=95, title="Candle body resistance Channel")

//-----------------Support and Resistance 
RST = input(title='Support / Resistance length:',  defval=10) 
RSTT = valuewhen(high >= highest(high, RST), high, 0)
RSTB = valuewhen(low <= lowest(low, RST), low, 0)
RT2 = plot(RSTT, color=RSTT != RSTT[1] ? na : red, linewidth=1, offset=+0)
RB2 = plot(RSTB, color=RSTB != RSTB[1] ? na : green, linewidth=1, offset=0)

//--------------------Trend colour ema------------------------------------------------// 
src0 = close, len0 = input(13, minval=1, title="EMA 1")
ema0 = ema(src0, len0)
direction = rising(ema0, 2) ? +1 : falling(ema0, 2) ? -1 : 0
plot_color = direction > 0  ? lime: direction < 0 ? red : na
plot(ema0, title="EMA", style=line, linewidth=1, color = plot_color)

//-------------------- ema 2------------------------------------------------//
src02 = close, len02 = input(21, minval=1, title="EMA 2")
ema02 = ema(src02, len02)
direction2 = rising(ema02, 2) ? +1 : falling(ema02, 2) ? -1 : 0
plot_color2 = direction2 > 0  ? lime: direction2 < 0 ? red : na
plot(ema02, title="EMA Signal 2", style=line, linewidth=1, color = plot_color2)

//=============Hull MA//
show_hma = input(false, title="Display Hull MA Set:")
hma_src = input(close, title="Hull MA's Source:")
hma_base_length = input(8, minval=1, title="Hull MA's Base Length:")
hma_length_scalar = input(5, minval=0, title="Hull MA's Length Scalar:")
hullma(src, length)=>wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
plot(not show_hma ? na : hullma(hma_src, hma_base_length+hma_length_scalar*6), color=black, linewidth=2, title="Hull MA")

//============ signal Generator ==================================//
period = input('720')
ch1 = request.security(syminfo.tickerid, period, open)
ch2 = request.security(syminfo.tickerid, period, close)
longCondition = crossover(request.security(syminfo.tickerid, period, close),request.security(syminfo.tickerid, period, open))
if (longCondition)
    strategy.entry("BUY", strategy.long)
shortCondition = crossunder(request.security(syminfo.tickerid, period, close),request.security(syminfo.tickerid, period, open))
if (shortCondition)
    strategy.entry("SELL", strategy.short)

///////////////////////////////////////////////////////////////////////////////////////////

Más.