Un sistema de análisis integral de múltiples indicadores que combina VAWSI y una estrategia de reversión de persistencia de tendencias con un cálculo de longitud dinámico

VAWSI ATR RSI WMA SMA RMA
Fecha de creación: 2024-06-21 15:36:43 Última modificación: 2024-06-21 15:36:43
Copiar: 4 Número de Visitas: 274
1
Seguir
1166
Seguidores

Un sistema de análisis integral de múltiples indicadores que combina VAWSI y una estrategia de reversión de persistencia de tendencias con un cálculo de longitud dinámico

Descripción general

La estrategia es un sistema de análisis integrado de varios indicadores, basado principalmente en el VAWSI (índice de volumen y fuerza ponderada ATR), el indicador de continuidad de tendencias y la versión modificada de ATR para juzgar la tendencia del mercado y los posibles puntos de reversión. La estrategia también introduce el cálculo de la longitud de la dinámica para adaptarse a las diferentes condiciones del mercado.

El núcleo de la estrategia consiste en medir la intensidad, duración y volatilidad de las tendencias del mercado a través de una serie de indicadores personalizados para encontrar el mejor momento de negociación. Es especialmente adecuado para mercados con tendencias evidentes, pero también incluye mecanismos de adaptación para tratar diferentes estados del mercado.

Principio de estrategia

  1. Indicador VAWSI: es un indicador original, similar al RSI, pero que utiliza el VAWMA (medios móviles ponderados por volumen y ATR) en lugar del RMA.

  2. Indicador de continuidad de tendencia: otro indicador original, utilizado para medir la duración de una tendencia. Calcula la máxima desviación de los datos de origen con respecto a los puntos más altos/más bajos dentro de una longitud específica, y luego acumula esta desviación y crea un índice de intensidad.

  3. La versión modificada de ATR: toma el valor máximo de la fuente de datos anterior, y luego toma el valor absoluto de su cambio y se unifica con los datos de la fuente.

  4. Cálculo de la longitud dinámica: el método de cálculo de la longitud dinámica de BlackCat1402 se utiliza para ajustar los parámetros de longitud del indicador en función de las condiciones del mercado.

  5. Análisis integrado: combina las lecturas del VAWSI, la continuidad de la tendencia y el ATR para generar un indicador integrado. Un valor final más bajo indica una reversión inminente y un valor más alto indica inestabilidad o agitación en el mercado.

  6. Dinámica de pérdidas y ganancias: los niveles de pérdidas y ganancias dinámicas se calculan en función del indicador integral y la dirección de la tendencia actual.

  7. Señales de negociación: cuando el precio cruza completamente la línea de brecha calculada, el sistema confirma el cruce y genera una señal de negociación.

Ventajas estratégicas

  1. Análisis multidimensional: mediante la combinación de varios indicadores, las estrategias pueden analizar el mercado desde diferentes perspectivas, mejorando la precisión de los juicios.

  2. Adaptabilidad: El cálculo de la longitud dinámica permite que las estrategias se adapten a diferentes condiciones del mercado, lo que aumenta la flexibilidad de las estrategias.

  3. Gestión de riesgos: la configuración de stop loss dinámico y la de beneficio ayudan a controlar mejor el riesgo y adaptarse a los cambios en el mercado.

  4. Indicadores originales: el VAWSI y el indicador de continuidad de tendencias ofrecen una visión única del mercado que puede captar señales que los indicadores tradicionales ignoran.

  5. Previene el rediseño: el uso de barstate.isconfirmed asegura que la señal no sea rediseñada, lo que mejora la precisión de la detección.

  6. Personalización: Se pueden ajustar varios parámetros para que la estrategia se adapte a diferentes variedades de transacciones y marcos de tiempo.

Riesgo estratégico

  1. Optimización excesiva: un gran número de parámetros puede conducir a una optimización excesiva, que no funciona bien en las operaciones en disco.

  2. Adaptabilidad al mercado: Aunque se desempeña bien en algunos mercados, puede no ser aplicable a todas las condiciones del mercado, especialmente en mercados con menor volatilidad.

  3. Complejidad: La complejidad de las estrategias puede hacer que sean difíciles de entender y mantener, lo que aumenta el riesgo de errores operativos.

  4. Computación intensiva: múltiples indicadores personalizados y cálculos dinámicos pueden causar una mayor carga de cálculo que afecta la velocidad de ejecución.

  5. Depende de los datos históricos: la estrategia utiliza una gran cantidad de datos históricos para realizar los cálculos, lo que en algunos casos puede causar un retraso.

Dirección de optimización

  1. Optimización de parámetros: Utiliza algoritmos de aprendizaje automático para optimizar varios parámetros de peso y longitud para mejorar el rendimiento de la estrategia en diferentes condiciones de mercado.

  2. Reconocimiento de estado de mercado: añade un módulo de reconocimiento de estado de mercado para ajustar automáticamente los parámetros de la estrategia en diferentes entornos de mercado.

  3. Filtración de señales: introducción de mecanismos de filtración adicionales, como el límite de la intensidad de la tendencia, para reducir las señales falsas.

  4. Análisis del volumen de tránsito: profundizar en el análisis del volumen de tránsito, con la posibilidad de introducir la identificación de la forma de tránsito para aumentar la fiabilidad de la señal.

  5. Análisis de varios marcos de tiempo: integración de señales de varios marcos de tiempo para mejorar la solidez de las decisiones comerciales.

  6. Optimización de la gestión de riesgos: Implementación de estrategias de gestión de riesgos más complejas, como el dimensionamiento dinámico de posiciones y el stop loss en varios niveles.

  7. Eficiencia de cálculo: optimización del código para aumentar la eficiencia de cálculo, especialmente cuando se trata de grandes cantidades de datos históricos.

Resumir

El VAWSI y la estrategia de reversión de tendencia continua es un sistema de negociación complejo y completo, que combina múltiples indicadores de innovación y ajustes de parámetros dinámicos. Su ventaja radica en el análisis de mercado multidimensional y la autoadaptación, que le permite buscar oportunidades de reversión potenciales en diferentes condiciones de mercado. Sin embargo, la complejidad de la estrategia también conlleva desafíos de optimización excesiva y adaptabilidad.

La estrategia tiene el potencial de convertirse en una poderosa herramienta de negociación mediante una optimización adicional, especialmente en la regulación de parámetros, la identificación del estado del mercado y la gestión del riesgo. Sin embargo, los usuarios deben tener en cuenta que ninguna estrategia es perfecta y que es necesario un monitoreo y ajuste continuos. En aplicaciones reales, se recomienda realizar pruebas adecuadas en cuentas simuladas y combinar con otras herramientas de análisis y conocimiento del mercado para tomar decisiones comerciales.

Código Fuente de la Estrategia
/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)


//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)

//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
    // Vars: 
    Smooth = 0.00
    Detrender = 0.00
    I1 = 0.00
    Q1 = 0.00
    jI = 0.00
    jQ = 0.00
    I2 = 0.00
    Q2 = 0.00
    Re = 0.00
    Im = 0.00
    Period = 0.00
    SmoothPeriod = 0.00
    pi = 2 * math.asin(1)
    DomCycle = 0.0

    //Hilbert Transform
    Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
    Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
    //Compute InPhase and Quadrature components
    Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
    I1 := bar_index > 5 ? nz(Detrender[3]) : I1

    //Advance the phase of I1 and Q1 by 90 degrees
    jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
    jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)

    //Phasor addition for 3 bar averaging
    I2 := I1 - jQ
    Q2 := Q1 + jI

    //Smooth the I and Q components before applying the discriminator
    I2 := .2 * I2 + .8 * nz(I2[1])
    Q2 := .2 * Q2 + .8 * nz(Q2[1])

    //Homodyne Discriminator
    Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
    Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
    Re := .2 * Re + .8 * nz(Re[1])
    Im := .2 * Im + .8 * nz(Im[1])

    Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
    Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
    Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
    //Limit Period to be within the bounds of 6 bar and 50 bar cycles
    Period := Period < 6 ? 6 : Period
    Period := Period > 50 ? 50 : Period
    Period := .2 * Period + .8 * nz(Period[1])
    SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
    //it can add filter to Period here
    DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
    DomCycle

wma(src, length) =>
    wma = 0.0
    sum = 0.0
    norm = length * (length + 1) / 2
    for i = 0 to length - 1
        sum := sum + src[i] * (length - i)
    wma := sum / norm


length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))

// Traditional Function initialization
highest_custom(src, length) =>
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] > x
            x := src[i]
    x
lowest_custom(src, length) => 
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] < x
            x := src[i]
    x

rma(src, len) =>
    sum = 0.0
    for i = 0 to len - 1
        math.min(1, len)
        sum += src[i]
    rma = sum / len
    rma := nz(rma[1]) * (len - 1) / len + src / len
    
sma(src, length) =>
    math.sum(src, length) / length

hln(src, length) =>
    TR = math.max(math.abs(src - src[1]), high - low)
    TR := src / math.abs(ta.change(rma(TR, length)))
    TR := (1 / TR) * 100

vawma(src, length) =>
    atr = ta.atr(1)
    aavg = sma(atr, length)
    vavg = sma(volume, length)
    weighted_sum = 0.0
    sum_weights = 0.0
    weighted = 0.0
    for i = 0 to length
        weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
        weighted_sum += src[i] * weight
        sum_weights += weight
    a = (weighted_sum / sum_weights)

vawsi(src, len) =>
    rmaUp = vawma(math.max(ta.change(src), 0), len)
    rmaDown = vawma(-math.min(ta.change(src), 0), len)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

trendPersistence(src, length, smoothing) =>
    trendu = math.abs(src - highest_custom(src, length))
    trendd = math.abs(src - lowest_custom(src, length))
    trendu := wma(trendu, smoothing)
    trendd := wma(trendd, smoothing)
    trendu := ta.change(ta.cum(trendu))
    trendd := ta.change(ta.cum(trendd))
    trend = wma(math.max(trendu, trendd), smoothing)
    rmaUp = rma(math.max(ta.change(trend), 0), length)
    rmaDown = rma(-math.min(ta.change(trend), 0), length)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close

var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0

BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
    BearGuy += 1
else
    BearGuy := math.min(BullGuy, 4999)


rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100

atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)

comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult

lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)

var float thresh = na

if na(thresh)
    thresh := lower
if na(dir)
    dir := 1
if crossdown
    dir := -1
if crossup
    dir := 1
if dir == 1
    thresh := lower
if dir == -1
    thresh := upper

crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed

//STRATEGY
if crossup
    strategy.entry("long", strategy.long)
if crossdown
    strategy.entry("Short", strategy.short)

//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))