Chaîne de prix dynamique avec stratégie de suivi des pertes par arrêt

Auteur:ChaoZhang est là., Date: 2024-02-01 10:52:33 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie est développée sur la base de l'indicateur de canal de prix Donchian. L'indicateur forme un canal de prix en calculant les prix les plus élevés et les plus bas au cours d'une certaine période. La stratégie utilise le canal de prix pour mettre en œuvre le trading bidirectionnel et définit les prix de stop loss et take profit. Le prix de stop loss est fixé à la ligne médiane du canal de prix, et le prix de take profit est fixé à un certain pourcentage au-delà des limites supérieure et inférieure du canal de prix. La stratégie implémente également le suivi du stop loss et du take profit.

Principe de stratégie

La stratégie est basée sur le paramètre pclen. Le centre de la ligne du milieu est la moyenne des limites supérieures et inférieures du canal de prix. Ensuite, les prix de profit tpl et tps sont calculés en fonction des paramètres de profit tp pour les positions longues et courtes. Le prix de stop loss est fixé au centre de la ligne du canal de prix. Lorsque le prix traverse le canal de prix, les positions de trading de différentes directions sont calculées en fonction des positions de risque.

La logique de négociation spécifique est la suivante:

Signal d'entrée longue: ouverture longue lorsque le prix dépasse la limite supérieure du canal h et retombe dans le canal

Signal de sortie longue: close long lorsque le prix est inférieur au centre de la ligne médiane du canal (stop loss) ou supérieur au prix de prise de profit (take profit)

Signal d'entrée court: ouvrir court lorsque le prix est inférieur à la limite inférieure du canal l et retombe dans le canal

Signal de sortie courte: close short lorsque le prix est supérieur au centre de la ligne médiane du canal (stop loss) ou inférieur au prix de prise de profit (take profit)

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Les échanges bidirectionnels peuvent capturer les renversements des tendances des prix
  2. Utiliser le canal de prix pour déterminer la direction de la tendance et éviter les fausses ruptures
  3. Définir un stop loss et un profit pour contrôler les risques
  4. Calculer la taille de la position associée à la taille du risque pour obtenir des risques contrôlables
  5. Mettre en œuvre le suivi des arrêts de perte et des bénéfices pour obtenir plus de bénéfices

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Des paramètres incorrects du canal de prix peuvent entraîner une fréquence de négociation trop élevée ou des opportunités de négociation manquées
  2. Le prix de stop loss trop élevé peut augmenter l'exposition au risque
  3. Le suivi des bénéfices peut être déclenché prématurément en période de forte volatilité

Ces risques peuvent être réduits et maîtrisés par l'ajustement des paramètres et la surveillance manuelle.

Directions d'optimisation

Cette stratégie peut également être optimisée dans les aspects suivants:

  1. Ajouter plus de filtres d'indicateur pour éviter des ouvertures et des fermetures fréquentes sur les marchés à fourchette
  2. Différents algorithmes de stop loss et de take profit peuvent être testés, tels que ATR stop loss
  3. Élargir à un système de négociation intertemporel utilisant un délai plus long pour déterminer la direction de la tendance
  4. Ajouter un module de dimensionnement des positions pour ajuster les positions en fonction du ratio d'utilisation du capital
  5. Incorporer des modèles d'apprentissage automatique pour juger du taux de réussite des ruptures de prix afin d'éviter les fausses ruptures

Conclusion

En conclusion, il s'agit d'une stratégie efficace pour mettre en œuvre le trading bidirectionnel à l'aide d'indicateurs de canal de prix.


/*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)

Plus de