Estrategia de ruptura dinámica del canal de precios

El autor:¿ Qué pasa?, Fecha: 2023-12-13 16:03:37
Las etiquetas:

img

Resumen general

La Estrategia Dinámica de Breakout del Canal de Precios es una estrategia de negociación cuantitativa basada en el indicador Donchian Price Channel.

La idea principal de esta estrategia es utilizar las rupturas del canal de precios Donchan. Cuando el precio rompe el límite superior del canal, establezca una posición larga para buscar la tendencia; Cuando el precio rompe el límite inferior del canal, establezca una posición corta para buscar la tendencia.

Principio de la estrategia

Cálculo del indicador

El canal de precios se calcula con las siguientes fórmulas:

Línea superior = máximo máximo durante los últimos N períodos

Línea inferior = Bajo mínimo durante los últimos N períodos

Línea media = (línea superior + línea inferior) / 2

Donde N representa la longitud del ciclo del canal. El valor predeterminado para esta estrategia es 50.

Reglas de entrada

Cuando el precio más alto de la última línea K rompa el límite superior del canal, establecer una posición larga;

Cuando el precio más bajo de la última línea K rompa el límite inferior del canal, establezca una posición corta.

Ejemplo:

El punto más alto de la línea K anterior no excedió el límite superior del canal;
El punto más alto de la línea K de corriente atraviesa el límite superior del canal; Establecer una posición larga

Reglas de salida

Hay dos reglas de salida opcionales:

  1. Salida del canal

Cierre de la posición larga: el precio de stop loss es el límite inferior del canal;

Posición corta de cierre: el precio de stop loss es el límite superior del canal;

  1. Salida de la línea media

No importa las posiciones largas o cortas, cierre todas las posiciones cuando los precios caigan por debajo de la línea media del canal.

Control de riesgos

El control de riesgos adopta la pérdida de parada proporcional para calcular la distancia específica de pérdida de parada basada en la amplitud del canal y el porcentaje de riesgo aceptable.

El importe de las pérdidas por riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo de riesgo.

En el caso de las entidades de crédito, el importe de las pérdidas de liquidación se calculará en función de las pérdidas de liquidación.

Por ejemplo, si el riesgo aceptable se establece en 2%, el precio de entrada es de $10,000, entonces la línea de stop loss para una posición larga es de $10,000 * (1 - 2%) = $9,800.

Análisis de ventajas

Captura las rupturas de tendencia

Cuando los precios rompen los límites superior e inferior del canal, es muy probable que comience una nueva tendencia direccional.

Riesgos controlables

El uso de un stop loss proporcional puede mantener las pérdidas individuales dentro de un rango aceptable.

Espacio de optimización de parámetros grandes

Los parámetros como el ciclo del canal, la relación de riesgo, el método de stop loss se pueden optimizar y combinar para adaptarse a más entornos de mercado.

Análisis de riesgos

Las fugas fallidas

Las rupturas de precios de los límites del canal no forman necesariamente una tendencia, existe una probabilidad de rupturas fallidas, lo que probablemente causará un stop loss.

Mercado limitado por el rango

Cuando el mercado está limitado a un rango, los precios pueden tocar con frecuencia los límites superior e inferior del canal, lo que resulta en una negociación excesivamente frecuente, lo que aumenta los costos de transacción y las pérdidas por deslizamiento.

Direcciones de optimización

Canal dinámico

Considere hacer de la longitud del canal de precios una variable que se ajuste automáticamente en función de la volatilidad del mercado.

Optimice las oportunidades de ingreso

Combinar otros indicadores para filtrar el momento de entrada, como indicadores de volumen, medias móviles, etc., para evitar rupturas ineficaces en mercados oscilantes.

Optimización de parámetros

Utilizar más datos históricos para probar y optimizar las combinaciones de parámetros para determinar los parámetros óptimos para adaptarse a las condiciones más amplias del mercado.

Resumen de las actividades

La estrategia de canal de precios dinámico es generalmente una estrategia de seguimiento de tendencias relativamente simple e intuitiva. Sus ventajas son señales claras y fáciles de comprender; El control de riesgos es relativamente razonable. Pero todavía hay algunos problemas que se deben optimizar aún más, como el manejo de rupturas fallidas y mercados oscilantes.


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro

//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong  = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype  = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize   = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen     = input(50, minval = 1, title = "Price Channel Length")
showll    = input(true, defval = true, title = "Show lines")
showof    = input(true, defval = true, title = "Show offset")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(false, defval = false, title = "Show background")
fromyear  = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear    = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth   = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday   = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today     = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center

//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
if h > 0
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Más.