Estrategia cuantitativa de fluctuación de criptomonedas ALMA Cruzada MACD

El autor:¿ Qué pasa?, Fecha: 2023-12-05 10:24:34
Las etiquetas:

img

Resumen general

Esta estrategia se basa en las señales de cruz dorada y cruz muerta de las líneas de media móvil ALMA doble, combinadas con las señales largas y cortas del indicador MACD, para lograr posiciones largas y cortas automáticas.

Principio de la estrategia

La estrategia utiliza líneas rápidas y lentas construidas a partir de ALMA para construir el doble promedio móvil. La longitud de la línea rápida es de 20 y la línea lenta es de 40, ambas adoptando un desplazamiento de 0.9 y una desviación estándar de 5.

Al mismo tiempo, la estrategia incorpora la señal del histograma del indicador MACD. Sólo cuando el histograma MACD es positivo (ascendente), la señal larga es válida; sólo cuando el histograma MACD es negativo (caída), la señal corta es válida.

La estrategia también establece las condiciones de toma de ganancias y stop loss.

Análisis de ventajas

La estrategia combina el juicio de tendencia de la media móvil doble y el juicio de energía del indicador MACD, que puede filtrar eficazmente las señales falsas y mejorar la precisión de la entrada.

Los datos de backtest se adoptan desde 2017, cubriendo múltiples ciclos de conversión de toros y osos. La estrategia todavía tiene un buen rendimiento a través de los períodos. Esto demuestra que la estrategia se adapta a las características lineares y no lineares del mercado.

Análisis de riesgos

La estrategia tiene los siguientes riesgos:

  1. La doble media móvil en sí misma tiene un efecto retardante, posiblemente perdiendo oportunidades a corto plazo
  2. Cuando el histograma MACD es cero, la estrategia no generará señales
  3. Los ratios de toma de ganancias y stop loss están preestablecidos, pueden desviarse del mercado real

Soluciones:

  1. Acortar adecuadamente el ciclo de la media móvil para mejorar la sensibilidad a corto plazo
  2. Optimizar los parámetros MACD para hacer que la fluctuación del histograma sea más frecuente
  3. Ajuste dinámico de las configuraciones de toma de ganancias y stop loss

Direcciones de optimización

La estrategia también puede optimizarse en los siguientes aspectos:

  1. Pruebe diferentes tipos de promedios móviles para encontrar mejores efectos de suavización
  2. Optimizar los parámetros de las medias móviles y el MACD para adaptarse a diferentes productos y ciclos
  3. Añadir condiciones adicionales como cambios en el volumen de negociación a las señales de filtro
  4. Ajuste de las tasas de toma de ganancias y stop loss en tiempo real para una mejor adaptabilidad

Conclusión

La estrategia combina con éxito el juicio de tendencia de las medias móviles y el juicio auxiliar del MACD, y establece ganancias razonables y pérdidas de parada, que pueden obtener retornos estables en diversas condiciones de mercado.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © exlux99

//@version=4
strategy(title = "Full Crypto Swing Strategy ALMA Cross", overlay = true,  pyramiding=1,initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.03)

//time condition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//alma fast and slow
src = haClose
windowsize = input(title="Length Size Fast", type=input.integer, defval=20)
windowsize2 = input(title="Length Size Slow", type=input.integer, defval=40)
offset = input(title="Offset", type=input.float, defval=0.9, step=0.05)
sigma = input(title="Sigma", type=input.float, defval=5)
outfast=alma(src, windowsize, offset, sigma)
outslow=alma(src, windowsize2, offset, sigma)

//macd
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=25)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)

// Calculating
fast_ma = ema(src, fast_length)
slow_ma =  ema(src, slow_length)
macd = fast_ma - slow_ma
signal = ema(macd, signal_length)
hist = macd - signal

long=crossover(outfast,outslow) and hist > hist[1] and time_cond
short=crossunder(outfast,outslow) and hist < hist[1] and time_cond

takeProfit_long=input(2.0, step=0.005)
stopLoss_long=input(0.2, step=0.005)
takeProfit_short=input(0.05, step=0.005)
stopLoss_short=input(1.0, step=0.005)

strategy.entry("long",1,when=long)
strategy.entry("short",0,when=short)

strategy.exit("short_tp/sl", "long", profit=close * takeProfit_long / syminfo.mintick, loss=close * stopLoss_long / syminfo.mintick, comment='LONG EXIT',  alert_message = 'closeshort')
strategy.exit("short_tp/sl", "short", profit=close * takeProfit_short / syminfo.mintick, loss=close * stopLoss_short / syminfo.mintick, comment='SHORT EXIT',  alert_message = 'closeshort')

Más.