Die doppelte gleitende Durchschnitts-Matching-Strategie basierend auf Bollinger Bands ist eine Trend-folgende Strategie, die mit Preis und Volumen auf dem Markt abläuft.
Diese Strategie basiert hauptsächlich auf den Crossover-Signalen des Bollinger Bands-Indikators und dem gleitenden Durchschnittsindikator für den Handel. Insbesondere verwendet sie die mittlere Schiene, die obere Schiene der Bollinger Bands und 7 gleitende Durchschnitte mit Längen von 5 bis 200 Tagen gleichzeitig. Sie erzeugt ein Kaufsignal, wenn der Preis von unten nach oben durch die mittleren und unteren Schienen der Bollinger Bands bricht; sie erzeugt ein Verkaufssignal, wenn der Preis von oben nach unten durch die obere Schiene der Bollinger Bands bricht, um den folgenden Trend zu erreichen.
Darüber hinaus führt die Strategie auch den MoveToFract-Indikator zur Beurteilung von Long- und Short-Positionen ein. Dieser Indikator bestimmt, ob der aktuelle Markttrend nach oben oder unten ist, indem er die Reihenfolge der Anordnung von kurzfristigen und langfristigen gleitenden Durchschnitten berechnet und so vermeidet, dass falsche Signale in Bereichsmärkten generiert werden. Schließlich bildet er in Kombination mit konfigurierbaren Stop-Profit- und Stop-Loss-Regeln einen vollständigeren Trend nach der Handelsstrategie.
Im Allgemeinen ist dies eine sehr praktische Trendfolgestrategie. Es verwendet Indikator-Crossover für die Entscheidungsfindung und enthält auch ein Trendbeurteilungsmodul, um falsche Signale effektiv auszufiltern. Nach der Konfiguration von Stop-Profit und Stop-Loss kann es Trends für den Handel vollständig folgen und gute Renditen erzielen. Durch Anpassung von Parameterkombinationen und Hinzufügen von mehr Filtern kann diese Strategie weiter optimiert werden, um sich an mehr Marktumgebungen anzupassen, und hat großen Raum für Verbesserungen und Anwendungsperspektiven.
/*backtest start: 2023-10-24 00:00:00 end: 2023-11-23 00:00:00 period: 1h basePeriod: 15m 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/ // © HeWhoMustNotBeNamed //@version=4 strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true) MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"]) LookbackPeriod = input(30, minval=10,step=10) BBStdDev = input(2, minval=1, maxval=10, step=0.5) BBLength = input(60, minval=5, step=5) atrLength = input(22) atrMult = input(6) tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short]) backtestYears = input(10, minval=1, step=1) includePartiallyAligned = true f_getMovingAverage(source, MAType, length)=> ma = sma(source, length) if(MAType == "ema") ma := ema(source,length) if(MAType == "hma") ma := hma(source,length) if(MAType == "rma") ma := rma(source,length) if(MAType == "vwma") ma := vwma(source,length) if(MAType == "wma") ma := wma(source,length) ma f_getTrailingStop(atr, atrMult)=> stop = close - atrMult*atr stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop stop f_getMaAlignment(MAType, includePartiallyAligned)=> ma5 = f_getMovingAverage(close,MAType,5) ma10 = f_getMovingAverage(close,MAType,10) ma20 = f_getMovingAverage(close,MAType,20) ma30 = f_getMovingAverage(close,MAType,30) ma50 = f_getMovingAverage(close,MAType,50) ma100 = f_getMovingAverage(close,MAType,100) ma200 = f_getMovingAverage(close,MAType,200) upwardScore = 0 upwardScore := close > ma5? upwardScore+1:upwardScore upwardScore := ma5 > ma10? upwardScore+1:upwardScore upwardScore := ma10 > ma20? upwardScore+1:upwardScore upwardScore := ma20 > ma30? upwardScore+1:upwardScore upwardScore := ma30 > ma50? upwardScore+1:upwardScore upwardScore := ma50 > ma100? upwardScore+1:upwardScore upwardScore := ma100 > ma200? upwardScore+1:upwardScore upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200 downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200 upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0 inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0) exitBySignal = exitType == "Signal" or exitType == "Both" exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both" maAlignment = f_getMaAlignment(MAType,includePartiallyAligned) atr = atr(atrLength) trailingStop = f_getTrailingStop(atr, atrMult) maAligned = highest(maAlignment,LookbackPeriod) [middle, upper, lower] = bb(close, BBLength, BBStdDev) buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle)) buyExitCondition = crossunder(close, upper) strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy") strategy.close("Buy", when=buyExitCondition and exitBySignal) strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )