Estrategia de combinación basada en indicadores osciladores cuantitativos


Fecha de creación: 2024-02-27 16:46:42 Última modificación: 2024-02-27 16:46:42
Copiar: 3 Número de Visitas: 653
1
Seguir
1617
Seguidores

Estrategia de combinación basada en indicadores osciladores cuantitativos

Descripción general

Esta estrategia combina el índice de fluctuaciones elegantes de Ennes, el índice de ciclos de Ennes, la línea de tendencia instantánea de Ennes y el índice de coeficientes correlativos de la escala de Ennes-Spilman para formar una estrategia de comercio cuantitativa que capta todo el espectro de tendencias, fluctuaciones, dinámicas y características de los precios. La estrategia se llama estrategia combinada de indicadores de fluctuaciones cuantitativas.

Principio de estrategia

La estrategia se basa en cuatro indicadores clave:

En primer lugar, el Elastic Vibration Indicator de Ernst, que obtiene una línea de señal después de suavizar la media del índice, puede determinar la dirección y la intensidad de la tendencia actual. En segundo lugar, el Elastic Vibration Indicator de Ernst, puede identificar eficazmente los puntos bajos del ciclo y determinar si la tendencia principal se ha invertido. Una vez más, la línea de tendencia instantánea de Ernst sigue los promedios móviles rápidos para determinar la dirección de la tendencia a corto plazo.

Concretamente, los cuatro requisitos de entrada de la estrategia son: la línea de la señal de indicador de oscilación elegante y la línea de la señal de indicador de ciclo pasan al mismo tiempo hacia arriba; la línea original rompe la línea de ciclo hacia arriba; la línea original está por encima de la línea de tendencia instantánea ascendente; el coeficiente de correlación de la escala de Spielman es positivo.

Las condiciones de salida son mucho más sencillas, solo cuando la línea original cruza la línea de tendencia instantánea y se estabiliza.

Las condiciones de hacer vacío son similares a las condiciones de hacer más, solo que se puede invertir la condición de juicio.

Análisis de las ventajas

La mayor ventaja de esta estrategia es que la combinación de indicadores es adecuada, puede aprovechar eficazmente las ventajas de cada indicador, verificarse mutuamente y evitar falsos positivos, filtrando así una gran cantidad de ruido y haciendo que la señal sea más confiable.

Concretamente, el indicador de vibración elegante puede determinar la dirección y la intensidad de la tendencia, el indicador de ciclo puede determinar el punto de inflexión del ciclo, la línea de tendencia momentánea puede determinar la tendencia a corto plazo, el coeficiente de correlación de la escala de Spielman puede determinar la relación de precio de la cantidad. La combinación de los cuatro puede determinar completamente las características del mercado en términos de tendencia, ciclo, volumen y precio de la cantidad, lo que genera una señal de negociación de alta fiabilidad.

Además, la estrategia solo se refiere a la línea media, evita la interferencia del ruido del mercado a corto plazo y reduce las inversiones innecesarias. Al mismo tiempo, las señales de la estrategia son escasas y las reglas de salida son simples, lo que reduce considerablemente la frecuencia de las operaciones y evita el problema de las operaciones excesivas.

Análisis de riesgos

El mayor riesgo de esta estrategia reside en la falta de un mecanismo de parada de pérdidas. La imposibilidad de detenerse a tiempo cuando el mercado cambia drásticamente, lo que puede provocar una expansión de las pérdidas. Además, la falta de filtros adicionales, como el filtro del sistema marginal y el indicador de energía, puede provocar un cierto grado de falsos positivos.

Para minimizar estos riesgos, se puede configurar un punto de parada de seguridad, que se detiene automáticamente cuando los pérdidas superan una cierta proporción. Además, se puede agregar un indicador de volumen dinámico como el MACD para una segunda verificación, para evitar el riesgo de falsas rupturas.

Dirección de optimización

Esta estrategia puede ser optimizada en los siguientes aspectos:

  1. Incorporar un mecanismo de prevención de pérdidas. Calcular la retirada máxima según los datos de retroceso histórico y establecer el punto de parada correspondiente.

  2. Se añaden filtros. Se añaden indicadores como el MACD, el Brin Belt y otros para filtrar en varias capas, reduciendo aún más las señales falsas.

  3. Combinación de más períodos de tiempo. En la actualidad, solo hay un conjunto de parámetros, pero se pueden introducir más períodos de tiempo para mejorar la estabilidad mediante la verificación de múltiples ejes de tiempo.

  4. Parámetros de ajuste dinámico. Se añade un módulo de optimización de parámetros para ajustar dinámicamente los parámetros del indicador según las diferentes condiciones del mercado, lo que hace que la estrategia sea más adaptable.

  5. Arbitraje multi-variedad: aplicar estrategias a diferentes variedades para buscar oportunidades de arbitraje y controlar aún más el riesgo.

Resumir

Esta estrategia utiliza una combinación ingeniosa de los cuatro indicadores principales de Enel para formar una estrategia de negociación integral para juzgar la tendencia, el ciclo, la dinámica y el precio de medida. Su capacidad de filtrar el ruido es excelente y puede producir una señal de alta calidad.

Código Fuente de la Estrategia
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai

//@version=5
strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100)

// -- Inputs --
inp = input(title='Source', defval=close)
res = input.timeframe(title='Resolution', defval='')
bar = input(title='Allow Bar Color Change?', defval=true)
src = inp
length = input.int(title='Length', defval=20, minval=2, maxval=300)
rmsLength = input.int(title='Rms Length', defval=50, minval=2)
decyclerLength = length

// -- Calculation --
// Ehlers Elegant Oscillator
a1 = math.exp(-1.414 * math.pi / length)
b1 = 2 * a1 * math.cos(1.414 * math.pi / length)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3

deriv = src - nz(src[2])
rms = math.avg(math.pow(deriv, 2), rmsLength)
rms := rms != 0 ? math.sqrt(rms) : 0
nDeriv = rms != 0 ? deriv / rms : 0
iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0

ss = 0.0
ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2]))
ssSig = ta.wma(ss, length)

slo = ss - ssSig
sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0
eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black

hline(0)
plot(ssSig, title='EO', color=eoColor, linewidth=2)

// Ehlers Decycler
pi = 2 * math.asin(1)
twoPiPrd = 2 * pi / decyclerLength
alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd)

dec = 0.0
dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1]))

decyclerSig = src > dec ? 1 : src < dec ? -1 : 0
decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black
plot(dec, title='Decycler', color=decColor, linewidth=2)

// Ehlers Instantaneous Trendline
getItrend(src, alpha) =>
    Price = src
    Smooth = 0.0
    ITrend = 0.0
    Trigger = 0.0
    
    ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha  * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2])
    if(bar_index < 7)
        ITrend := (Price + 2 * Price[1] + Price[2]) / 4
    Trigger := 2 * ITrend - ITrend[2]
    [ITrend, Trigger]

itrendAlpha = 2 / (length + 1) / 2
[iT, Tr] = getItrend(src, itrendAlpha)

iTColor = Tr > iT ? color.aqua : color.maroon
plot(iT, 'Instantaneous Trend', iTColor, 2)

// Ehlers Spearman Rank
priceArray = array.new_float(300, 0.0)
rank = array.new_float(300, 0.0)
for i = 1 to length
    array.set(priceArray, i, nz(src[i - 1]))
    array.set(rank, i, i)

for i = 1 to length
    count = length + 1 - i
    for j = 1 to length - count
        if array.get(priceArray, j + 1) < array.get(priceArray, j)
            tempPrice = array.get(priceArray, j)
            tempRank = array.get(rank, j)
            array.set(priceArray, j, array.get(priceArray, j + 1))
            array.set(rank, j, array.get(rank, j + 1))
            array.set(priceArray, j + 1, tempPrice)
            array.set(rank, j + 1, tempRank)
         
sum = 0.0   
for i = 1 to length
    sum := sum + math.pow(i - array.get(rank, i), 2)
signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1)))))
spearmanSlo = signal - nz(signal[1])
spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0

// -- Signals --
bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0
bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0
bool exitLong = ta.crossunder(src[100], iT) 
bool exitShort = ta.crossover(src[100], iT)

barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray)

// -- Long Exits --
strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG')

// -- Short Exits --
strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT')

bool isStrategyEntryEnabled = true
// -- Long Entries --
if (isStrategyEntryEnabled)
    strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG')
else
    strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG')

// -- Short Entries --
if (isStrategyEntryEnabled)
    strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT')
else
    strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')