Diese Strategie erzeugt Preisbänder basierend auf der glatten Volatilität des Preises und erzeugt Handelssignale, wenn der Preis die Bands durchbricht.
Die Strategie berechnet zunächst die durchschnittliche Volatilitätsspanne des Preises über einen bestimmten Zeitraum, glättet dann die Volatilitätsspanne mit einem exponentiellen gleitenden Durchschnitt, um eine glättete Volatilität zu erzeugen. Die glättete Volatilität multipliziert mit einem Koeffizienten gibt die Bandspanne. Wenn der Preis über das obere Band bricht, wird ein Kaufsignal generiert. Wenn der Preis unter das untere Band bricht, wird ein Verkaufssignal generiert.
Im Einzelnen wird die glatte Volatilität smrng durch die Smoothrng-Funktion berechnet. Das obere Band hband und das untere Band lband der Preisbänder werden dann auf der Grundlage von smrng berechnet. Auf dieser Grundlage werden die Long-Bedingung longCondition und die Short-Bedingung shortCondition eingerichtet. Wenn die LongCondition erfüllt ist, wird ein Kaufsignal generiert. Wenn die ShortCondition erfüllt ist, wird ein Verkaufssignal generiert.
Die Vorteile dieser Strategie sind:
Die Verwendung von Preisschwankungen zur Konstruktion von Handelssignalen kann Marktveränderungen wirksam verfolgen.
Eine glättende Volatilität mit einem exponentiellen gleitenden Durchschnitt kann Lärm filtern und zuverlässigere Handelssignale erzeugen.
Die Bandbreite kann durch den Volatilitätskoeffizienten angepasst werden, wodurch die Strategie flexibler wird.
In Kombination mit dem Breakout-Urteil kann es Handelschancen rechtzeitig erfassen, wenn eine Trendwende eintritt.
Diese Strategie birgt auch einige Risiken:
Bei abnormaler Marktvolatilität kann die glättete Volatilität die tatsächliche Volatilität möglicherweise nicht genau widerspiegeln, was zu falschen Signalen führt.
Eine unsachgemäße Einstellung des Bandbereichs kann zu einem Überhandel oder zu unzureichenden Signalen führen.
Es gibt eine zeitliche Verzögerung bei den Ausbruchssignalen, was zu einem vorzeitigen oder verspäteten Eintritt führen kann.
Die Strategie kann optimiert werden, indem:
Prüfung verschiedener Preisdatenzyklen, um den am besten geeigneten Zeitraum für die Berechnung der Volatilität zu finden.
Versuche verschiedene gleitende Durchschnittsalgorithmen, wie den gewichteten gleitenden Durchschnitt.
Einführung von Handelsvolumen oder anderen Indikatoren zur Bestätigung von Ausbruchssignalen.
Einstellung von Stop Loss oder Trailing Stop zur Kontrolle von Verlusten pro Handel.
Optimierung des Volatilitätskoeffizienten-Mult zur Bestimmung des optimalen Bandbereichs.
Die allgemeine Logik dieser Strategie ist klar, wobei die Preisvolatilität zur Konstruktion von Bands und Preisbreaks zur Erzeugung von Handelssignalen verwendet wird, die Markttrendänderungen effektiv verfolgen können.
/*backtest start: 2023-01-22 00:00:00 end: 2024-01-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true) // Source src = input(defval=close, title="Source") // Sampling Period per = input(defval=100, minval=1, title="Sampling Period") // Range Multiplier mult = input(defval=3.0, minval=0.1, title="Range Multiplier") // Smooth Average Range smoothrng(x, t, m) => wper = (t * 2) - 1 avrng = ema(abs(x - x[1]), t) smoothrng = ema(avrng, wper) * m smoothrng smrng = smoothrng(src, per, mult) // Range Filter rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r)) rngfilt filt = rngfilt(src, smrng) // Filter Direction upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) // Target Bands hband = filt + smrng lband = filt - smrng // Breakouts longCondition = (src > filt) and (src > src[1]) and (upward > 0) shortCondition = (src < filt) and (src < src[1]) and (downward > 0) strategy.entry("Buy", strategy.long, when = longCondition) strategy.entry("Sell", strategy.short, when = shortCondition) // Plotting plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter") hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target") lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target") // Fills fill(hbandplot, lbandplot, color=color.aqua, title="Target Range") // Bar Color barcolor(longCondition ? color.green : shortCondition ? color.red : na) // Alerts alertcondition(longCondition, title="Buy Alert", message="BUY") alertcondition(shortCondition, title="Sell Alert", message="SELL")