Esta estrategia utiliza principalmente promedios móviles duales como señales de compra y venta para beneficiarse de las reversiones de tendencia.
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:
Las ventajas de esta estrategia son:
También hay algunos riesgos:
Para hacer frente a los riesgos:
La estrategia puede optimizarse aún más en los siguientes ámbitos:
Añadir otros filtros como RSI para la entrada de múltiples condiciones, evitando las roturas falsas.
Optimiza los períodos de MA para encontrar la mejor mezcla de parámetros.
Optimizar el rango de stop loss a través del cálculo de backtest para encontrar el rango óptimo.
Establecer la lógica de reingreso después de la salida de stop loss para reducir la frecuencia de las operaciones.
Combinar con el indicador de tendencia para pausar la negociación cuando la tendencia no está clara.
Se añadirá el tamaño de las posiciones y el stop loss dinámico basado en las condiciones del mercado.
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)