Estrategia de ruptura de fluctuación de volumen de compra/venta dinámica


Fecha de creación: 2023-12-26 11:15:31 Última modificación: 2023-12-26 11:15:31
Copiar: 0 Número de Visitas: 634
1
Seguir
1623
Seguidores

Estrategia de ruptura de fluctuación de volumen de compra/venta dinámica

Descripción general

Esta estrategia permite el seguimiento de tendencias de alta probabilidad a través de un análisis de la volatilidad de los volúmenes de compra y venta en períodos de tiempo personalizados, en combinación con un filtro de VWAP de circunferencia y una banda de browning. Al mismo tiempo, se introduce un mecanismo de stop loss dinámico que permite controlar eficazmente el riesgo unilateral.

Principio de estrategia

  1. Calcula el indicador de volumen de compra y venta en un período de tiempo personalizado
  • BV: Cantidad comprada, cantidad generada por la compra de puntos bajos
  • SV: Ventas, el volumen generado por las ventas más altas
  1. Tratamiento de las ventas
  • Utilizando 20 ciclos de EMA para suavizar
  • Separación positiva y negativa de la cantidad de compra y venta tratada
  1. La dirección de los indicadores
  • Un indicador mayor a 0 es positivo y menor a 0 es negativo.
  1. El proyecto de ley de la ciudad de Nueva York, que incluye el VWAP y el juicio de Brin, es una violación de la ley.
  • El precio está por encima del VWAP y el indicador está mirando hacia arriba como una señal de aumento
  • El precio está por debajo del VWAP y el indicador ha bajado como señal de corto plazo
  1. Dinámica paralización de pérdidas
  • Porcentaje de pérdidas de parada por ATR por día

Ventajas estratégicas

  1. El volumen de compra y venta refleja el verdadero dinamismo del mercado y capta la energía potencial de la tendencia
  2. La línea de circunferencia VWAP determina la dirección de la tendencia del gran ciclo, la banda de Bryn determina la señal de ruptura
  3. El ATR dinámico establece el stop loss para bloquear al máximo las ganancias y evitar el exceso de ajuste

Riesgo estratégico

  1. Los datos de las ventas y compras son erróneos y pueden conducir a errores de juicio.
  2. Un solo indicador puede generar señales erróneas
  3. El parámetro de la banda de Brin está mal configurado y reduce la brecha efectiva

Dirección de optimización de la estrategia

  1. Optimización del índice de volumen de compra y venta en períodos de tiempo múltiples
  2. Filtrado de indicadores auxiliares como el aumento del volumen de operaciones
  3. Ajuste dinámico del Parámetro de la Banda de Brin para mejorar la eficiencia de la brecha

Resumir

Esta estrategia aprovecha la predicción de la cantidad de compra y venta, junto con la generación de señales de alta probabilidad con VWAP y Brin, para controlar el riesgo de manera efectiva a través de un stop loss dinámico. Es una estrategia de comercio cuantitativa eficiente y estable.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © original author ceyhun
//@ exlux99 update

//@version=5
strategy('Buying Selling Volume Strategy', format=format.volume, precision=0, overlay=false)

weekly_vwap = request.security(syminfo.tickerid, "W", ta.vwap(hlc3))

vi = false
customTimeframe = input.timeframe("60", group="Entry Settings")

allow_long = input.bool(true, group="Entry Settings")
allow_short = input.bool(false, group="Entry Settings")

xVolume = request.security(syminfo.tickerid, customTimeframe, volume)
xHigh = request.security(syminfo.tickerid, customTimeframe, high)
xLow = request.security(syminfo.tickerid, customTimeframe, low)
xClose = request.security(syminfo.tickerid, customTimeframe, close)

BV = xHigh == xLow ? 0 : xVolume * (xClose - xLow) / (xHigh - xLow)
SV = xHigh == xLow ? 0 : xVolume * (xHigh - xClose) / (xHigh - xLow)

vol = xVolume > 0 ? xVolume : 1
TP = BV + SV
BPV = BV / TP * vol
SPV = SV / TP * vol
TPV = BPV + SPV

tavol20 = request.security(syminfo.tickerid, customTimeframe, ta.ema(vol, 20))
tabv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(BV, 20))
tasv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(SV, 20))
VN = vol / tavol20
BPN = BV / tabv20 * VN * 100
SPN = SV / tasv20 * VN * 100
TPN = BPN + SPN

xbvp = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPV))
xbpn = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPN))
xspv = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPV))
xspn = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPN))

BPc1 = BPV > SPV ? BPV : xbvp
BPc2 = BPN > SPN ? BPN : xbpn
SPc1 = SPV > BPV ? SPV : xspv
SPc2 = SPN > BPN ? SPN : xspn
BPcon = vi ? BPc2 : BPc1
SPcon = vi ? SPc2 : SPc1


minus = BPcon + SPcon
plot(minus, color = BPcon > SPcon  ? color.green : color.red , style=plot.style_columns) 

length = input.int(20, minval=1, group="Volatility Settings")
src = minus//input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group="Volatility Settings")
xtasma = request.security(syminfo.tickerid, customTimeframe, ta.sma(src, length))
xstdev = request.security(syminfo.tickerid, customTimeframe, ta.stdev(src, length))
basis = xtasma
dev = mult * xstdev
upper = basis + dev
lower = basis - dev
plot(basis, "Basis", color=#FF6D00, offset = 0)
p1 = plot(upper, "Upper", color=#2962FF, offset = 0)
p2 = plot(lower, "Lower", color=#2962FF, offset = 0)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// Original a
longOriginal = minus > upper and BPcon > SPcon and close > weekly_vwap
shortOriginal = minus > upper and BPcon < SPcon and close< weekly_vwap



high_daily = request.security(syminfo.tickerid, "D", high)
low_daily  = request.security(syminfo.tickerid, "D", low)
close_daily = request.security(syminfo.tickerid, "D", close)

true_range = math.max(high_daily - low_daily, math.abs(high_daily - close_daily[1]), math.abs(low_daily - close_daily[1]))
atr_range = ta.sma(true_range*100/request.security(syminfo.tickerid, "D", close), 14)

ProfitTarget_Percent_long = input.float(100.0, title='TP Multiplier for Long entries ', step=0.5, step=0.5, group='Dynamic Risk Management')
Profit_Ticks_long = close + (close * (atr_range * ProfitTarget_Percent_long))/100
LossTarget_Percent_long = input.float(1.0, title='SL Multiplier for Long entries', step=0.5, group='Dynamic Risk Management')
Loss_Ticks_long = close - (close * (atr_range * LossTarget_Percent_long ))/100

ProfitTarget_Percent_short = input.float(100.0, title='TP Multiplier for Short entries ', step=0.5, step=0.5, group='Dynamic Risk Management')
Profit_Ticks_short = close - (close * (atr_range*ProfitTarget_Percent_short))/100
LossTarget_Percent_short = input.float(5.0, title='SL Multiplier for Short entries', step=0.5, group='Dynamic Risk Management')
Loss_Ticks_short = close + (close * (atr_range*LossTarget_Percent_short))/100



var longOpened_original = false
var int timeOfBuyLong = na
var float tpLong_long_original = na
var float slLong_long_original = na
long_entryx = longOriginal

longEntry_original = long_entryx and not longOpened_original 


if longEntry_original
    longOpened_original := true
    tpLong_long_original := Profit_Ticks_long
    slLong_long_original := Loss_Ticks_long
    timeOfBuyLong := time
    //lowest_low_var_sl := lowest_low

     
tpLong_trigger = longOpened_original[1] and ((close > tpLong_long_original) or (high > tpLong_long_original)) //or high > lowest_low_var_tp
slLong_Trigger = longOpened_original[1] and ((close < slLong_long_original) or (low < slLong_long_original)) //or low < lowest_low_var_sl

longExitSignal_original =   shortOriginal or tpLong_trigger or slLong_Trigger 


if(longExitSignal_original)
    longOpened_original := false
    tpLong_long_original := na
    slLong_long_original := na


if(allow_long)
    strategy.entry("long", strategy.long, when=longOriginal) 
    strategy.close("long", when= longExitSignal_original) //or shortNew

if(allow_short)
    strategy.entry("short", strategy.short, when=shortOriginal ) 
    strategy.close("short", when= longOriginal) //or shortNew