
La estrategia del ciclo aleatorio de Ells es una estrategia de negociación cuantitativa que utiliza el indicador del ciclo aleatorio de Ells para generar señales de negociación. La estrategia combina las ventajas de los indicadores aleatorios y los indicadores periódicos para aprovechar las oportunidades periódicas en el mercado.
La estrategia primero construye un indicador de ciclo suavizado, y luego construye un valor de indicador aleatorio basado en este indicador. La generación de la señal de negociación se determina según el cruce de las medias móviles de este valor de indicador aleatorio.
Concretamente, el método de cálculo de un indicador de ciclo suavizado es el siguiente:
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
El src es la entrada de datos de precios, como el precio de cierre. El indicador combina el precio actual y el precio de los 3 períodos anteriores para construir una señal de ciclo suave.
Basado en este indicador suavizado, se puede calcular el ciclo de indicadores aleatorios:
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) *
(smooth - 2 * smooth[1] + smooth[2]) +
2 * (1 - alpha) * cycle[1] -
(1 - alpha) * (1 - alpha) * cycle[2]
La fórmula de cálculo incluye el diferencial de segundo grado de la señal de ciclo después de la suavización, y los valores de los dos ciclos anteriores. α es el factor de suavización, que ajusta el peso de los valores de ciclo nuevo y viejo.
Finalmente, se calcula un valor aleatorio de 0-100 de este indicador de ciclo, y se construye un valor de señal basado en el promedio móvil de 10 días de valor 1. Se emite una señal de transacción cuando la señal se cruza o se desliza por encima de la media móvil.
La estrategia combina los indicadores aleatorios y los periódicos, combinando las ventajas de ambos. En comparación con las estrategias de tendencia como las simples medias móviles, la estrategia puede capturar mejor las oportunidades periódicas y, por lo tanto, obtener mejores resultados.
Las principales ventajas son:
El principal riesgo de esta estrategia es:
El riesgo se puede controlar mediante la configuración de parámetros de optimización, la configuración de puntos de parada y la combinación de otros indicadores de filtrado.
La estrategia también puede ser optimizada en las siguientes direcciones:
La estrategia de los ciclos aleatorios de Ells combina las ventajas de los indicadores aleatorios y los indicadores periódicos, controlando el riesgo de manera efectiva con un diseño de doble señal y obteniendo mejores ganancias en mercados con mayor periodicidad. Si se optimiza aún más, la estrategia puede convertirse en una estrategia de comercio cuantitativa recomendable.
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Stochastic Cyber Cycle Strategy",overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
src = input(hl2, title = "Source")
alpha = input(.07, title = "Alpha")
lag = input(9, title = "Lag")
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
len = input(8, title = "Stochastic len")
cycle = na
if na(cycle[7])
cycle := (src - 2 * src[1] + src[2]) / 4
else
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * (smooth - 2 * smooth[1] + smooth[2]) + 2 * (1 - alpha) * cycle[1] - (1 - alpha) * (1 - alpha) * cycle[2]
value1 = stoch(cycle, cycle, cycle, len) / 100
value2 = 2 * ((4 * value1 + 3 * value1[1] + 2 * value1[2] + value1[3]) / 10 - 0.5)
signal = value2
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
barsSinceEntry := 0
if (crossover(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossunder(signal, signal[1]))
strategy.entry("Long", strategy.long)
barsSinceEntry := 0
if (crossunder(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossover(signal, signal[1]))
strategy.entry("Short", strategy.short)
barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
strategy.close_all()
barsSinceEntry := 0
plot(0, title="ZeroLine", color=gray)
plotSrc = signal
cyclePlot = plot(plotSrc, title = "CyberCycle", color = blue)
triggerPlot = plot(plotSrc[1], title = "Trigger", color = green)
fill(cyclePlot, triggerPlot, color = plotSrc < plotSrc[1] ? red : lime, transp = 50)