Estrategia comercial basada en estadísticas cuantitativas con impacto dinámico de VWAP con desviación estándar doble

VWAP SD VOL HL2
Fecha de creación: 2025-01-06 16:31:36 Última modificación: 2025-01-06 16:31:36
Copiar: 2 Número de Visitas: 438
1
Seguir
1617
Seguidores

Estrategia comercial basada en estadísticas cuantitativas con impacto dinámico de VWAP con desviación estándar doble

Descripción general

La estrategia es una estrategia de ruptura de tendencia basada en VWAP (precio promedio ponderado por volumen) y canales de desviación estándar. Construye un rango de fluctuación de precios dinámico calculando VWAP y los canales de desviación estándar superior e inferior para capturar oportunidades comerciales cuando los precios suben. La estrategia se basa principalmente en las señales de ruptura de la banda de desviación estándar para operar y establece objetivos de ganancias e intervalos de órdenes para controlar los riesgos.

Principio de estrategia

  1. Cálculo del indicador básico:
  • Calcule VWAP utilizando el precio y el volumen intradiarios de HL2
  • Calcular la desviación estándar en función de las fluctuaciones de precios
  • Establezca los canales superior e inferior en 1,28 veces la desviación estándar
  1. Lógica de transacción:
  • Condiciones de entrada: El precio cruza la pista inferior y luego sube a la pista superior.
  • Condiciones de salida: alcanzar el objetivo de beneficio preestablecido
  • Establezca un intervalo de pedido mínimo para evitar transacciones frecuentes

Ventajas estratégicas

  1. Estadísticas básicas
  • Referencia de precio pivote basada en VWAP
  • Uso de la desviación estándar para medir la volatilidad
  • Ajuste dinámico del rango de negociación
  1. Control de riesgos
  • Establecer objetivos de beneficios fijos
  • Control de la frecuencia de las transacciones
  • Las estrategias de long-only reducen el riesgo

Riesgo estratégico

  1. Riesgo de mercado
  • La volatilidad salvaje puede provocar falsas rupturas
  • Es difícil captar con precisión el punto de inflexión de la tendencia.
  • La caída unilateral conduce a mayores pérdidas
  1. Riesgo de parámetro
  • Sensibilidad de configuración múltiple con desviación estándar
  • Es necesario optimizar la fijación de objetivos de beneficios
  • El intervalo de negociación afecta el rendimiento de las ganancias

Dirección de optimización

  1. Optimización de señal
  • Añadir filtro de juicio de tendencias
  • Confirmado por cambios en el volumen comercial
  • Agregue otros indicadores técnicos para verificar
  1. Optimización de la gestión de riesgos
  • Establecer dinámicamente la posición de stop loss
  • Ajustar posiciones en función de la volatilidad
  • Mejorar el mecanismo de gestión de pedidos

Resumir

Se trata de una estrategia comercial cuantitativa que combina principios estadísticos y análisis técnico. Mediante la coordinación del VWAP y la banda de desviación estándar, se construye un sistema de comercio relativamente confiable. La principal ventaja de la estrategia radica en su base estadística científica y su mecanismo perfecto de control de riesgos, pero aún necesita optimizar continuamente los parámetros y la lógica comercial en aplicaciones prácticas.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5 
strategy("VWAP Stdev Bands Strategy (Long Only)", overlay=true)

// Standard Deviation Inputs
devUp1 = input.float(1.28, title="Stdev above (1)")
devDn1 = input.float(1.28, title="Stdev below (1)")

// Show Options
showPrevVWAP = input(false, title="Show previous VWAP close?")
profitTarget = input.float(2, title="Profit Target ($)", minval=0) // Profit target for closing orders
gapMinutes = input.int(15, title="Gap before new order (minutes)", minval=0) // Gap for placing new orders

// VWAP Calculation
var float vwapsum = na
var float volumesum = na
var float v2sum = na
var float prevwap = na // Track the previous VWAP
var float lastEntryPrice = na // Track the last entry price
var int lastEntryTime = na // Track the time of the last entry

start = request.security(syminfo.tickerid, "D", time)
newSession = ta.change(start)

vwapsum := newSession ? hl2 * volume : vwapsum[1] + hl2 * volume
volumesum := newSession ? volume : volumesum[1] + volume
v2sum := newSession ? volume * hl2 * hl2 : v2sum[1] + volume * hl2 * hl2

myvwap = vwapsum / volumesum
dev = math.sqrt(math.max(v2sum / volumesum - myvwap * myvwap, 0))

// Calculate Upper and Lower Bands
lowerBand1 = myvwap - devDn1 * dev
upperBand1 = myvwap + devUp1 * dev

// Plot VWAP and Bands with specified colors
plot(myvwap, style=plot.style_line, title="VWAP", color=color.green, linewidth=1)
plot(upperBand1, style=plot.style_line, title="VWAP Upper (1)", color=color.blue, linewidth=1)
plot(lowerBand1, style=plot.style_line, title="VWAP Lower (1)", color=color.red, linewidth=1)

// Trading Logic (Long Only)
longCondition = close < lowerBand1 and close[1] >= lowerBand1 // Price crosses below the lower band

// Get the current time in minutes
currentTime = timestamp("GMT-0", year(timenow), month(timenow), dayofmonth(timenow), hour(timenow), minute(timenow))

// Check if it's time to place a new order based on gap
canPlaceNewOrder = na(lastEntryTime) or (currentTime - lastEntryTime) >= gapMinutes * 60 * 1000

// Close condition based on profit target
if (strategy.position_size > 0)
    if (close - lastEntryPrice >= profitTarget)
        strategy.close("B")
        lastEntryTime := na // Reset last entry time after closing

// Execute Long Entry
if (longCondition and canPlaceNewOrder)
    strategy.entry("B", strategy.long)
    lastEntryPrice := close // Store the entry price
    lastEntryTime := currentTime // Update the last entry time

    // Add label for the entry
    label.new(bar_index, close, "B", style=label.style_label_down, color=color.green, textcolor=color.white, size=size.small)

// Optional: Plot previous VWAP for reference
prevwap := newSession ? myvwap[1] : prevwap[1]
plot(showPrevVWAP ? prevwap : na, style=plot.style_circles, color=close > prevwap ? color.green : color.red)