
Die Strategie verwendet die Bollinger Bands, um nach brechenden Punkten zu suchen, und kombiniert diese mit dem ADX, um nachteilige Bewegungen zu filtern und Trends zu verfolgen.
Die Strategie basiert hauptsächlich auf dem Brin-Band-Indikator, um die Obergrenze zu beurteilen. Die Brin-Band-Mitte ist ein Moving Average für den N-Tage-Schlusskurs. Die Bandbreite wird durch die Standarddifferenz berechnet.
Um fehlerhafte Transaktionen zu vermeiden, die durch einen unwirksamen Durchbruch eines nicht-trendenden Kurses verursacht werden, wird die Strategie mit dem ADX-Indikator kombiniert, um eine niedrige Volatilität zu filtern. Ein Kauf- und Verkaufssignal wird nur ausgegeben, wenn der ADX-Wert unter der festgelegten Schwelle liegt.
Die Strategie setzt auch einen Rückschlagstop und einen Aufschlagstop ein. Konkret wird bei jedem Aufschlag der niedrigste Preis der letzten N-Tage als Rückschlagstop in diese Richtung und der höchste Preis als Aufschlagstop in diese Richtung aufgezeichnet. Dies ermöglicht es, Gewinne zu sperren und gleichzeitig die Verluste durch Rückschläge zu minimieren.
Aus der Code-Logik betrachtet, berechnet die Strategie zunächst die Bollinger Bands und die ADX-Indikatorparameter. Dann wird beurteilt, ob der Preis die Bollinger Bands auf den Abwärtstransfer durchbrochen hat, und ob die ADX-Werte unterhalb der Schwelle liegen, und wenn sie erfüllt sind, wird ein Kauf- und Verkaufssignal erzeugt.
Es kann in Kombination mit anderen Indikatoren für die Unterstützung von Beurteilungen in Betracht gezogen werden, um sicherzustellen, dass die VALID-Überschreitung erreicht wird; Optimierung der ADX-Filterbedingungen, um die Steigung der ADX-Kurve zu nutzen, um den Trendwendepunkt zu beurteilen; angemessene Lockerung der Stop-Loss-Stop-Range, um zu verhindern, dass zu nahe an einem Stopp gebracht wird.
Die Gesamtkonzeption der Strategie ist klar und unkompliziert, sie nutzt die Brin-Band, um eindeutige Multiplex-Breakout-Signale zu beurteilen, und filtert Choppy-Geschäfte ohne eindeutige Trends mit dem ADX-Indikator, um Trendchancen zu sperren. Die Strategie ist leicht zu verstehen und zu implementieren, und es lohnt sich, weiter getestet und optimiert zu werden, um eine grundlegende Trendverfolgungsstrategie zu werden.
/*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)