Estrategia de negociación de media móvil con canal de precios de volatilidad


Fecha de creación: 2023-12-12 11:44:15 Última modificación: 2023-12-12 11:44:15
Copiar: 0 Número de Visitas: 552
1
Seguir
1621
Seguidores

Estrategia de negociación de media móvil con canal de precios de volatilidad

Descripción general

La estrategia se basa en un indicador de tendencia súper y un indicador de canal de precios para operar en combinación con una señal de línea de equilibrio. Su idea central es usar el canal de precios para determinar si el precio actual está en un estado anormal, la tendencia súper para determinar la dirección de la tendencia actual y generar una señal de operación con una combinación de señales de línea de equilibrio.

Principio de estrategia

  1. Calcula el indicador de tendencia súper. Donde la línea ascendente y la línea descendente son N veces el precio actual más/menos el indicador ATR. Cuando el precio está por encima de la línea ascendente, es un alza, y cuando el precio está por debajo de la línea descendente, es una baja.

  2. Calcular el indicador de la línea de precios. Donde la línea de precios es M veces la diferencia estándar de N días entre los precios. Los precios por encima o por debajo de la línea de precios se consideran estados anormales.

  3. Calcula la línea media. Toma el promedio de los precios de apertura, cierre y súper tendencia, respectivamente.

  4. Se generan señales de transacción:

    • Señales de compra: el precio de cierre cruza la línea de tendencia súper y está por encima de la línea media de apertura

    • Señales de venta: cruzar la línea de tendencia súper por debajo del precio de cierre y por debajo de la línea media de apertura

  5. Establezca un canal de precios de parada de pérdidas.

Análisis de las ventajas estratégicas

  1. La combinación de varios indicadores evita falsas señales.

  2. El uso de un canal de precios para evaluar las anomalías de precios puede filtrar los puntos de entrada no deseados.

  3. La línea media se combina para determinar la dirección de la tendencia y evitar operaciones de contratiempo.

  4. Establezca un rango de detención de pérdidas para controlar el riesgo.

Análisis de riesgos

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

  2. El alcance de la parada de daños puede estar demasiado grande.

  3. Los parámetros del canal de precios pueden no ser adecuados para todas las variedades, y se deben probar individualmente para cada variedad.

  4. En el caso de un cambio brusco de tendencia, las pérdidas podrían ser mayores.

Dirección de optimización

  1. Optimización de la prueba de los parámetros para encontrar la combinación óptima de parámetros.

  2. Prueba diferentes ciclos de medias y selecciona los parámetros óptimos.

  3. Se realizan pruebas de retorno en varias variedades, seleccionando los parámetros según el rendimiento.

  4. Optimizar las estrategias de stop loss para evitar pérdidas excesivas en una sola operación.

Resumir

Esta estrategia integra varios indicadores para determinar las anomalías de precios y la dirección de la tendencia. En teoría, puede filtrar ciertas señales falsas. Sin embargo, la configuración de los parámetros sigue siendo más subjetiva y hay cierto espacio para la optimización. Además, en el mercado real específico, también se debe considerar el impacto de los costos de transacción, como las comisiones y los puntos de deslizamiento.

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