Strategie für den doppelten Ausbruch

Schriftsteller:ChaoZhang, Datum: 2023-11-03 17:16:02
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

  • Bollinger-Bänder bieten klare Breakout-Signale, um Trendchancen zu erfassen
  • ADX-Filter vermeidet den Handel auf unsicheren Märkten ohne klare Trends
  • Stop-Loss kontrolliert effektiv Einzelhandelsverluste
  • Nachfolgende Gewinnentnahmen in den meisten Gewinnen

Risikoanalyse

  • Ausbrüche können unabhängig vom Volumen falsch sein
  • ADX-Filter können auch Trending-Möglichkeiten verpassen
  • Stop-Loss und Profit-Taken zu nah können ausgeschaltet werden.
  • Eine schlechte Einstellung der Parameter beeinträchtigt die Strategieleistung

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.

Verbesserungsrichtlinien

  • Optimieren Sie die Länge der Bollinger-Bänder für beste Ausbruchsergebnisse
  • Feinstimmungs-ADX-Filter zur Balancierung von Trendgenauigkeit und falschen Signalen
  • Hinzufügen anderer Indikatoren zur Bestätigung der Gültigkeit des Ausbruchs
  • Optimieren Sie den Stop-Loss-Bereich, um eine übermäßige Empfindlichkeit zu vermeiden
  • Erweitern Sie die Gewinnspanne, um mehr Gewinne zu erzielen

Schlussfolgerung

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)




Mehr