Estrategia comercial VWAP y monitoreo de anomalías de volumen

VWAP RSI YTD SMA
Fecha de creación: 2024-06-07 15:44:04 Última modificación: 2024-06-07 15:44:04
Copiar: 0 Número de Visitas: 717
1
Seguir
1617
Seguidores

Estrategia comercial VWAP y monitoreo de anomalías de volumen

Descripción general

La estrategia se basa en varios niveles de VWAP (promedio ponderado por volumen de transacciones), que incluyen el precio de apertura, el precio más alto, el precio más bajo y un gráfico de volumen de transacciones anormalmente alto. La estrategia utiliza VWAP como soporte y resistencia, y considera las excepciones en el volumen de transacciones.

Principio de estrategia

  1. Calcule varios niveles de VWAP, incluidos el VWAP de precio de apertura, el VWAP de precio máximo, el VWAP de precio mínimo y el VWAP de gráfico de volumen de transacción inusualmente alto.
  2. Detectar un diagrama de tráfico inusualmente alto y reinstalar la variable acumulada de VWAP de tráfico inusualmente alto en ese diagrama.
  3. Establecer un valor de desviación por encima y por debajo del nivel VWAP como condición de activación de la señal de negociación.
  4. Compruebe si hay salto de precios en el otro lado de VWAP para evitar señales erróneas.
  5. De acuerdo con la posición del precio con respecto al VWAP y la relación entre el precio de cierre y el precio de apertura, se generan varias señales de negociación, que incluyen dos tipos de Wick (en la línea de sombra) y Crossover (en la cruz).
  6. Utiliza el indicador RSI para detectar cambios en la dinámica y, cuando el RSI es superior a 70 o inferior a 30, se realiza una operación de liquidación correspondiente.

Análisis de las ventajas

  1. La estrategia utiliza varios niveles de VWAP para proporcionar una información más completa sobre los puntos de soporte y resistencia.
  2. La estrategia puede capturar cambios importantes en el mercado mediante la detección de gráficos de alto volumen de transacciones.
  3. La configuración de la desviación puede filtrar algunos de los ruidos y mejorar la calidad de la señal de negociación.
  4. Teniendo en cuenta el salto de los precios en el otro lado de VWAP, se evitaron algunas señales erróneas.
  5. Se generan múltiples señales de negociación en función de la posición relativa del precio con respecto 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 equilibrio puede ayudar a la estrategia a salir de las operaciones a tiempo cuando se produce un cambio de dinámica.

Análisis de riesgos

  1. La estrategia depende del nivel de VWAP, que puede perder su eficacia en caso de que se produzcan situaciones extremas en el mercado.
  2. Los juicios sobre un volumen de negocios inusualmente alto se basan en valores mínimos fijos que pueden no adaptarse a diferentes situaciones de mercado.
  3. La configuración del valor de desviación puede requerir ajustes según los diferentes mercados y variedades de transacciones.
  4. Esta estrategia genera múltiples señales de transacción que pueden conducir a una sobre-transacción y altos costos de transacción.
  5. El RSI puede generar señales de pérdida de posiciones, lo que hace que la estrategia sufra un mayor riesgo.

Dirección de optimización

  1. Optimización de los métodos de cálculo de los niveles de VWAP, como considerar períodos de tiempo más largos o usar métodos ponderados.
  2. Optimización de criterios para determinar el volumen de negocios inusualmente alto, como el uso de umbrales adaptados o la combinación de otros indicadores de volumen de negocios.
  3. Optimización de los parámetros de los valores de desviación para encontrar la mayor desviación posible.
  4. Introducir medidas de gestión de riesgos, como el establecimiento de paradas y paradas, para controlar el umbral de riesgo de las operaciones individuales.
  5. Pruebe otros indicadores de movimiento o combinación de varios indicadores para obtener una señal de equilibrio más precisa.
  6. Filtración de señales de transacción para reducir el exceso de transacciones y reducir los costos de las transacciones.

Resumir

La estrategia utiliza varios niveles de VWAP y detección de anomalías en el volumen de transacciones para generar una variedad de señales de negociación. La estrategia trata de capturar los cambios importantes en el mercado y salir de las transacciones a tiempo, teniendo en cuenta la posición relativa del precio con el VWAP, la relación entre el precio de cierre y el precio de apertura, y el indicador RSI. Sin embargo, la estrategia también presenta algunos riesgos, como la adaptabilidad a situaciones extremas, el exceso de comercio y las señales de salida atrasadas.

Código Fuente de la Estrategia
/*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")