Anpassungsfähige Bollinger-Bänder-Trendverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-02-04 15:30:46
Tags:

img

Übersicht

Diese Strategie verwendet einen adaptiven Bollinger Bands-Indikator, um die Trendrichtung und Marktordern zu identifizieren, um den Trend mit Stop-Loss für einen effizienten Trendhandel zu verfolgen.

Strategie Logik

  1. Berechnen Sie die mittleren, oberen und unteren Bollinger-Bänder basierend auf einem bestimmten Zeitraum
  2. Gehen Sie lang, wenn der Preis durch das obere Band bricht und kurz gehen, wenn das untere Band bricht, um den Trend zu verfolgen
  3. Verwenden Sie Marktaufträge für einen schnellen Zugang
  4. Einstellen von Stop Loss und Take Profit für die Positionsverwaltung

Vorteile

  1. Adaptive Bollinger Bands sind empfindlich auf die Marktvolatilität ausgerichtet, um eine schnelle Beurteilung der Trendumkehr zu ermöglichen.
  2. Marktordnungen sorgen für einen schnellen Einstieg mit geringem Risiko für eine Verschiebung
  3. Automatische Stop-Loss- und Take-Profit-Verfahren, strenge Risikokontrolle und Gewinnsicherung

Risiken

  1. Bollinger-Bänder haben eine gewisse Verzögerung und können falsche Ausbrüche nicht vollständig vermeiden.
  2. Marktordnungen können den Ausführungspreis nicht genau steuern
  3. Es ist notwendig, die Stop-Loss- und Take-Profit-Levels ordnungsgemäß festzulegen.

Optimierungsrichtlinien

  1. Anpassung der Bollinger-Parameter für eine bessere Sensibilität bei der Beurteilung von Trends
  2. Hinzufügen von Indikatoren wie Volumen oder MACD, um falsche Ausbrüche zu filtern
  3. Optimierung der Stop-Loss- und Take-Profit-Levels

Zusammenfassung

Diese Strategie nutzt den Vorteil von Bollinger Bands voll aus, um Trendrichtungen zu beurteilen und kombiniert schnelle Marktaufträge für die Trendverfolgung von beiden Seiten, um unter kontrolliertem Risiko überschüssige Renditen zu erzielen. Weitere Verbesserungen wie die Optimierung von Bollinger-Parametern, das Hinzufügen von Filterindikatoren und die Anpassung der Stop-Loss/Take-Profit-Logik können zu einer besseren Strategieleistung führen. Mit klarer Logik und einfacher Implementierung ist es eine effiziente und zuverlässige Trendverfolgungs-Handelsstrategie.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 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/
// © CryptoRox

//@version=4
//Paste the line below in your alerts to run the built-in commands.
//{{strategy.order.alert_message}}
strategy("Automated - Fibs with Market orders", "Strategy", true)

//Settings 
testing = input(false, "Live")
//Use epochconverter or something similar to get the current timestamp.
starttime = input(1600976975, "Start Timestamp") * 1000
//Wait XX seconds from that timestamp before the strategy starts looking for an entry.
seconds = input(60, "Start Delay") * 1000
testPeriod = true


leverage = input(1, "Leverage")
tp = input(1.0, "Take Profit %") / leverage
dca = input(-1.0, "DCA when < %") / leverage *-1
fibEntry = input("1", "Entry Level", options=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"])

//Strategy Calls
equity = strategy.equity
avg = strategy.position_avg_price
symbol = syminfo.tickerid
openTrades = strategy.opentrades
closedTrades = strategy.closedtrades
size = strategy.position_size

//Fibs
lentt = input(60, "Pivot Length")
h = highest(lentt)
h1 = dev(h, lentt) ? na : h
hpivot = fixnan(h1)
l = lowest(lentt)
l1 = dev(l, lentt) ? na : l
lpivot = fixnan(l1)
z = 400
p_offset= 2
transp = 60
a=(lowest(z)+highest(z))/2
b=lowest(z)
c=highest(z)

fib0 = (((hpivot - lpivot)) + lpivot)
fib1 = (((hpivot - lpivot)*.21) + lpivot)
fib2 = (((hpivot - lpivot)*.3) + lpivot)
fib3 = (((hpivot - lpivot)*.5) + lpivot)
fib4 = (((hpivot - lpivot)*.62) + lpivot)
fib5 = (((hpivot - lpivot)*.7) + lpivot)
fib6 = (((hpivot - lpivot)* 1.00) + lpivot)
fib7 = (((hpivot - lpivot)* 1.27) + lpivot)
fib8 = (((hpivot - lpivot)* 2) + lpivot)
fib9 = (((hpivot - lpivot)* -.27) + lpivot)
fib10 = (((hpivot - lpivot)* -1) + lpivot)

notna = nz(fib10[60])
entry = 0.0
if fibEntry == "1"
    entry := fib10
if fibEntry == "2"
    entry := fib9
if fibEntry == "3"
    entry := fib0
if fibEntry == "4"
    entry := fib1
if fibEntry == "5"
    entry := fib2
if fibEntry == "6"
    entry := fib3
if fibEntry == "7"
    entry := fib4
if fibEntry == "8"
    entry := fib5
if fibEntry == "9"
    entry := fib6
if fibEntry == "10"
    entry := fib7
profit = avg+avg*(tp/100)
pause = 0
pause := nz(pause[1])
paused = time < pause

fill = 0.0
fill := nz(fill[1])
count = 0.0
count := nz(fill[1])

filled = count > 0 ? entry > fill-fill/100*dca : 0
signal = testPeriod and notna and not paused and not filled ? 1 : 0

neworder = crossover(signal, signal[1])
moveorder = entry != entry[1] and signal and not neworder ? true : false
cancelorder = crossunder(signal, signal[1]) and not paused
filledorder = crossunder(low[1], entry[1]) and signal[1]

last_profit = 0.0
last_profit := nz(last_profit[1])

// if neworder and signal
//     strategy.order("New", 1, 0.0001, alert_message='New Order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry)) 
// if moveorder
//     strategy.order("Move", 1, 0.0001, alert_message='Move Order|e=binancefuturestestnet s=btcusdt b=long c=order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry))
if filledorder and size < 1
    fill := entry
    count := count+1 
    pause := time + 60000
    p = close+close*(tp/100)
    strategy.entry("Buy", 1, 1,  alert_message='Long|e=binancefuturestestnet s=btcusdt b=long q=0.0011 t=market')
if filledorder and size >= 1
    fill := entry
    count := count+1 
    pause := time + 60000
    strategy.entry("Buy", 1, 1,  alert_message='Long|e=binancefuturestestnet s=btcusdt b=long q=0.0011 t=market')

// if cancelorder and not filledorder
//     pause := time + 60000
//     strategy.order("Cancel", 1, 0.0001,  alert_message='Cancel Order|e=binancefuturestestnet s=btcusdt b=long c=order')

if filledorder
    last_profit := profit

closeit = crossover(high, profit) and size >= 1
if closeit
    strategy.entry("Close ALL", 0, 0, alert_message='Close Long|e=binancefuturestestnet s=btcusdt b=long c=position t=market')
    count := 0
    fill := 0.0
    last_profit := 0.0
    
//Plots
// bottom = signal ? color.green : filled ? color.red : color.white
// plot(entry, "Entry", bottom)

Mehr