Stratégie de suivi des tendances basée sur l'ATR et l'indice de volatilité

Auteur:ChaoZhang est là., Date: 2024-01-04 15h31 et 34 min
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indice Average True Range (ATR) et l'indice CHOP comme principaux indicateurs techniques pour identifier et suivre les tendances.

Principe de stratégie

  1. Utilisez ATR pour calculer la taille de la boîte et construire le canal Renko pour déterminer la direction de la tendance des prix.

  2. Appliquez l'indice CHOP pour juger si le marché est adapté à la négociation. Cet indice intègre le prix le plus élevé, le prix le plus bas et l'ATR. Lorsqu'il se situe entre 38,2 et 61,8, il indique une faible volatilité du marché; sinon, il indique une forte volatilité et un marché de négociation inapproprié.

  3. Lorsque l'indice CHOP dépasse le niveau supérieur de 61,8, le prix entre dans une tendance à la baisse. Si l'EMA rapide à court terme montre également que le prix est en tête, passez court. Inversement, lorsque le CHOP dépasse le niveau inférieur de 38,2 et que l'EMA à court terme monte, passez long.

  4. Utilisez la stratégie stop loss/take profit. Lorsque le prix rentre dans la zone de la ceinture 38.2-61.8 de CHOP, fermez la position avec stop loss ou take profit.

Analyse des avantages

Cette stratégie combine le jugement des tendances et le contrôle de la volatilité, qui peuvent à la fois capturer les tendances des prix et contrôler les risques.

  1. Le canal Renko construit par ATR peut suivre efficacement les tendances des prix.

  2. L'indice CHOP évalue le taux de volatilité du marché afin d'éviter des transactions incorrectes en cas de fortes fluctuations.

  3. La combinaison d'une EMA rapide pour déterminer la direction de la tendance à court terme évite une opération inverse.

  4. La stratégie stop loss/take profit contrôle une seule perte.

Analyse des risques

Les principaux risques auxquels cette stratégie est confrontée:

  1. Dans le marché latéral, les signaux ATR et CHOP peuvent produire des signaux incorrects.

  2. Une combinaison d'indicateurs techniques uniques ne peut pas éviter complètement les pertes.

  3. La position de stop-loss réglée trop lâchement peut entraîner une perte unique surdimensionnée.

Direction de l'optimisation

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

  1. Augmenter d'autres indicateurs auxiliaires pour déterminer les signaux, tels que les modèles de chandeliers, le volume, etc. pour améliorer la précision du signal.

  2. Optimiser les paramètres de l'ATR et du CHOP pour mieux capturer les fluctuations des prix.

  3. Mettre en place des positions stop loss/take profit dynamiques pour des marges bénéficiaires plus élevées et un stop loss plus rapide.

  4. Détailler correctement la plage de stop-loss après avoir déterminé la tendance principale pour obtenir plus de profits dans la tendance.

Conclusion

Cette stratégie intègre des indicateurs techniques couramment utilisés et est simple et pratique. Avec un ajustement et une optimisation des paramètres, des effets de suivi satisfaisants peuvent être obtenus. Mais elle nécessite toujours un jugement manuel des principales tendances et ne peut pas être entièrement automatisée. Elle peut servir d'outil de prise de décision auxiliaire et de référence pour d'autres stratégies.


/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © sharatgbhat

//@version=4
strategy("Weis Chop Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10,max_lines_count = 500, max_labels_count = 500)
maxIdLossPcnt = input(1, "Max Intraday Loss(%)", type=input.float)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=input.float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating = input(defval=false, type=input.bool, title="Oscillating")
normalize = input(defval=false, type=input.bool, title="Normalize")
vol = useTrueRange == "Always" or useTrueRange == "Auto" and na(volume) ? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close / methodvalue

currclose = float(na)
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = int(na)
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol / barcount : vol

plot(isOscillating and directionIsDown ? -res : res, style=plot.style_columns, color=directionIsUp ? color.green : color.red, transp=75, linewidth=3, title="Wave Volume")

length = input(14, minval=1)
ci = 100 * log10(sum(atr(1), length) / (highest(length) - lowest(length))) / log10(length)
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(ci, "CHOP", color=#2962FF, offset = offset)
band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color = color.rgb(33, 150, 243, 90), title = "Background")

MomentumBull = close>ema(close,8)
MomentumBear = close<ema(close,8)
Tradecon = crossunder(ci,61.8)

if (MomentumBull and directionIsUp and Tradecon)
	strategy.entry("Buy", strategy.long)
if (MomentumBear and directionIsDown and Tradecon )
    strategy.entry("Sell", strategy.short)
    strategy.exit("exit","Buy",when=directionIsDown,qty_percent=100,profit=20,loss=10)
    strategy.exit("exit","Sell",when=directionIsUp,qty_percent=100,profit=20,loss=10)
    

Plus de