Dynamische Durchbruchsstrategie für Kanäle

Schriftsteller:ChaoZhang, Datum: 2024-02-27 15:15:07
Tags:

img

Übersicht

Diese Strategie verwendet den Keltner-Kanal-Indikator in Kombination mit gleitenden Durchschnittslinien, um dynamische Ausbruchkäufe und -verkaufspreise festzulegen, um Durchbruchstransaktionen mit niedrigem Kauf-hohem Verkauf zu erzielen.

Strategieprinzip

  1. Berechnung des Kanalmedians: Verwenden Sie den exponentiellen gleitenden Durchschnitt, um den Preismedian des Kanals zu berechnen
  2. Berechnen Sie die Kanalbandbreite: Verwenden Sie den gleitenden Durchschnitt der wahren Volatilität, der durchschnittlichen wahren Volatilität oder der Preisamplitude zur Berechnung der Kanalbandbreite
  3. Ober- und Unterschiene des Kanals: Median ± N mal Bandbreite des Kanals
  4. Eintrittsanordnung: Wenn der Preis die obere Schiene berührt, setzen Sie den Durchbruch Kaufpreis und warten auf den Durchbruch; wenn der Preis die untere Schiene berührt, setzen Sie den Durchbruch Verkaufspreis und warten auf den Durchbruch
  5. Exit-Order: Stop-Loss, wenn der Preis nach dem Kauf wieder auf den Median fällt oder wenn der höchste Preis den Einstiegspreis übersteigt; Stop-Loss, wenn der Preis nach dem Verkauf wieder auf den Median fällt oder wenn der niedrigste Preis unter dem Einstiegspreis liegt

Analyse der Vorteile

  1. Die Verwendung dynamischer Kanäle kann Veränderungen der Marktentwicklung schnell erfassen
  2. Die Verwendung des Medians ist für die Beurteilung der Kursentwicklung günstig
  3. N mal Bandbreiten-Einstellung macht den Kanalbereich vernünftig, um häufige Positionsanpassungen zu vermeiden
  4. Durchbruchmechanismen entsprechen der Trendtheorie und folgen dem Trend
  5. Die Festlegung von Stop-Loss-Bedingungen kontrolliert die Risiken streng

Risikoanalyse

  1. Die Auswahl der Methode zur Berechnung der Medianlinie beeinflusst den Matching-Effekt des Kanalbereichs und der Preise
  2. Zu große oder zu kleine N-Multiplikatoren beeinflussen die Rendite der Strategie
  3. Durchbruchskäufe und -verkäufe bilden in der Regel falsche Signale und sollten strikt ausgeschlossen werden

Optimierungsrichtlinien

  1. Versuchen Sie verschiedene Medianlinie Berechnungsmethoden die optimalen Parameter zu finden
  2. Versuche verschiedene N-Werte, um den optimalen Multiplikator zu finden
  3. Erhöhen Sie die Durchbruch Amplitude, um falsche Signale zu vermeiden
  4. Optimierung der Stop-Loss-Logik zur strikten Kontrolle einzelner Verluste

Zusammenfassung

Die Gesamtstrategie verwendet wissenschaftliche und vernünftige Methoden, um Preistrends und -richtungen durch dynamische Kanalindikatoren zu beurteilen, legt angemessene Parameter fest, um Durchbruchssignale zu erfassen, erzielt niedrigen Kauf-hohen Verkauf und erzielt überschüssige Renditen. Gleichzeitig optimieren Sie kontinuierlich die Risiken der Strategie, damit sie in verschiedenen Märkten stabil ablaufen kann.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
     : na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
     : na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (src < ma or high >= bprice )
cancelScond = crossScond and (src > ma or low <= sprice )
if (cancelBcond)
	strategy.cancel("KltChLE")
if (crossUpper)
	strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
	strategy.cancel("KltChSE")
if (crossLower)
	strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

Mehr