La estrategia de ruptura de tendencia de doble MA es una estrategia de negociación cuantitativa que utiliza dos promedios móviles de diferentes períodos para determinar la tendencia y generar señales de entrada.
La estrategia consta de las siguientes partes principales:
El juicio de la tendencia: Calcula el MA de 21 períodos, definido como el MA lento. Su posición es relativamente estable y se puede utilizar para juzgar la dirección general de la tendencia. Cuando los precios aumentan cerca de este MA, es una tendencia al alza. Cuando los precios caen cerca de este MA, es una tendencia a la baja.
Filtración de entradas: Calcula el MA de 5 períodos, definido como el MA rápido. Solo cuando el precio rompe tanto el MA lento como el MA rápido, se activa la señal de negociación. Este diseño filtra principalmente la posibilidad de fallas falsas.
Filtración de velas: La estrategia sólo va largo cuando la vela actual es bajista, o va corto cuando la vela actual es alcista. Esto considera que el uso de barras de reversión para la entrada puede obtener una mayor tasa de éxito. También combina el indicador RSI rápido para evitar entrar en áreas de sobrecompra o sobreventa.
El filtro piramidal: Para el mercado de cifrado, la estrategia incluye además una condición de ruptura de volatilidad de triplicación para capturar oportunidades de sobreventa en tendencias bajistas significativas.
Detener pérdida: La estrategia admite movimientos de stop loss. Después de abrir posiciones, el stop loss se actualizará en tiempo real en función del porcentaje establecido.
Las ventajas de esta estrategia incluyen:
La estrategia también tiene algunos riesgos:
Para hacer frente a estos riesgos, se pueden realizar optimizaciones en los siguientes aspectos:
Los principales aspectos para optimizar esta estrategia incluyen:
Optimización de parámetros: Prueba sistemática de retroceso para encontrar combinaciones óptimas de períodos de MA rápidos y lentos para mejorar los rendimientos ajustados al riesgo.
Reconocimiento de patrones: Agregue otros indicadores como KDJ, MACD para identificar señales de reversión más confiables.
Optimización de pérdidas: Desarrollar algoritmos de stop loss flotantes o atrasados para reducir la posibilidad de ser detenido.
Aprendizaje automático: Recopilar y etiquetar más datos históricos para generar automáticamente reglas de negociación utilizando ML.
Tamaño de la posición: Ajuste dinámico del tamaño de las posiciones en función de las condiciones del mercado.
La estrategia de ruptura de tendencia de doble MA es generalmente una estrategia de seguimiento de tendencias simple y práctica. En comparación con los algoritmos de aprendizaje automático complejos, esta estrategia es más fácil de interpretar y dominar, con mayor confiabilidad. Con el ajuste de parámetros, la expansión de características y el aumento de ML, esta estrategia tiene un gran potencial de mejora y es un gran punto de partida para el comercio cuantitativo.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "Noro's Trend MAs Strategy v2.0 +CB", shorttitle = "Trend MAs str 2.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0) //Settings needlong = input(true, "long") needshort = input(true, "short") needstops = input(false, "stops") stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %") useohlc4 = input(false, defval = false, title = "Use OHLC4") usefastsma = input(true, "Use fast MA Filter") fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period") slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period") bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q") needbg = input(false, defval = false, title = "Need trend Background?") needarr = input(false, defval = false, title = "Need entry arrows?") needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)") src = useohlc4 == true ? ohlc4 : close //PriceChannel 1 lasthigh = highest(src, slowlen) lastlow = lowest(src, slowlen) center = (lasthigh + lastlow) / 2 //PriceChannel 2 lasthigh2 = highest(src, fastlen) lastlow2 = lowest(src, fastlen) center2 = (lasthigh2 + lastlow2) / 2 //Trend trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1] //Bars bar = close > open ? 1 : close < open ? -1 : 0 redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0 greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0 //Fast RSI fastup = rma(max(change(close), 0), 2) fastdown = rma(-min(change(close), 0), 2) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //CryptoBottom mac = sma(close, 10) len = abs(close - mac) sma = sma(len, 100) max = max(open, close) min = min(open, close) up3 = close < open and len > sma * 3 and min < min[1] and fastrsi < 10 ? 1 : 0 //Signals up = trend == 1 and (low < center2 or usefastsma == false) and (redbars == 1) ? 1 : 0 dn = trend == -1 and (high > center2 or usefastsma == false) and (greenbars == 1) ? 1 : 0 up2 = high < center and high < center2 and bar == -1 ? 1 : 0 dn2 = low > center and low > center2 and bar == 1 ? 0 : 0 //Lines plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA") plot(center2, color = red, linewidth = 3, transp = 0, title = "PriceChannel 2") //Arrows plotarrow(up == 1 and needarr == true ? 1 : 0, colorup = black, colordown = black, transp = 0) plotarrow(dn == 1 and needarr == true ? -1 : 0, colorup = black, colordown = black, transp = 0) //Background col = needbg == false ? na : trend == 1 ? lime : red bgcolor(col, transp = 90) //Alerts alertcondition(up == 1, title='buy', message='Uptrend') alertcondition(dn == 1, title='sell', message='Downtrend') //Trading stoplong = up == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1] stopshort = dn == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1] longCondition = up == 1 or (up2 == 1 and needex == true) or up3 == 1 if (longCondition) strategy.entry("Long", strategy.long, needlong == false ? 0 : na) strategy.exit("Stop Long", "Long", stop = stoplong) shortCondition = dn == 1 if (shortCondition) strategy.entry("Short", strategy.short, needshort == false ? 0 : na) strategy.exit("Stop Short", "Short", stop = stopshort)