Strategie zur Trendverfolgung auf Basis von ATR und Volatilitätsindex

Schriftsteller:ChaoZhang, Datum: 2024-01-04 15:31:34
Tags:

img

Übersicht

Diese Strategie verwendet den Average True Range (ATR) und den CHOP-Index als die wichtigsten technischen Indikatoren, um Trends zu identifizieren und zu verfolgen.

Strategieprinzip

  1. Verwenden Sie ATR, um die Boxgröße zu berechnen und den Renko-Kanal zu konstruieren, um die Kurstrendrichtung zu bestimmen.

  2. Der CHOP-Index wird angewendet, um zu beurteilen, ob der Markt für den Handel geeignet ist. Dieser Index enthält den höchsten Preis, den niedrigsten Preis und den ATR. Wenn er zwischen 38,2 und 61,8 liegt, zeigt er eine geringe Marktvolatilität an; andernfalls signalisiert er eine hohe Volatilität und einen ungeeigneten Handelsmarkt.

  3. Wenn der CHOP-Index die oberen 61,8 durchbricht, tritt der Preis in einen Abwärtstrend ein. Wenn die kurzfristige schnelle EMA auch zeigt, dass der Preis führend ist, gehen Sie kurz. Umgekehrt, wenn der CHOP die unteren 38,2 durchbricht und die kurzfristige EMA steigt, gehen Sie lang.

  4. Verwenden Sie die Stop-Loss-/Take-Profit-Strategie. Wenn der Preis wieder in den 38.2-61.8-Gürtelbereich von CHOP eintritt, schließen Sie die Position mit Stop-Loss oder Take-Profit.

Analyse der Vorteile

Diese Strategie kombiniert Trendbeurteilung und Volatilitätskontrolle, die sowohl Preistrends erfassen als auch Risiken kontrollieren kann.

  1. Der von ATR aufgebaute Renko-Kanal kann die Preisentwicklung effektiv verfolgen.

  2. Der CHOP-Index beurteilt die Volatilitätsrate des Marktes, um bei heftigen Schwankungen einen falschen Handel zu vermeiden.

  3. Die Kombination von schnellen EMA zur Bestimmung der kurzfristigen Trendrichtung verhindert eine umgekehrte Operation.

  4. Die Stop-Loss/Take-Profit-Strategie steuert einzelne Verluste.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind:

  1. Bei seitlichem Markt können ATR-Kanal- und CHOP-Signale falsche Signale erzeugen.

  2. Eine Kombination einzelner technischer Indikatoren kann Verluste nicht vollständig vermeiden.

  3. Eine zu locker eingestellte Stop-Loss-Position kann zu einem übergroßen Einzelverlust führen.

Optimierungsrichtung

Diese Strategie kann in folgenden Aspekten optimiert werden:

  1. Erhöhen Sie andere Hilfsindikatoren, um Signale zu bestimmen, wie Kerzenmuster, Lautstärke usw., um die Genauigkeit des Signals zu verbessern.

  2. Optimierung der Parameter von ATR und CHOP, um Preisschwankungen besser zu erfassen.

  3. Einstellen dynamischer Stop-Loss-/Take-Profit-Positionen für größere Gewinnspannen und schnellere Stop-Loss-Positionen.

  4. Nach der Bestimmung des Haupttrends den Stop-Loss-Bereich ordnungsgemäß lockern, um mehr Gewinn aus dem Trend zu erzielen.

Schlussfolgerung

Diese Strategie integriert allgemein verwendete technische Indikatoren und ist einfach und praktisch. Mit Parameteranpassung und Optimierung können zufriedenstellende Tracking-Effekte erzielt werden. Aber sie erfordert immer noch manuelles Urteilen über wichtige Trends und kann nicht vollständig automatisiert werden. Sie kann als Hilfsentscheidungsinstrument und Referenz für andere Strategien dienen.


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

Mehr