Stratégie de rupture de canal de prix dynamique


Date de création: 2023-12-13 16:03:37 Dernière modification: 2023-12-13 16:03:37
Copier: 3 Nombre de clics: 388
1
Suivre
1166
Abonnés

Stratégie de rupture de canal de prix dynamique

Aperçu

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.

Principe de stratégie

Calcul de l’indicateur

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 .

Règles d’entrée

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

Règles de jeu

Il y a deux possibilités de règles de sortie:

  1. La sortie du canal

Pinto: le prix stop est le seuil inférieur du canal;

Le prix d’arrêt est la limite supérieure de la porte.

  1. L’arrivée au centre

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.

Contrôle des risques

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 \).

Analyse des avantages

Capturer une tendance à la hausse

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.

Les risques sont maîtrisés

L’utilisation d’un stop-loss proportionnel permet de limiter les pertes ponctuelles à des niveaux acceptables.

Optimiser les paramètres avec de la place

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.

Analyse des risques

La percée est un échec

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.

Les tremblements de terre

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.

Direction d’optimisation

Le canal dynamique

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.

Optimiser les opportunités d’entrée

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.

Régularisation des paramètres

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é.

Résumer

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.

Code source de la stratégie
/*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)