La stratégie de rupture dynamique du canal de prix est une stratégie de trading quantitative basée sur l'indicateur Donchian Price Channel.
L'idée principale de cette stratégie est d'utiliser les ruptures du canal de prix Donchan. Lorsque le prix franchit la limite supérieure du canal, établir une position longue pour rechercher la tendance; Lorsque le prix franchit la limite inférieure du canal, établir une position courte pour rechercher la tendance.
Le canal de prix est calculé selon les formules suivantes:
Ligne supérieure = plus haut niveau au cours des N dernières périodes
Ligne inférieure = Basse inférieure au cours des N dernières périodes
Ligne du milieu = (Ligne supérieure + Ligne inférieure) / 2
où N représente la longueur du cycle du canal. La valeur par défaut est 50 pour cette stratégie.
Lorsque le prix le plus élevé de la dernière ligne K franchit la limite supérieure du canal, établir une position longue;
Lorsque le prix le plus bas de la dernière ligne K franchit la limite inférieure du canal, établir une position courte.
Exemple:
Le point culminant de la ligne K précédente ne dépassait pas la limite supérieure du canal;
Le point culminant de la ligne K de courant traverse la limite supérieure du canal;
Établissez une position longue
Il existe deux règles de sortie facultatives:
Fermeture de position longue: le prix du stop loss est la limite inférieure du canal;
Position courte fermée: le prix du stop loss est la limite supérieure du canal;
Peu importe les positions longues ou courtes, fermez toutes les positions lorsque les prix retombent en dessous de la ligne médiane du canal.
Le contrôle des risques adopte un stop loss proportionnel pour calculer la distance de stop loss spécifique en fonction de l'amplitude du canal et du pourcentage de risque acceptable.
Le montant de l'exposition au risque de défaillance de l'entreprise est calculé à partir de la valeur de l'exposition au risque.
La valeur de l'échange de titres est la valeur de l'échange de titres.
Par exemple, si le risque acceptable est fixé à 2%, le prix d'entrée est de 10 000 $, alors la ligne de stop loss pour une position longue est de 10 000 * (1 - 2%) = 9 800 $.
Lorsque les prix franchissent les limites supérieure et inférieure du canal, il est fort probable qu'une nouvelle tendance directionnelle commence.
L'utilisation d'un stop loss proportionnel peut maintenir les pertes uniques dans une plage acceptable.
Des paramètres tels que le cycle du canal, le ratio de risque, la méthode de stop loss peuvent être optimisés et combinés pour s'adapter à davantage d'environnements de marché.
Les écarts de prix des limites de canal ne constituent pas nécessairement une tendance, il existe une probabilité d'échec des écarts, ce qui est susceptible de provoquer un stop loss.
Lorsque le marché est limité à une fourchette, les prix peuvent fréquemment toucher les limites supérieure et inférieure du canal, ce qui entraîne une négociation trop fréquente, augmentant ainsi les coûts de transaction et les pertes par glissement.
Considérez de faire de la longueur du canal de prix une variable qui s'ajuste automatiquement en fonction de la volatilité du marché.
Combiner d'autres indicateurs pour filtrer le calendrier d'entrée, tels que les indicateurs de volume, les moyennes mobiles, etc., afin d'éviter des ruptures inefficaces sur les marchés oscillants.
Utiliser plus de données historiques pour tester et optimiser les combinaisons de paramètres afin de déterminer les paramètres optimaux pour s'adapter aux conditions plus larges du marché.
La stratégie de canal de prix dynamique est généralement une stratégie de suivi des tendances relativement simple et intuitive. Ses avantages sont des signaux clairs et faciles à saisir; Le contrôle des risques est relativement raisonnable. Mais il y a encore quelques problèmes à optimiser, tels que la gestion des échecs et des marchés oscillants. Cette stratégie est plus appropriée comme outil auxiliaire pour le trading de tendances, et l'effet sera meilleur lorsqu'elle est combinée avec d'autres indicateurs ou modèles techniques.
/*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)