En la carga de los recursos... Cargando...

Estrategia de negociación VWAP con detección de anomalías de volumen

El autor:¿ Qué pasa?, Fecha: 2024-06-07 15:44:04
Las etiquetas:VWAPIndicador de riesgoDTY añoLa SMA

img

Resumen general

Esta estrategia se basa en múltiples niveles de VWAP (Volume Weighted Average Price), incluyendo el precio abierto, el precio alto, el precio bajo y el VWAP de velas con un volumen anormalmente alto. La estrategia utiliza los niveles de VWAP como soporte y resistencia, al tiempo que considera situaciones de volumen anormales. Cuando el precio rompe los niveles de VWAP y cumple ciertas condiciones, la estrategia genera señales comerciales. Además, la estrategia utiliza el indicador RSI para detectar cambios de impulso como condición de salida.

Principios de estrategia

  1. Calcular varios niveles de VWAP, incluidos el VWAP de precio abierto, el VWAP de precio alto, el VWAP de precio bajo y el VWAP de velas con un volumen anormalmente alto.
  2. Detectar las velas con un volumen anormalmente alto y restablecer las variables acumuladas para el VWAP de volumen anormalmente alto de esas velas.
  3. Establecer valores de desplazamiento por encima y por debajo de los niveles de VWAP como condiciones de activación de las señales de negociación.
  4. Compruebe si hay huecos en el lado opuesto del VWAP para evitar señales falsas.
  5. Generar múltiples señales de negociación basadas en la posición de precio relativa al VWAP y la relación entre el precio de cierre y el precio de apertura, incluidos los tipos Wick y Crossover.
  6. Utilice el indicador RSI para detectar cambios en el impulso y cerrar las operaciones correspondientes cuando el RSI exceda 70 o baje por debajo de 30.

Análisis de ventajas

  1. La estrategia utiliza múltiples niveles de VWAP, proporcionando información de soporte y resistencia más completa.
  2. Al detectar velas con un volumen anormalmente alto, la estrategia puede capturar cambios significativos en el mercado.
  3. El ajuste de valores de desplazamiento puede filtrar algunas señales de ruido y mejorar la calidad de las señales comerciales.
  4. La estrategia considera situaciones de brecha en el lado opuesto del VWAP, evitando algunas señales falsas.
  5. Las señales de negociación múltiples se generan en función de la posición de precio relativa al VWAP y la relación entre el precio de cierre y el precio de apertura, lo que aumenta la flexibilidad de la estrategia.
  6. El uso del indicador RSI como condición de salida puede ayudar a la estrategia a salir de las operaciones de manera oportuna cuando el impulso cambia.

Análisis de riesgos

  1. La estrategia se basa en los niveles de VWAP, que pueden perder su eficacia en condiciones extremas de mercado.
  2. El juicio de un volumen anormalmente alto se basa en un umbral fijo, que puede no adaptarse a las diferentes situaciones del mercado.
  3. Es posible que sea necesario ajustar la fijación de los valores de desplazamiento en función de los diferentes mercados e instrumentos de negociación.
  4. La estrategia genera múltiples señales de negociación, lo que puede conducir a un exceso de negociación y altos costos de transacción.
  5. El indicador RSI puede producir señales de salida rezagadas, lo que hace que la estrategia tenga mayores riesgos.

Direcciones de optimización

  1. Optimizar el método de cálculo de los niveles de VWAP, por ejemplo, considerando períodos de tiempo más largos o utilizando métodos ponderados.
  2. Optimizar los criterios de evaluación para un volumen anormalmente alto, como la adopción de umbrales adaptativos o su combinación con otros indicadores de volumen.
  3. Realizar una optimización de parámetros en los valores de desplazamiento para encontrar el rango de desviación óptimo.
  4. Introducir medidas de gestión de riesgos, como establecer los niveles de stop-loss y take-profit, para controlar la exposición al riesgo de las operaciones individuales.
  5. Pruebe otros indicadores de impulso o combine varios indicadores para obtener señales de salida más precisas.
  6. Filtrar las señales de negociación para reducir el exceso de negociación y reducir los costos de transacción.

Resumen de las actividades

Esta estrategia utiliza múltiples niveles de VWAP y detección de volumen anormal para generar diversas señales comerciales. Al considerar la posición relativa del precio al VWAP, la relación entre el precio de cierre y el precio de apertura, y el indicador RSI, la estrategia intenta capturar cambios significativos del mercado y operaciones de salida de manera oportuna. Sin embargo, la estrategia también tiene algunos riesgos, como adaptabilidad a condiciones extremas del mercado, sobrecomercio y señales de salida rezagadas. Para mejorar aún más la estrategia, se puede considerar optimizar el método de cálculo de VWAP, los criterios de juicio para el volumen anormal, el establecimiento de valores de desplazamiento e introducir medidas de gestión de riesgos y más combinaciones de indicadores.


/*backtest
start: 2024-05-30 00:00:00
end: 2024-06-06 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("5 Anchored VWAP Strategy with Abnormally High Volume Candle", overlay=true)

// Initialize VWAP variables
var float vwap_open = na
var float vwap_high = na
var float vwap_low = na
var float vwap_high_volume = na

var float cum_v_open = 0
var float cum_v_high = 0
var float cum_v_low = 0
var float cum_v_high_volume = 0

var float cum_pv_open = 0
var float cum_pv_high = 0
var float cum_pv_low = 0
var float cum_pv_high_volume = 0

var float highest_volume = 0

// Initialize YTD high and low variables
var float ytd_high = na
var float ytd_low = na

// Parameters for abnormal volume detection
length = 20
volume_threshold = 2.0

// Displacement parameters
displacement_percentage = 0.01 // 1% displacement

// Calculate average volume
avg_volume = ta.sma(volume, length)

// Check if it's the first day of the year
is_first_day_of_year = year(time) != year(time[1])

// Reset YTD high and low on the first day of the year
if is_first_day_of_year
    ytd_high := high
    ytd_low := low

// Update YTD high and low
ytd_high := na(ytd_high) ? high : math.max(ytd_high, high)
ytd_low := na(ytd_low) ? low : math.min(ytd_low, low)

// Update cumulative variables for open VWAP
cum_v_open += volume
cum_pv_open += close * volume
if cum_v_open != 0
    vwap_open := cum_pv_open / cum_v_open

// Update cumulative variables for high VWAP
if high == ytd_high
    cum_v_high := 0
    cum_pv_high := 0

cum_v_high += volume
cum_pv_high += close * volume
if cum_v_high != 0
    vwap_high := cum_pv_high / cum_v_high

// Update cumulative variables for low VWAP
if low == ytd_low
    cum_v_low := 0
    cum_pv_low := 0

cum_v_low += volume
cum_pv_low += close * volume
if cum_v_low != 0
    vwap_low := cum_pv_low / cum_v_low

// Check for new high-volume candle that is also abnormally high and reset cumulative variables for high-volume VWAP
new_high_volume = false
if volume > highest_volume and volume > volume_threshold * avg_volume
    highest_volume := volume
    cum_v_high_volume := 0
    cum_pv_high_volume := 0
    new_high_volume := true

cum_v_high_volume += volume
cum_pv_high_volume += close * volume
if cum_v_high_volume != 0
    vwap_high_volume := cum_pv_high_volume / cum_v_high_volume

// Plot VWAPs
plot(vwap_open, color=color.red, linewidth=2, title="VWAP Open")
plot(vwap_high, color=color.green, linewidth=2, title="VWAP High")
plot(vwap_low, color=color.blue, linewidth=2, title="VWAP Low")
plot(vwap_high_volume, color=color.purple, linewidth=2, title="VWAP High Volume")

// Plot a vertical line on the chart only when a new high-volume VWAP anchor occurs
bgcolor(new_high_volume ? color.new(color.purple, 90) : na, offset=-1)

// Calculate displacement amounts
displacement_amount_open = vwap_open * displacement_percentage
displacement_amount_high = vwap_high * displacement_percentage
displacement_amount_low = vwap_low * displacement_percentage
displacement_amount_high_volume = vwap_high_volume * displacement_percentage

// Check for gaps on the opposite side of a VWAP
gap_up_opposite_open = na(close[1]) ? false : (open > close[1] and open < vwap_open and close[1] > vwap_open)
gap_down_opposite_open = na(close[1]) ? false : (open < close[1] and open > vwap_open and close[1] < vwap_open)

gap_up_opposite_high = na(close[1]) ? false : (open > close[1] and open < vwap_high and close[1] > vwap_high)
gap_down_opposite_high = na(close[1]) ? false : (open < close[1] and open > vwap_high and close[1] < vwap_high)

gap_up_opposite_low = na(close[1]) ? false : (open > close[1] and open < vwap_low and close[1] > vwap_low)
gap_down_opposite_low = na(close[1]) ? false : (open < close[1] and open > vwap_low and close[1] < vwap_low)

gap_up_opposite_high_volume = na(close[1]) ? false : (open > close[1] and open < vwap_high_volume and close[1] > vwap_high_volume)
gap_down_opposite_high_volume = na(close[1]) ? false : (open < close[1] and open > vwap_high_volume and close[1] < vwap_high_volume)

// RSI calculation for momentum change detection
rsi = ta.rsi(close, 14)
long_exit_condition = rsi > 70
short_exit_condition = rsi < 30

// Debugging Plots
plotshape(not gap_up_opposite_open and not gap_down_opposite_open and close > vwap_open and low < vwap_open - displacement_amount_open and close[1] < vwap_open, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Open Long Signal")
plotshape(not gap_up_opposite_open and not gap_down_opposite_open and close < vwap_open and high > vwap_open + displacement_amount_open and close[1] > vwap_open, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Open Short Signal")

plotshape(not gap_up_opposite_high and not gap_down_opposite_high and close > vwap_high and low < vwap_high - displacement_amount_high and close[1] < vwap_high, style=shape.triangledown, location=location.abovebar, color=color.blue, size=size.small, title="High Long Signal")
plotshape(not gap_up_opposite_high and not gap_down_opposite_high and close < vwap_high and high > vwap_high + displacement_amount_high and close[1] > vwap_high, style=shape.triangleup, location=location.belowbar, color=color.orange, size=size.small, title="High Short Signal")

plotshape(not gap_up_opposite_low and not gap_down_opposite_low and close > vwap_low and low < vwap_low - displacement_amount_low and close[1] < vwap_low, style=shape.triangledown, location=location.abovebar, color=color.purple, size=size.small, title="Low Long Signal")
plotshape(not gap_up_opposite_low and not gap_down_opposite_low and close < vwap_low and high > vwap_low + displacement_amount_low and close[1] > vwap_low, style=shape.triangleup, location=location.belowbar, color=color.yellow, size=size.small, title="Low Short Signal")

plotshape(not gap_up_opposite_high_volume and not gap_down_opposite_high_volume and close > vwap_high_volume and low < vwap_high_volume - displacement_amount_high_volume and close[1] < vwap_high_volume, style=shape.triangledown, location=location.abovebar, color=color.teal, size=size.small, title="High Volume Long Signal")
plotshape(not gap_up_opposite_high_volume and not gap_down_opposite_high_volume and close < vwap_high_volume and high > vwap_high_volume + displacement_amount_high_volume and close[1] > vwap_high_volume, style=shape.triangleup, location=location.belowbar, color=color.fuchsia, size=size.small, title="High Volume Short Signal")

// Trading signals based on VWAP support/resistance with displacement, no gaps on the opposite side, and bounce conditions
if not gap_up_opposite_open and not gap_down_opposite_open
    if (close > vwap_open and low < vwap_open)
        if close > open
            strategy.entry("Long_Open_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_Open_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_open and high > vwap_open)
        if close < open
            strategy.entry("Short_Open_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_Open_Crossover", strategy.short, comment="Crossover")

if not gap_up_opposite_high and not gap_down_opposite_high
    if (close > vwap_high and low < vwap_high)
        if close > open
            strategy.entry("Long_High_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_High_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_high and high > vwap_high)
        if close < open
            strategy.entry("Short_High_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_High_Crossover", strategy.short, comment="Crossover")

if not gap_up_opposite_low and not gap_down_opposite_low
    if (close > vwap_low and low < vwap_low)
        if close > open
            strategy.entry("Long_Low_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_Low_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_low and high > vwap_low)
        if close < open
            strategy.entry("Short_Low_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_Low_Crossover", strategy.short, comment="Crossover")

if not gap_up_opposite_high_volume and not gap_down_opposite_high_volume
    if (close > vwap_high_volume and low < vwap_high_volume)
        if close > open
            strategy.entry("Long_High_Volume_Wick", strategy.long, comment="Wick")
        else
            strategy.entry("Long_High_Volume_Crossover", strategy.long, comment="Crossover")
    
    if (close < vwap_high_volume and high > vwap_high_volume)
        if close < open
            strategy.entry("Short_High_Volume_Wick", strategy.short, comment="Wick")
        else
            strategy.entry("Short_High_Volume_Crossover", strategy.short, comment="Crossover")

// Exit trades based on RSI momentum change
if strategy.position_size > 0 and long_exit_condition
    strategy.close("Long_Open_Wick")
    strategy.close("Long_Open_Crossover")
    strategy.close("Long_High_Wick")
    strategy.close("Long_High_Crossover")
    strategy.close("Long_Low_Wick")
    strategy.close("Long_Low_Crossover")
    strategy.close("Long_High_Volume_Wick")
    strategy.close("Long_High_Volume_Crossover")

if strategy.position_size < 0 and short_exit_condition
    strategy.close("Short_Open_Wick")
    strategy.close("Short_Open_Crossover")
    strategy.close("Short_High_Wick")
    strategy.close("Short_High_Crossover")
    strategy.close("Short_Low_Wick")
    strategy.close("Short_Low_Crossover")
    strategy.close("Short_High_Volume_Wick")
    strategy.close("Short_High_Volume_Crossover")

Relacionados

Más.