Stratégie de rupture dynamique du canal de prix

Auteur:ChaoZhang est là., Date: 2023-12-13 16h03:37 Je suis désolé
Les étiquettes:

img

Résumé

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.

Principe de stratégie

Calcul des indicateurs

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.

Règles d'entrée

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

Règles de sortie

Il existe deux règles de sortie facultatives:

  1. Sortie du canal

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;

  1. Sortie de la ligne du milieu

Peu importe les positions longues ou courtes, fermez toutes les positions lorsque les prix retombent en dessous de la ligne médiane du canal.

Contrôle des risques

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

Analyse des avantages

Capturez les tendances

Lorsque les prix franchissent les limites supérieure et inférieure du canal, il est fort probable qu'une nouvelle tendance directionnelle commence.

Risques maîtrisables

L'utilisation d'un stop loss proportionnel peut maintenir les pertes uniques dans une plage acceptable.

Espace d'optimisation de paramètres de grande taille

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

Analyse des risques

Des évasions échouées

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.

Marché lié à la plage

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.

Directions d'optimisation

Chaîne dynamique

Considérez de faire de la longueur du canal de prix une variable qui s'ajuste automatiquement en fonction de la volatilité du marché.

Optimisez vos possibilités d'entrée

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.

Optimisation des paramètres

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

Résumé

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)

Plus de