Estrategia de negociación de la media móvil del canal de precios de volatilidad

El autor:¿ Qué pasa?, fecha: 2023-12-12 11:44:15
Las etiquetas:

img

Resumen general

Esta estrategia se basa en el indicador de súper tendencia y el indicador de canal de precios, combinado con señales de promedio móvil para la negociación.

Estrategia lógica

  1. Calcular el indicador de Super Tendencia. Los rieles superior e inferior son el precio actual más/menos N veces el indicador ATR respectivamente. Cuando el precio es más alto que el rieles superior, es alcista. Cuando el precio es más bajo que el rieles inferior, es bajista.

  2. Calcular el indicador del canal de precios. La línea del canal de precios es M veces la desviación estándar de N días del precio. Los precios más altos / más bajos que la línea del canal se consideran estados anormales.

  3. Calcule las medias móviles. Tome las líneas medias de precio abierto, precio cerrado y Super Tendencia, respectivamente.

  4. Generar señales comerciales:

    • Señales de compra: el precio de cierre cruza por encima de la línea de Super Tendencia y es superior al promedio móvil del precio abierto.

    • Señales de venta: el precio de cierre cruza por debajo de la línea de Super Tendencia y es inferior al promedio móvil del precio abierto.

  5. Establecer el stop loss y tomar el canal de precios de ganancia.

Análisis de ventajas

  1. La combinación de múltiples indicadores evita señales falsas.

  2. El uso del canal de precios para juzgar los estados anormales de precios puede filtrar algunos puntos de entrada indeseables.

  3. Los promedios móviles combinados con juzgar la dirección de la tendencia evitan el comercio en contra de la tendencia.

  4. Establecer el stop loss y tomar el rango de ganancias controla el riesgo.

Análisis de riesgos

  1. La configuración de parámetros es demasiado subjetiva y necesita optimización.

  2. El intervalo de stop loss y take profit puede ser demasiado amplio o demasiado estrecho.

  3. Los parámetros de los canales de precios pueden no ser adecuados para todos los productos, por lo que es necesario realizar pruebas por separado.

  4. Las pérdidas significativas pueden ocurrir durante cambios drásticos de tendencia.

Direcciones de optimización

  1. Prueba y optimiza los parámetros para encontrar combinaciones óptimas.

  2. Prueba las medias móviles con diferentes períodos para seleccionar los parámetros óptimos.

  3. Prueba de retroceso en varios productos y selección de parámetros según el rendimiento, respectivamente.

  4. Optimizar la estrategia de stop loss para evitar pérdidas individuales excesivamente grandes.

Conclusión

Esta estrategia combina múltiples indicadores para juzgar las anomalías de precios y las direcciones de tendencia, que teóricamente pueden filtrar algunas señales falsas. Sin embargo, las configuraciones de parámetros siguen siendo relativamente subjetivas con espacio para la optimización. Además, los costos comerciales como comisiones y deslizamiento deben considerarse en el comercio real. En general, esta estrategia es más adecuada como una estrategia de seguimiento de tendencias, pero los parámetros deben optimizarse y ajustarse para diferentes productos.


/*backtest
start: 2023-12-10 00:00:00
end: 2023-12-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Vol ST VM", overlay=true)

source = close
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

v =  spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow
//
src = out
src1=open
src2=low
src3=high
tf =input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   tf / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c,color=color.red)
o = ema(src1,len)
plot(o,color=color.blue)
//h = ema(src3,len)
//l=ema(src2,len)
//
col=c > o? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na,  color=col, linewidth=2, transp=80)

fill(m1, m2,  color=col, transp=70)
//

vpt=ema(out,len)

// INPUTS //
st_mult   = input(1,   title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01)
st_period = input(10, title = 'SuperTrend Period',     minval = 1)

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend = 0
trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1)

// Calculate SuperTrend Line
st_line = trend ==1 ? up_trend : down_trend

// Plotting
plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend")
buy=crossover( close, st_line) and close>o
sell=crossunder(close, st_line) and close<o
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
plotshape(buy, title="buy", color=color.green, style=shape.arrowup, location=location.belowbar, size=size.normal, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(sell, title="sell", color=color.red, style=shape.arrowdown, location=location.abovebar, size=size.normal, textcolor=color.white, transp=0)  //plot for sell icon


//
multiplier = input(title="TP", type=input.float, defval=2, minval=1)
src5 = close
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5-i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per
        
        
    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1=(i + s * (len5 - offset))
sdev = stdev(close, len5)
dev = multiplier * sdev
top=vwap1+dev
bott=vwap1-dev

//
z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)  
high1 = crossunder(close, z1) 

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon



strategy.entry(id="Enter Long MA", long=true, comment="Buy", when=high1)
strategy.entry(id="Short Entry MA", long=false, comment="Sell", when=low1)

/////// Alerts /////
alertcondition(buy,title="buy")
alertcondition(sell,title="sell")
alertcondition(low1,title="sell tp")
alertcondition(high1,title="buy tp")

Más.