La stratégie de rupture de canal de prix dynamique est une stratégie de négociation quantitative basée sur l’indicateur de canal de prix Donchian. La stratégie détermine la direction de la tendance du marché en fonction des lignes supérieures et inférieures du canal de prix et établit des positions de plus ou de moins lorsque le prix franchit le canal.
L’idée principale de cette stratégie est d’utiliser des ruptures du canal de prix de Donchan. Lorsque le prix franchit la limite supérieure du canal, établir une tendance à la recherche d’une position plus élevée; lorsque le prix tombe sous la limite inférieure du canal, établir une tendance à la recherche de la position plus basse.
Le canal de prix est calculé par la formule suivante:
Ligne supérieure = maximale de N cycles de prix le plus élevé
Le seuil inférieur = le plus bas de N cycles.
La ligne médiane est égale à (ligne de limite supérieure + ligne de limite inférieure) / 2
où N représente la longueur du cycle de passage, la stratégie prend par défaut 50 .
la création d’une position en plus lorsque le prix le plus élevé de la dernière ligne K dépasse la limite supérieure du canal;
Une position de couverture est créée lorsque le prix le plus bas de la ligne K la plus récente tombe au-dessous de la limite inférieure du canal.
Par exemple:
Le point le plus élevé de la ligne K n’a pas dépassé la limite supérieure du canal. Le point le plus élevé de la ligne K a dépassé la limite supérieure du canal. ==> Création de postes multiples
Il y a deux possibilités de règles de sortie:
Pinto: le prix stop est le seuil inférieur du canal;
Le prix d’arrêt est la limite supérieure de la porte.
Lorsque le cours revient au-dessous de la ligne médiane du canal, tous les positions, qu’elles soient en position multiple ou en position vide, sont annulées.
Le contrôle des risques utilise une méthode d’arrêt proportionnel, calculant la distance d’arrêt spécifique en fonction de l’amplitude du passage et du pourcentage de risque acceptable du réglage.
Le stop-loss est égal au prix d’entrée * (1 - pourcentage de risque acceptable)
Distance de stop loss à l’air = prix d’entrée * (1 + pourcentage de risque supporté)
Par exemple, un placement de plus de 2% de risque, un prix d’entrée de 10 000 \( et un stop-loss de plus de 10 000 * (1 - 2%) = 9 800 \).
Une nouvelle tendance directionnelle est très probablement amorcée lorsque le prix franchit la limite supérieure ou inférieure du canal. L’entrée peut alors capturer des variations de prix plus importantes.
L’utilisation d’un stop-loss proportionnel permet de limiter les pertes ponctuelles à des niveaux acceptables.
Les paramètres tels que la longueur du cycle du canal, le ratio de risque et la méthode d’arrêt peuvent être combinés de manière optimale pour s’adapter à un environnement de marché plus large.
La rupture de la limite supérieure ou inférieure d’un canal ne signifie pas nécessairement la formation d’une tendance, il existe une probabilité d’une rupture défaillante, ce qui est facile à arrêter.
Lorsque le marché est en pleine oscillation, les prix peuvent souvent déclencher des limites supérieures et inférieures de la chaîne, ce qui entraîne des frais de transaction et des pertes de points de glissement en raison d’une trop grande fréquence des transactions.
On peut considérer la longueur des canaux de prix comme une variable qui s’ajuste automatiquement en fonction de la volatilité du marché. La longueur des canaux augmente lorsque le marché est volatile et diminue lorsque la tendance est claire.
Le filtrage des temps d’entrée en jeu, combiné à d’autres indicateurs, tels que l’indicateur de quantité d’énergie, la moyenne mobile, etc., permet d’éviter une rupture inefficace en cas de choc.
Utiliser plus de données historiques pour tester et optimiser les combinaisons de paramètres afin d’identifier les paramètres optimaux adaptés à une situation plus large du marché.
La stratégie de canal de prix dynamique est généralement une stratégie de suivi de tendance plus simple et intuitive. Son avantage est que les signaux sont clairs et faciles à maîtriser; le contrôle des risques est plus raisonnable. Mais il y a aussi des problèmes à optimiser davantage, tels que le traitement des ruptures de défaillance et des marchés de choc.
/*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)