Esta estrategia se desarrolla sobre la base del indicador del canal de precios Donchian. El indicador forma un canal de precios calculando los precios más altos y más bajos durante un cierto período. La estrategia utiliza el canal de precios para implementar operaciones bidireccionales y establece precios de stop loss y take profit. El precio de stop loss se fija a la línea media del canal de precios, y el precio de take profit se establece a un cierto porcentaje más allá de los límites superior e inferior del canal de precios. La estrategia también implementa el seguimiento de stop loss y take profit.
Primero, la estrategia calcula el límite superior h y el límite inferior l del canal de precios basándose en el parámetro pclen. El centro de la línea media es el promedio de los límites superior e inferior del canal de precios. Luego, los precios de take profit tpl y tps se calculan de acuerdo con los parámetros de take profit tp para posiciones largas y cortas. El precio de stop loss se fija en el centro de la línea media del canal de precios. Cuando el precio atraviesa el canal de precios, las posiciones de negociación de diferentes direcciones se calculan de acuerdo con los tamaños de riesgo posiciones risklong y riskshort. La estrategia cerrará cuando el precio vuelva a entrar en el canal. Además, el filtrado de tiempo está configurado para operar solo dentro del rango de fecha especificado.
La lógica de negociación específica es:
Signales de entrada larga: abre larga cuando el precio es mayor que el límite superior del canal h y cae de nuevo en el canal
Signales de salida larga: cierre largo cuando el precio es inferior al centro de la línea media del canal (stop loss) o superior al precio de toma de ganancias (take profit)
Signales de entrada corta: abre corto cuando el precio es inferior al límite inferior del canal l y cae de nuevo en el canal
Señales de salida corta: cierre corto cuando el precio es superior al centro de la línea media del canal (stop loss) o inferior al precio de toma de ganancias (take profit)
Las ventajas de esta estrategia son:
Esta estrategia también presenta algunos riesgos:
Estos riesgos pueden reducirse y controlarse mediante el ajuste de los parámetros y el seguimiento manual.
Esta estrategia también puede optimizarse en los siguientes aspectos:
En conclusión, esta es una estrategia efectiva para implementar el comercio bidireccional utilizando indicadores de canal de precios. Con los módulos de control de stop loss, take profit y tamaño de posición adecuados, los riesgos se pueden controlar bien. Con algunas optimizaciones y ajustes, puede convertirse en una poderosa estrategia de comercio cuantitativa.
/*backtest start: 2023-01-31 00:00:00 end: 2024-01-31 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2020 //@version=4 strategy(title = "Noro's RiskDonchian Strategy", shorttitle = "RiskDonchian str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") tp = input(defval = 20.0, minval = 1, title = "Take-profit, %") tptype = input(defval = "2. Fix", options = ["1. None", "2. Fix", "3. Trailing"], title = "Take-profit type") sltype = input(defval = "2. Center", options = ["1. None", "2. Center"], title = "Take-profit type") risklong = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %") riskshort = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %") pclen = input(50, minval = 1, title = "Price Channel Length") showll = input(true, defval = true, title = "Show lines") showbg = input(false, defval = false, title = "Show Background") showof = input(true, defval = true, title = "Show Offset") showlabel = input(true, defval = true, title = "Show label") 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 //Take-profit tpl = 0.0 tpl := tptype == "2. Fix" and strategy.position_size > 0 ? tpl[1] : h * (100 + tp) / 100 //Stop-loss tps = 0.0 tps := tptype == "2. Fix" and strategy.position_size < 0 ? tps[1] : l * (100 - tp) / 100 //Lines tplcol = showll and needlong and tptype != "1. None" ? color.lime : na pclcol = showll and needlong ? color.blue : na sllcol = showll and needlong and sltype != "1. None" ? color.red : na tpscol = showll and needshort and tptype != "1. None" ? color.lime : na pcscol = showll and needshort ? color.blue : na slscol = showll and needshort and sltype != "1. None" ? color.red : na offset = showof ? 1 : 0 plot(tpl, offset = offset, color = tplcol, title = "TP Long") plot(h, offset = offset, color = pclcol, title = "Channel High") plot(center, offset = offset, color = sllcol, title = "SL Long") plot(center, offset = offset, color = slscol, title = "SL Short") plot(l, offset = offset, color = pcscol, title = "Channel Low") plot(tps, offset = offset, color = tpscol, title = "TP Short") //Background size = strategy.position_size bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na bgcolor(bgcol, transp = 70) //Lot size risksizelong = -1 * risklong risklonga = ((center / h) - 1) * 100 coeflong = abs(risksizelong / risklonga) lotlong = (strategy.equity / close) * coeflong risksizeshort = -1 * riskshort riskshorta = ((center / l) - 1) * 100 coefshort = abs(risksizeshort / riskshorta) lotshort = (strategy.equity / close) * coefshort //Trading truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59) mo = 0 mo := strategy.position_size != 0 ? 0 : high >= center[1] and low <= center[1] ? 1 : mo[1] if h > 0 longlimit = tptype == "1. None" ? na : tpl longstop = sltype == "1. None" ? na : center strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime and mo) strategy.exit("TP Long", "Long", limit = longlimit, stop = longstop) shortlimit = tptype == "1. None" ? na : tps shortstop = sltype == "1. None" ? na : center strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime and mo) strategy.exit("Exit Short", "Short", limit = shortlimit, stop = shortstop) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short") if showlabel //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])) //Label min := round(min * 100) / 100 labeltext = "Drawdown: " + tostring(min) + "%" var label la = na label.delete(la) tc = min > -100 ? color.white : color.red osx = timenow + round(change(time)*10) osy = highest(100)