Estrategia de inversión de la media móvil doble

El autor:¿ Qué pasa?, Fecha: 2023-10-24 10:56:08
Las etiquetas:

img

Resumen general

Esta estrategia utiliza principalmente promedios móviles duales como señales de compra y venta para beneficiarse de las reversiones de tendencia.

Estrategia lógica

La estrategia establece primero dos promedios móviles, uno de 20 días de MA a corto plazo y otro de 60 días de MA a largo plazo.

Específicamente, cuando el MA a corto plazo cruza por encima del MA a largo plazo, indica una tendencia alcista, así que vaya largo.

El método de stop loss después de ir largo o corto es el trailing stop basado en el precio más alto y el precio más bajo para obtener el máximo beneficio.

La lógica principal del código es:

  1. Calcular la EMA de 20 días y la EMA de 60 días
  2. Juzgar si la EMA de 20 días se cruza por encima de la EMA de 60 días, si es así ir largo
  3. Juzgar si la EMA de 20 días se cruza por debajo de la EMA de 60 días, si es así, corta
  4. Después de ir largo, establecer un stop loss al 3% por debajo del precio más alto
  5. Después de ir corto, establecer un stop loss del 3% por encima del precio más bajo
  6. Seguir ajustando el stop loss cuando esté en posiciones

Análisis de ventajas

Las ventajas de esta estrategia son:

  1. Una lógica sencilla, fácil de implementar.
  2. El doble MA puede filtrar eficazmente las roturas falsas.
  3. El trailing stop bloquea en el máximo beneficio.
  4. Puede capturar señales oportunas cuando la tendencia cambia.
  5. Control adecuado del descenso, relativamente estable.

Análisis de riesgos

También hay algunos riesgos:

  1. Los intercambios entre los MAs se cruzan con frecuencia cuando la tendencia no es clara, lo que conduce a pérdidas excesivas.
  2. La configuración incorrecta de stop loss puede ser demasiado floja o demasiado agresiva.
  3. La configuración de parámetros incorrectos como la longitud del período puede perder señales clave.
  4. Los altos costos comerciales erosionan el margen de ganancia.

Para hacer frente a los riesgos:

  1. Adopte filtros cuando la tendencia no sea clara para evitar el comercio a ciegas.
  2. Prueba y optimiza el rango de pérdida de parada para un ajuste adecuado.
  3. Encontrar parámetros óptimos a través de pruebas de retroceso y ajuste.
  4. Reducir el tamaño de la posición para reducir los costes de negociación.

Ideas de optimización

La estrategia puede optimizarse aún más en los siguientes ámbitos:

  1. Añadir otros filtros como RSI para la entrada de múltiples condiciones, evitando las roturas falsas.

  2. Optimiza los períodos de MA para encontrar la mejor mezcla de parámetros.

  3. Optimizar el rango de stop loss a través del cálculo de backtest para encontrar el rango óptimo.

  4. Establecer la lógica de reingreso después de la salida de stop loss para reducir la frecuencia de las operaciones.

  5. Combinar con el indicador de tendencia para pausar la negociación cuando la tendencia no está clara.

  6. Se añadirá el tamaño de las posiciones y el stop loss dinámico basado en las condiciones del mercado.

Resumen de las actividades

En resumen, la estrategia de reversión de doble MA es simple y práctica en general, identificando puntos de inflexión de tendencia a través de cruces de doble MA. Pero hay riesgos que necesitan ajuste de parámetros, optimización de stop loss y adición de filtros para maximizar la eficacia de la estrategia.


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


//@version=2
strategy("Noro's Bands Scalper Strategy v1.4", shorttitle = "Scalper str 1.4", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
takepercent = input(0, defval = 0, minval = 0, maxval = 1000, title = "take, %")
needbe = input(true, defval = true, title = "Bands Entry")
needct = input(false, defval = false, title = "Counter-trend entry")
needdb = input(true, defval = true, title = "Double Body")
len = input(20, defval = 20, minval = 2, maxval = 200, title = "Period")
needbb = input(true, defval = true, title = "Show Bands")
needbg = input(true, defval = true, title = "Show Background")
src = close

//PriceChannel 1
lasthigh = highest(src, len)
lastlow = lowest(src, len)
center = (lasthigh + lastlow) / 2

//Distance
dist = abs(src - center)
distsma = sma(dist, len)
hd = center + distsma
ld = center - distsma
hd2 = center + distsma * 2
ld2 = center - distsma * 2

//Trend
trend = close < ld and high < center ? -1 : close > hd and low > center ? 1 : trend[1]

//Lines
colo = needbb == false ? na : black
plot(hd2, color = colo, linewidth = 1, transp = 0, title = "High band 2")
plot(hd, color = colo, linewidth = 1, transp = 0, title = "High band 1")
plot(center, color = colo, linewidth = 1, transp = 0, title = "center")
plot(ld, color = colo, linewidth = 1, transp = 0, title = "Low band 1")
plot(ld2, color = colo, linewidth = 1, transp = 0, title = "Low band 2")

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Body
body = abs(close - open)
smabody = needdb == false ? ema(body, 30) : ema(body, 30) * 2
candle = high - low

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up7 = trend == 1 and ((bar == -1 and bar[1] == -1) or (body > smabody and bar == -1)) ? 1 : 0
dn7 = trend == 1 and ((bar == 1 and bar[1] == 1) or (close > hd and needbe == true)) and close > strategy.position_avg_price * (100 + takepercent) / 100 ? 1 : 0
up8 = trend == -1 and ((bar == -1 and bar[1] == -1) or (close < ld2 and needbe == true)) and close < strategy.position_avg_price * (100 - takepercent) / 100 ? 1 : 0
dn8 = trend == -1 and ((bar == 1 and bar[1] == 1) or (body > smabody and bar == 1)) ? 1 : 0

if up7 == 1 or up8 == 1 
    strategy.entry("Long", strategy.long, needlong == false ? 0 : trend == -1 and needct == false ? 0 : na)

if dn7 == 1 or dn8 == 1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : trend == 1 and needct == false ? 0 : na)

Más.