Suivre la stratégie basée sur la tendance ZigZag

Auteur:ChaoZhang est là., Date: 2023-10-30 14:51:08 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indicateur ZigZag pour déterminer la direction de la tendance et suit la tendance une fois confirmée.

La logique de la stratégie

La stratégie utilise principalement l'indicateur ZigZag pour déterminer la direction de la tendance des prix. ZigZag peut filtrer le bruit du marché et identifier les principales directions de fluctuation des prix.

Plus précisément, la stratégie calcule d'abord les valeurs de ZigZag. Lorsque les prix atteignent un plus haut niveau, la valeur de ZigZag devient le prix élevé. Lorsque les prix atteignent un plus bas bas, la valeur de ZigZag devient le prix bas. Ainsi, ZigZag peut clairement refléter la direction principale de la fluctuation des prix.

La stratégie détermine la direction de la tendance en fonction des valeurs de ZigZag. Lorsque ZigZag augmente, cela indique une tendance à la hausse. Lorsque ZigZag tombe, cela indique une tendance à la baisse. La stratégie ouvre des positions lorsque ZigZag se retourne pour suivre la direction de la tendance.

En particulier, la stratégie va long lorsque ZigZag tourne vers un nouveau sommet, et va court lorsque ZigZag tourne vers un nouveau bas.

Analyse des avantages

  • ZigZag peut filtrer efficacement le bruit du marché et déterminer avec précision la direction de la tendance principale.
  • Le chronométrage des virages ZigZag est précis, permettant des opportunités d'entrée optimales.
  • Il met en œuvre une pure tendance en suivant une stratégie sans autres indicateurs ou modèles complexes.
  • La logique est simple et claire, facile à comprendre et à modifier.
  • La fréquence de négociation peut être librement contrôlée par réglage de paramètres.

Analyse des risques

  • ZigZag est insensible aux renversements de tendance à moyen terme, manquant potentiellement des renversements plus rapides.
  • Les stratégies qui suivent la tendance ne peuvent pas gérer les pertes résultant d'inversions de tendance.
  • Il ne limite pas la taille des pertes des transactions uniques, ce qui pose de gros risques de pertes uniques.
  • La stratégie repose uniquement sur un seul indicateur, il y a des risques de surajustement.

Les risques peuvent être réduits par:

  • Combiner d'autres indicateurs pour détecter les risques d'inversion de tendance.
  • Réduction de la durée de détention, arrêt des pertes en temps opportun.
  • Ajout de la gestion des risques pour limiter la taille des pertes uniques.
  • Ajout de modèles d'apprentissage automatique pour améliorer la robustesse.

Directions d'optimisation

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

  1. L'exposition au risque de perte unique est contrôlée par l'ajout d'un stop loss, par exemple un stop limit ou un stop trailing.

  2. Ajouter des mécanismes de détection de l'inversion de tendance, par exemple MACD, moyennes mobiles. Fermer les positions lorsque l'inversion est détectée.

  3. Ajoutez le module de rentrée, les positions pyramidales quand la tendance continue.

  4. Ajouter des modèles d'apprentissage automatique comme LSTM pour aider à la détection de tendance.

  5. Optimiser la gestion des capitaux sur la base de théories de la réduction ou de la corrélation.

  6. Optimiser de manière complète des paramètres tels que la période ZigZag par le backtesting et l'expertise de référence.

Résumé

La stratégie identifie la direction de la tendance par ZigZag et négocie la tendance. La logique est simple et facile à mettre en œuvre. Mais des risques tels que la dépendance à un seul indicateur et l'inversion de tendance existent. Nous pouvons optimiser via stop loss, indicateurs auxiliaires, réentrée, modèles d'apprentissage automatique, etc. pour le rendre plus robuste et rationnel. Avec des paramètres et des contrôles de risque appropriés, il peut suivre efficacement les tendances à moyen et long terme.


/*backtest
start: 2022-10-23 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's ZZ Strategy v1.0", shorttitle = "ZZ str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
tf = input('W', title='Timeframe for ZigZag')
showzz = input(false, defval = false, title = "Show ZigZag")
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")

//ZigZag
zigzag() =>
    _isUp = close >= open
    _isDown = close <= open
    _direction = _isUp[1] and _isDown ? -1 : _isDown[1] and _isUp ? 1 : nz(_direction[1])
    _zigzag = _isUp[1] and _isDown and _direction[1] != -1 ? highest(2) : _isDown[1] and _isUp and _direction[1] != 1 ? lowest(2) : na
useAltTF = true
zz = useAltTF ? (change(time(tf)) != 0 ? request.security(syminfo.tickerid, tf, zigzag()) : na) : zigzag()
zzcolor = showzz ? black : na
plot(zz, title = 'ZigZag', color = zzcolor, linewidth = 2)

//Levels
dot = zz > 0 ? zz : dot[1]
uplevel = dot > dot[1] ? dot : uplevel[1]
dnlevel = dot < dot[1] ? dot : dnlevel[1]
colorup = close[1] < uplevel[1] and uplevel == uplevel[1] ? lime : na
colordn = close[1] > dnlevel[1] and dnlevel == dnlevel[1] ? red : na
plot(uplevel, color = colorup, linewidth = 3)
plot(dnlevel, color = colordn, linewidth = 3)

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size != size[1] ? blue : na
bgcolor(bgcol, transp = 50)

//Trading
lot = strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1]

if uplevel > 0 and dnlevel > 0
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel + syminfo.mintick)
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel - syminfo.mintick)

if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Plus de