Estrategia de señal basada en CVDVWAP rodante anclado


Fecha de creación: 2023-12-29 14:56:03 Última modificación: 2023-12-29 14:56:03
Copiar: 1 Número de Visitas: 826
1
Seguir
1621
Seguidores

Estrategia de señal basada en CVDVWAP rodante anclado

Descripción general

La estrategia de señales basada en el VVDVWAP de rotación fija es un indicador de análisis técnico complejo diseñado en la plataforma TradingView. Integra los conceptos de VWAP, CVD y análisis de diferencia estándar para generar señales de entrada y salida de operaciones.

Principio de estrategia

El núcleo de la estrategia es calcular un VWAP fijo, es decir, comenzar a calcular el VWAP a partir de una columna de columna fija específica, que es la columna de mayor volumen de transacción en un ciclo definido por el usuario. Luego, se traza una banda de paquetes de acuerdo con este VWAP fijo, calculada a través de la diferencia estándar, que refleja la zona de sobreventa.

Ventajas estratégicas

  1. Áreas de valor y puntos de soporte/resistencia para determinar el precio utilizando el precio medio ponderado por volumen de transacción
  2. Los precios de las bandas de la red de la diferencia estándar están en un estado de sobrecompra y sobreventa
  3. El indicador de volumen de transacciones de CVD refleja la presión de compra y venta
  4. Puntos de entrada y salida claros
  5. Ajuste automático de los niveles de stop loss y stop loss para ayudar a la gestión de riesgos

Análisis de riesgos

  1. La configuración incorrecta de los parámetros puede causar oportunidades de negociación perdidas o generar señales no válidas
  2. La necesidad de tomar decisiones en combinación con más indicadores que no se pueden usar solos
  3. Necesidad de optimizar adecuadamente los parámetros para adaptarse a diferentes variedades y ciclos
  4. Los paros y paradas incorrectamente configuradas pueden generar grandes pérdidas

Dirección de optimización

  1. Ajustar la lógica de selección de columnas fijas para calcular el VWAP, como la combinación de la línea de medición
  2. Prueba con diferentes configuraciones de la banda de la envoltura de la envoltura de la envoltura
  3. Optimización de los parámetros del ROC para adaptarse a las características de fluctuación de la variedad
  4. Establecer un punto de deslizamiento dinámico o una parada de adaptabilidad para responder a las fuertes fluctuaciones del mercado

Resumir

La estrategia de señales basada en el CVDVWAP de rotación fija y el uso integral de varios indicadores para determinar el movimiento de los precios y la fuerza de compra y venta son útiles para descubrir oportunidades de negociación. Sin embargo, se debe usar con precaución y se debe probar y optimizar constantemente para que coincida con el uso de la estrategia de negociación.

Código Fuente de la Estrategia
/*backtest
start: 2022-12-28 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Anchored Rolling CVDVWAP Signal Strategy', overlay=true)

// User-defined settings
vwapAnchorPeriod = input.int(20, title="Rolling VWAP Anchor Period", group="Settings")
stdDevMult = input.float(2.0, title="Standard Deviation Multiplier for Envelope", group="Settings")
analysis_period = input.int(7, minval=1, maxval=100, title="Analysis Period", group="Settings")
useVwapFilter = input.bool(true, title="Use Anchored VWAP Filter", group="Filters")
useCvdFilter = input.bool(true, title="Use CVD Filter", group="Filters")
cvdLength = input.int(20, title="CVD Length", group="Filters")
tpPercent = input.float(200.0, title="Take Profit % of SL Distance", group="Trade Settings")
slPeriods = input.int(200, title="Stop Loss Lookback Period", group="Trade Settings")
toggleSignals = input.bool(false, title="Toggle Signals", group="Settings")

// Finding the anchor bar
highestVol = ta.highest(volume, vwapAnchorPeriod)
var int anchorBar = na
if volume == highestVol
    anchorBar := bar_index

// Initializing variables for anchored VWAP and envelope calculation
var float avwapNumerator = na
var float avwapDenominator = na
var float anchoredVwap = na
var float sum = 0.0
var int count = 0
var float sumDev = 0.0

// Calculating Anchored VWAP and envelope
if not na(anchorBar)
    if bar_index == anchorBar
        avwapNumerator := high * volume + low * volume + close * volume
        avwapDenominator := volume * 3
        sum := 0.0
        count := 0
        sumDev := 0.0
    else if bar_index > anchorBar
        avwapNumerator := avwapNumerator[1] + high * volume + low * volume + close * volume
        avwapDenominator := avwapDenominator[1] + volume * 3
        sum := sum[1] + close
        count := count[1] + 1
        sumDev := sumDev[1] + math.pow(close - (sum / count), 2)
    anchoredVwap := avwapNumerator / avwapDenominator

// Standard deviation envelope calculation
float mean = sum / math.max(count, 1)
float stDev = math.sqrt(sumDev / math.max(count, 1))
float upperBand = anchoredVwap + stdDevMult * stDev
float lowerBand = anchoredVwap - stdDevMult * stDev

// CVD calculation and filter application
cvd = ta.cum(volume - ta.sma(volume, cvdLength))
bool cvdCondition = useCvdFilter ? (cvd[1] < cvd and cvd > cvd[1]) : true

// Dip and Rip pattern detection
roc = ta.roc(close, analysis_period)
dip_move_value = input.float(-8, title="Down (%)", step=0.50, minval=-100, maxval=-0.01, group="Settings")
rip_move_value = input.float(8, title="Up (%)", step=0.50, minval=0.01, maxval=100.00, group="Settings")
dip = roc <= dip_move_value and cvdCondition and (not useVwapFilter or close < anchoredVwap)
rip = roc >= rip_move_value and cvdCondition and (not useVwapFilter or close > anchoredVwap)

// State variables for signals and TP/SL execution
var bool inTrade = false // If we are currently in a trade
var bool takeLong = false // If the last signal was a buy
var bool takeShort = false // If the last signal was a sell
var float tradeEntryPrice = na // The trade entry price
var float tradeSL = na // The current trade's Stop Loss level
var float tradeTP = na // The current trade's Take Profit level

// Setting SL and TP levels for the trade
tradeSL := dip ? ta.highest(high, slPeriods) : (rip ? ta.lowest(low, slPeriods) : tradeSL)
tradeTP := dip ? tradeEntryPrice - (tradeSL - tradeEntryPrice) * tpPercent / 100 : (rip ? tradeEntryPrice + (tradeEntryPrice - tradeSL) * tpPercent / 100 : tradeTP)

// Trade entry logic
if (dip or rip) and not inTrade
    tradeEntryPrice := close
    inTrade := true
    takeLong := rip
    takeShort := dip

// Trade exit logic at TP or SL
if inTrade and ((takeLong and (low < tradeSL or high > tradeTP)) or (takeShort and (high > tradeSL or low < tradeTP)))
    inTrade := false // Exit the trade

// Display logic for signals based on the toggle
bool showLongSignal = rip and (not toggleSignals or not takeLong)
bool showShortSignal = dip and (not toggleSignals or not takeShort)

// Reset signals if toggle is active and trade is exited
if toggleSignals and not inTrade
    takeLong := true
    takeShort := true

// Strategy entry and exit logic
if showLongSignal
    strategy.entry("Long", strategy.long)

if showShortSignal
    strategy.close("Long")

if showShortSignal
    strategy.entry("Short", strategy.short)

if showLongSignal
    strategy.close("Short")

// Plotting of entry signals, anchored VWAP, and envelope
plot(upperBand, title="Upper Envelope", color=color.green)
plot(lowerBand, title="Lower Envelope", color=color.red)
plot(anchoredVwap, title="Anchored VWAP", color=color.blue)

// Coloring and shapes for Dip and Rip
barcolor(dip ? color.rgb(255, 0, 0) : na, title="Down Bar Color")
bgcolor(dip ? color.rgb(255, 0, 0, 80) : na, title="Down Background Color")
plotshape(dip, title="Dip - Down", location=location.top, color=color.rgb(255, 82, 82, 45), style=shape.square, size=size.tiny)
barcolor(rip ? color.rgb(0, 255, 0) : na, title="Up Bar Color")
bgcolor(rip ? color.rgb(0, 255, 0, 80) : na, title="Up Background Color")
plotshape(rip, title="Rip - Up", location=location.top, color=color.rgb(76, 175, 79, 55), style=shape.square, size=size.tiny)

// Strategy exit conditions for TP and SL
strategy.exit("Take Profit Long", from_entry = "Long", limit = tradeTP)
strategy.exit("Stop Loss Long", from_entry = "Long", stop = tradeSL)
strategy.exit("Take Profit Short", from_entry = "Short", limit = tradeTP)
strategy.exit("Stop Loss Short", from_entry = "Short", stop = tradeSL)