Die Adaptive Moving Average Channel Breakout Strategie ist eine Trend-nachfolgende Breakout-Strategie, die auf dem Adaptive Moving Average (AMA) und einem adaptiven Kanalbereich zur Erzeugung von Handelssignalen basiert.
Der Kernindikator dieser Strategie ist der Adaptive Moving Average (AMA), der zur Erfassung der Kursentwicklung verwendet wird.
Das ist der Wert, der für die Berechnung der Vermögenswerte verwendet wird, wenn die Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte für die Berechnung der Vermögenswerte.
wobei P (t) der aktuelle Preis und α (t) die Glättungskonstante zwischen 0 und 1 ist. α (t) wird dynamisch nach bestimmten Regeln angepasst, um die Empfindlichkeit des AMA für Preisänderungen zu kontrollieren.
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
Wenn also die Preisschwankungen zunehmen, wird sich α ((t) erhöhen, um die AMA reagierender zu machen; wenn die Schwankungen abnehmen, wird sich α ((t) verringern, um die AMA glatter zu machen.
Auf der Grundlage der AMA erstellt die Strategie einen anpassungsfähigen Kanalbereich zur Erkennung von Preisbruchsignalen.
Oberste: H (t) = (1 + β*H (t-1)) * AMA (t)
Unterer: L (t) = (1 - β*L (t-1)) * AMA (t)
Hierbei ist β ein einstellbarer Parameter, der die Kanalbreite steuert.
Gehen Sie lang ein, wenn der Preis über die obere Ebene bricht.
Gehen Sie kurz ein, wenn der Preis unter den unteren Wert fällt.
Ansonsten bleiben Sie flach.
Zu den Vorteilen dieser Strategie gehören:
Der AMA ist im Vergleich zu einfachen gleitenden Durchschnitten, insbesondere in volatilen Märkten, flexibler bei der Erfassung von Kursentwicklungen.
Der adaptive Kanal kann seine Breite dynamisch anpassen, erweitert sich, wenn der Trend unklar ist, und verengt sich, wenn ein Trend auftritt.
Preis-Breakout-Signale können den Trend rechtzeitig erfassen, beginnt mit höheren Gewinnraten.
Die Logik ist einfach und klar, leicht verständlich und automatisiert für den quantitativen Handel.
Zu den Risiken dieser Strategie gehören:
Bei falschen AMA-Parametern können Kursentwicklungen verfehlt oder falsche Signale erzeugt werden.
Die Adaptivkanalparameter wie β müssen sorgfältig abgestimmt werden, da sonst zu viele Whipsaws oder verpasste Trends auftreten können.
Preisschwellen sind anfällig für falsche Breaks und erfordern mehr Filter.
Die Strategie beinhaltet weder Risikomanagement noch Stop-Loss-Mechanismen.
Die Strategie kann optimiert werden, indem:
Verbesserung der α-Berechnung, um die AMA reaktionsschneller zu machen.
Nach dem ersten Ausbruch wird eine weitere Bestätigung hinzugefügt, um falsche Signale zu vermeiden.
Die Anwendung von Filtern wie Volumen oder Volatilität zur Validierung der Breakout-Gültigkeit.
Einbeziehung von Trailing Stop Loss, um Gewinne zu erzielen und Risiken zu kontrollieren.
Optimierung der Positionsgröße für verschiedene Anlageklassen.
Zusammenfassend ist die Adaptive Moving Average Channel Breakout Strategie eine einfache und praktische Trend-folgende Breakout-Strategie. Sie verwendet die flexible AMA, um Preistrends zu verfolgen, und einen adaptiven Kanal, um Breakout-Signale zu erkennen. Die Strategie hat einige Vorteile, aber auch potenzielle Risiken. Mit Optimierungen wie Parameter-Tuning, Hinzufügen von Filtern und Verbesserung von Stops kann sie robuster werden. Insgesamt bietet sie ein solides Baseline-Modell für den quantitativen Handel.
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // CryptoStatistical - 2019 // AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading // https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857 strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD) testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=95) testPeriod() => true price = input(title='Price Source:', type=input.source, defval=close) ama = price hb = price lb = price // Static model parameters minfactor = 0. maxfactor = 1. deviation_max = 1. deviation_min = 1. beta_hb = 1. beta_lb = 1. snr = 1. normalized_atan= 0. alpha = 0.5 // Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1) // Sensitivity Lookback search for the best perdiod from 5 to 20 lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5) // Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5 beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1) offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001) // pi/2 pi2 = 1.5707963267948966 // Zero-lag resampled moving average (Durschner nwma) f_nwma(_src, _period) => fast = _period/2 lambda = _period/fast alpha = lambda * (_period - 1)/(_period - lambda) average1 = wma(_src,_period) average2 = wma(average1,fast) nwma = (1+alpha)*average1 - alpha*average2 ama := alpha[1]*price + (1-alpha[1])*nz(ama[1]) deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1]) deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1]) beta_hb := beta*deviation_max beta_lb := beta*deviation_min hb := (1 + beta_hb[1])*ama lb := (1 - beta_lb[1])*ama snr := if price > hb ((price - ama[1])/ama[1])/beta_lb else if price < lb -((price - ama[1])/ama[1])/beta_hb else 0 normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2) alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback) plot(ama, color=color.black) plot(hb, color=color.green) plot(lb, color=color.red) // Buy Condition Var bc = false // Sell Condition Var sc = false d = color.black // Buy Condition if(price > hb) bc := true d := color.green // Sell Condition if(price < lb) sc := true d := color.red if(testPeriod()) strategy.entry("Long", strategy.long, when = bc) strategy.entry("Short", strategy.short, when = sc) alertcondition(bc, title='BuyCondition', message='Buy') alertcondition(sc, title='SellCondition', message='Sell') plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0) plotshape(title='Sell', series=sc ? price * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)