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.
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.
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
Hay dos reglas de salida opcionales:
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;
No importa las posiciones largas o cortas, cierre todas las posiciones cuando los precios caigan por debajo de la línea media del canal.
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.
Cuando los precios rompen los límites superior e inferior del canal, es muy probable que comience una nueva tendencia direccional.
El uso de un stop loss proporcional puede mantener las pérdidas individuales dentro de un rango aceptable.
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.
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.
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.
Considere hacer de la longitud del canal de precios una variable que se ajuste automáticamente en función de la volatilidad del mercado.
Combinar otros indicadores para filtrar el momento de entrada, como indicadores de volumen, medias móviles, etc., para evitar rupturas ineficaces en mercados oscilantes.
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.
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)