Diese Strategie verwendet Bollinger-Bänder, um Breakout-Punkte für lange und kurze Trades zu identifizieren, kombiniert mit dem ADX-Indikator, um ungünstige Marktbedingungen mit geringer Volatilität zu filtern, um Trends zu verfolgen.
Die Strategie basiert hauptsächlich auf dem Bollinger Bands-Indikator, um die lange oder kurze Richtung zu bestimmen. Das mittlere Band der Bollinger Bands ist der N-Tage gleitende Durchschnitt des Schlusskurses, und die Bandbreite wird anhand der Standardabweichung berechnet. Ein Ausbruch unterhalb des unteren Bandes signalisiert lange Trades, während ein Ausbruch über dem oberen Band kurze Trades signalisiert.
Um ungültige Ausbrüche und fehlerhafte Trades in nicht-trendigen unbeständigen Märkten zu vermeiden, beinhaltet die Strategie den ADX-Indikator, um Marktbedingungen mit geringer Volatilität zu filtern. Handelssignale werden nur generiert, wenn der ADX-Wert unter einem Schwellenwert liegt. Wenn der ADX den Schwellenwert überschreitet, werden alle Positionen geschlossen, um auf Trending-Bedingungen zu warten.
Die Strategie legt auch einen Trailing Stop Loss und einen Take Profit für offene Trades fest. Insbesondere werden nach Eröffnung einer Position der niedrigste Preis und der höchste Preis der vorherigen N Tage als Stop Loss und Take Profit-Level für diese Richtung aufgezeichnet. Dies ermöglicht das Sperren von Gewinnen und gleichzeitig die Verringerung von Verlusten durch Umkehrungen.
Aus der Code-Logik berechnet die Strategie zunächst Bollinger-Bands und ADX-Parameter. Dann überprüft sie, ob der Preis die Bands oberen oder unteren Band bricht und ob ADX unter dem Schwellenwert liegt, um Handelssignale zu generieren. Danach werden die Stop-Loss- und Take-Profit-Level dynamisch aktualisiert und basierend auf der aktuellen Positionsrichtung verfolgt.
Es sollte in Betracht gezogen werden, mit anderen Indikatoren zu kombinieren, um den Ausbruch mit dem Volumen zu bestätigen; den ADX-Filter mit Hilfe der Steigung zu optimieren, um Trendveränderungen zu erkennen; den Stop-Loss- und Gewinnspanne zu erweitern, um einen vorzeitigen Ausstieg zu vermeiden.
Die Strategie hat eine klare und einfache Logik, wobei Bollinger Bands für offensichtliche Breakout-Signale verwendet werden, die von ADX für Trendbedingungen gefiltert werden, um Trendchancen zu erfassen. Stop-Loss und Take-Profit werden verwendet, um Risiken zu kontrollieren und Gewinne zu erzielen.
/*backtest start: 2023-10-26 00:00:00 end: 2023-11-02 00:00:00 period: 1m basePeriod: 1m 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/ // © tweakerID // This strategy uses Bollinger Bands to buy when the price // crosses over the lower band and sell when it crosses down // the upper band. It only takes trades when the ADX is // below a certain level, and exits all trades when it's above it. //@version=4 strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100) //Inputs i_reverse=input(false, title="Reverse Trades") i_ADXClose=input(true, title="ADX Close") i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit") i_SwingLookback=input(20, title="Swing Lo/Hi Lookback") i_SLExpander=input(defval=0, step=.5, title="SL Expander") i_TPExpander=input(defval=0, step=.5, title="TP Expander") //ADX Calculations adxlen = input(14, title="ADX Smoothing") dilen = input(20, title="DI Length") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) adxlevel=input(30, step=5) //BB Calculations BBCALC=input(false, title="-----------BB Inputs-----------") length = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50) MAlen=input(defval=9) source = close basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Entry Logic BUY = crossover(source, lower) and sig < adxlevel SELL = crossunder(source, upper) and sig < adxlevel //SL & TP Calculations SwingLow=lowest(i_SwingLookback) SwingHigh=highest(i_SwingLookback) bought=strategy.position_size != strategy.position_size[1] LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander) SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander) lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander)) sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander) islong=strategy.position_size > 0 isshort=strategy.position_size < 0 SL= islong ? LSL : isshort ? SSL : na TP= islong ? lTP : isshort ? sTP : na //Entries strategy.entry("long", long=i_reverse?false:true, when=BUY) strategy.entry("short", long=i_reverse?true:false, when=SELL) //EXITS if i_ADXClose strategy.close_all(when=sig > adxlevel) if i_SL strategy.exit("longexit", "long", stop=SL, limit=TP) strategy.exit("shortexit", "short", stop=SL, limit=TP) //Plots plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL") plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP") plot(upper) plot(lower)