Bollinger Band und RSI Mischen mit DCA-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-18 11:23:15
Tags:

img

Übersicht

Die Strategie heißt Bollinger Band und RSI Mixing mit DCA. Sie baut Handelssignale auf Basis der Indikatoren Bollinger Band und Relative Strength Index (RSI) auf und verwaltet Risiken mithilfe eines progressiven Dollar-Kostendurchschnitts (DCA).

Strategieprinzip

Die Strategie integriert die Bollinger Band und RSI Indikatoren. Die Bollinger Band beurteilt klar den Trend, wo über der mittleren Band bedeutet ein Bullenmarkt und darunter bedeutet ein Bärenmarkt. RSI zeigt Überkauf und Überverkauf Situationen. Die Strategie baut einen MIX-Indikator durch die Gewichtung der Bollinger Band Abweichung und der K-Wert des RSI. Ein langes Signal wird erzeugt, wenn der MIX-Indikator durch 20 von unten bricht.

Für den progressiven DCA-Teil wird eine Anfangsposition eröffnet, wenn MIX 20 durchbricht. Zusätzliche Positionen werden bei einem festen Betrag jedes Mal hinzugefügt, wenn der Preis um einen festen Prozentsatz sinkt. Dies wird fortgesetzt, bis die maximalen Positionen erreicht sind oder Stop-Loss / Take-Profit ausgelöst wird. Durch das Hinzufügen von Positionen bei Marktspitzen mehrmals können die durchschnittlichen Kosten progressiv gesenkt werden.

Vorteile der Strategie

  1. Die Kombination zweier Indikatoren verbessert die Signalgenauigkeit durch ein klareres Trendbeurteilen.

  2. Die progressive DCA senkt die Kostenbasis während des Rückgangs und verringert das Verlustrisiko und erhöht gleichzeitig die Gewinnspanne.

  3. Gewinn- und Stop-Loss-Bedingungen, um Risiken umgehend zu kontrollieren und einen teilweisen Gewinn zu erzielen.

  4. Der hinzugefügte Datumsbereichsfilter ermöglicht fokussierte Backtests und Optimierungen bestimmter Zeiträume.

Risiken und Lösungen

  1. Sowohl das Bollinger Band als auch der RSI können ausfallen.

  2. Progressive DCA kann den Verlust während großer Crashs durch kontinuierliches Hinzufügen von Positionen erhöhen. Maximale Einträge können zusammen mit dem richtigen Stop-Loss-Niveau für eine bessere Risikokontrolle festgelegt werden.

  3. Es ist nicht möglich, schwarze Schwanenereignisse und abnormale Kursbewegungen vorherzusehen.

Optimierungsrichtlinien

  1. Test und Optimierung von Parametern für den MIX-Indikator, um genauere Handelssignale zu erhalten.

  2. Optimieren Sie die Stop-Loss- und Take-Profit-Parameter für die beste Gewinn-Verlust-Ratio.

  3. Versuche verschiedene Zusatzpositionsgrößen und -frequenzen, um optimale Kombinationen zu finden.

  4. Überlegen Sie, ob die Öffnungs-/Schließungsstrategie auf der Grundlage von Volumenbedingungen mit Handelsvolumenkontrollmodulen versehen wird.

Zusammenfassung

Der Bollinger Band und RSI Mixing mit DCA Strategie kombiniert mehrere quantitative Techniken und Methoden. Er baut einen klaren Trendbeurteilungsindikator auf und senkt die Kostenbasis durch progressive Ergänzungen. Strenge Risikokontrollmethoden einschließlich Stop-Loss und Take-Profit machen ihn praktisch. Weitere Tests und Optimierungen können seine einzigartigen Vorteile in ein profitables Handelssystem umwandeln.


/*backtest
start: 2023-01-11 00:00:00
end: 2024-01-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © lagobrian23
//@version=4
strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false )
source=close
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
lengthRSI = input(14, "RSI Length", minval=1)
lengthStoch = input(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

// Bollinger Band

length = input(20,title = 'BB lookback length', minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
BBval = (src - basis)/dev*30+50
offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500)
mix=(d + BBval)/2

//plot
//plot(k, "K", color=#606060)
plot(BBval, "BBval", color=#872323, offset = offset)
plot(d, "D", color=#FF6A00)
h0 = hline(80, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
plot(mix, "MIX", color=#888888, linewidth=3)

//background MIX
bgcolor(mix < 20 ? color.green : color.white, transp=50)
bgcolor(mix > 80 ? color.red : color.white, transp=50)

// Choosing the date range
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
toMonth = input(defval = 1,    title = "To Month",      type = input.integer, minval = 1, maxval = 12)
toDay   = input(defval = 1,    title = "To Day",        type = input.integer, minval = 1, maxval = 31)
toYear  = input(defval = 2112, title = "To Year",       type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true

// Initializing the strategy paraeters

P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100)
X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100)
B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100)
D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100)
A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20)
Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10)

// Declaring key DCA variables
entry_price = 0.0
entry_price := na(entry_price[1]) ? na : entry_price[1]
new_entry = 0.0
consec_entryCondition = false
// Implementing the strategy
longEntry = crossover(mix,20)
exitLongs = crossunder(mix, 80)

if(longEntry)
    entry_price := close
    strategy.entry('main_LE', strategy.long , P, when = window() and longEntry)

// Exiting conditions
stoploss = strategy.position_avg_price*(1-(D_sl/100))
takeprofit = strategy.position_avg_price*(1+(B_tp/100))
slCondition = crossunder(close, stoploss)
tpCondition = crossover(close, takeprofit)

// We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged.
exitConditions = exitLongs or slCondition or tpCondition

// Consecutive entries upto A times
// strategy.risk.max_intraday_filled_orders(A)

//Dollar-Cost-Averaging
// Enter long whenever price goes down X%: amount set to (P+Y)*Z
newAmount = (P+X)*Z
// If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price
new_entry := entry_price - ((X/100)*entry_price)
consec_entryCondition := crossunder(close, new_entry)
if(consec_entryCondition and strategy.opentrades != A)
    strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition)
    entry_price := close
    
// Exiting
// The main trade is closed only when the  main exit conditions are satisfied
strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions)

// A consective long is closed only when tp or sl is tagged
strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name =  'consecLongs')


Mehr