Estrategia de ruptura del canal de precios dinámico


Fecha de creación: 2023-12-13 16:03:37 Última modificación: 2023-12-13 16:03:37
Copiar: 3 Número de Visitas: 674
1
Seguir
1621
Seguidores

Estrategia de ruptura del canal de precios dinámico

Descripción general

La estrategia de ruptura de canal de precio dinámico es una estrategia de negociación cuantitativa basada en el indicador de canal de precio de Donchian. La estrategia determina la dirección de la tendencia del mercado en función de los límites superiores y inferiores del canal de precio y establece posiciones de venta o venta libre cuando el precio rompe el canal.

La idea principal de esta estrategia es usar breakouts del canal de precios de Donchan. Cuando el precio rompe el límite superior del canal, establezca una tendencia de búsqueda de másca; Cuando el precio cae por debajo del límite inferior del canal, establezca una tendencia de búsqueda de menosca.

Principio de estrategia

Cálculo del indicador

El canal de precios se calcula con la siguiente fórmula:

Línea superior = máximo de N ciclos del precio más alto

Línea inferior = N ciclos mínimos del precio más bajo

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

Donde N representa la longitud del ciclo de la vía, que en esta estrategia es 50 .

Reglas de ingreso

Establecer posiciones de plus cuando el precio más alto de la línea K más reciente rompa el límite superior del canal;

Cuando el precio mínimo de la línea K más reciente cae por debajo de la línea inferior del canal, se establece una posición en blanco.

Ejemplo:

El punto más alto de la línea K no supera el límite superior del canal. El punto más alto de la línea K actual supera el límite superior del canal. === Creación de posiciones múltiples ===

Reglas de juego

Las reglas de salida son de dos opciones:

  1. La salida del canal

Pinto: el precio de parada es el límite inferior del canal;

El precio de parada es el límite superior del canal.

  1. La línea central

Cuando el precio vuelve a caer por debajo de la línea media del canal, se eliminan todas las posiciones, ya sean posiciones de más o de menos cabeza.

Control de riesgos

El control de riesgos utiliza un método de parada proporcional, que calcula la distancia de parada específica en función de la amplitud del canal y el porcentaje de riesgo aceptable de la configuración.

El precio de entrada * (1 - porcentaje de riesgo soportable)

Distancia de pérdidas en el aire = precio de entrada * (1 + porcentaje de riesgo soportable)

Por ejemplo, la opción de hacer más riesgo es de 2%, el precio de entrada es de \(10,000, y la línea de stop loss más simple es de 10,000 * (1 - 2%) = \)9,800.

Análisis de las ventajas

Capturando las tendencias

Cuando el precio supera el límite superior y inferior del canal, es muy probable que comience una nueva tendencia direccional. En este caso, la entrada puede capturar un cambio de precio más significativo.

El riesgo está bajo control

La adopción de stop loss proporcional puede controlar las pérdidas individuales dentro de los límites aceptables.

Optimización de parámetros con mucho espacio

Los parámetros como la longitud del ciclo de canal, la proporción de riesgo y la forma de detener el daño pueden ser combinados de manera óptima para adaptarse a un mayor número de entornos de mercado.

Análisis de riesgos

El fracaso de la brecha

El hecho de que el precio haya roto el límite superior o inferior del canal no significa que haya una tendencia inevitable, ya que existe la probabilidad de que no lo haga, lo que hace que sea fácil de detener.

El movimiento de la conmoción

Cuando el mercado se encuentra en una oscilación de amplitud, los precios pueden desencadenar frecuentemente el límite superior o inferior de un canal, lo que aumenta las tarifas de transacción y la pérdida de puntos de deslizamiento por el comercio demasiado frecuente.

Dirección de optimización

El canal dinámico

Se puede considerar la longitud de los canales de precios como una variable que se ajusta automáticamente según la volatilidad del mercado. Aumenta la longitud de los canales cuando el mercado se tambalea y reduce la longitud de los canales cuando la tendencia es clara.

Optimizar las oportunidades de ingreso

En combinación con otros indicadores de filtración de tiempo de entrada en juego, como el indicador de energía cuantitativa, el promedio móvil, etc., se evita la inutilidad de la ruptura en situaciones de temblor.

Regularidad de parámetros

Utiliza más datos históricos para optimizar la combinación de parámetros de prueba y determinar los parámetros óptimos para adaptarse a una situación de mercado más amplia.

Resumir

La estrategia de canal de precios dinámico en general es una estrategia de seguimiento de tendencias más simple e intuitiva. Su ventaja es que los indicadores son claros y fáciles de dominar; el control de riesgos es más razonable. Pero también hay algunos problemas que deben optimizarse aún más, como el manejo de brechas fallidas y mercados conmocionados.

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