Bollinger Bands Trend nach Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-15 14:31:21
Tags:

img

Übersicht

Diese Strategie trägt den Namen Bollinger Bands Trend Following Strategy. Sie verwendet den Bollinger Bands Indikator, um Preistrends zu bestimmen, und geht lang oder kurz ein, wenn der Preis aus dem Bollinger Bands Kanal ausbricht. Sie enthält einen gleitenden Durchschnittsfilter, um die Trendrichtung beim Ausbruch zu beurteilen und so zwischen langen und kurzen Einträgen zu entscheiden.

Grundsätze

Die Strategie stützt sich hauptsächlich auf den Indikator Bollinger Bands, um den Preistrend und die Einstiegspunkte zu bestimmen.

  1. Mittellinie: gleitender Durchschnitt über n Tage
  2. Oberste Zeile: Standardabweichung von n Tagen nach oben
  3. Unterste Linie: Abwärtsgehende Standardabweichung von n Tagen

Wenn der Preis von der unteren Linie durch die obere Linie nach oben bricht, wird ein Aufwärtstrend identifiziert. Wenn der Preis von der oberen Linie durch die unteren Linie nach unten bricht, hat ein bärischer Trend begonnen. Die Strategie geht bei Auftreten dieser beiden Arten von Ausbrüchen lang oder kurz ein.

Insbesondere ist die Strategielogik:

  1. Eintritt in die lange Linie, wenn die Bands-Unterlinie nach oben brecht.
  2. Eintritt kurz, wenn die Schließung von der oberen Bandlinie nach unten bricht.

Um falsche Ausbrüche zu vermeiden, wird ein gleitender Durchschnittsfilter hinzugefügt.

Hier wird der exponentielle gleitende Durchschnitt als Indikator verwendet.

Zusammenfassend sind die Kriterien für die Bestimmung des Trendbruchs folgende:

  1. Langes Signal: Schließung ausbricht Bands Oberlinie && Schließung ausbricht gleitenden Durchschnitt
  2. Kurzsignal: Schließung ausbricht Bands Unterlinie && Schließung ausbricht gleitenden Durchschnitt

Nach dem Eintritt verfolgt der Stop-Loss die mittlere Linie und tritt aus, wenn der Preis die mittlere Linie wieder berührt.

Stärkeanalyse

Zu den wichtigsten Stärken dieser Strategie gehören:

  1. Der Bands-Kanal bietet Raum für Preisschwankungen, Breakout-Signale starten eine neue Richtung.
  2. Vermeiden Sie falsche Ausbrüche durch gleitenden Durchschnittsfilter, der nur bei tatsächlicher Trendumkehr eintritt.
  3. Ein eingebauter Stop-Loss-Mechanismus, der die mittlere Linie verfolgt, kontrolliert die Risiken effektiv.
  4. Einfache und klare Logik, leicht zu verstehen und umzusetzen, geeignet für Algo-Handelsstrategien.
  5. Nutzt Bands-Kanal und gleitende Durchschnittsindikatoren, keine Notwendigkeit, Preise vorherzusagen, identifiziert Trends auf der Grundlage von Beweisen nach den Fakten.

Risikoanalyse

Trotz der Vorteile birgt die Strategie auch folgende Risiken:

  1. Bei falschen Bandparametern können Handelsfrequenz und Risiken erhöht werden.
  2. Eine unzureichende Auswahl der gleitenden Durchschnittsparameter kann dazu führen, dass tatsächliche Trends fehlen oder falsche Signale generiert werden.
  3. Der Stop-Loss setzt auf die mittlere Linie, kann vorzeitig aussteigen oder zu viel Rückzugsraum erlauben.

Um die oben genannten Risiken zu kontrollieren, kann folgende Optimierung durchgeführt werden:

  1. Passen Sie die Bandparameter richtig an, erhöhen Sie die Kanalbreite, um die Wahrscheinlichkeit eines falschen Ausbruchs zu reduzieren.
  2. Versuche verschiedene gleitende Durchschnittsarten und -längen, um optimale Kombinationen zu finden.
  3. Versuchen Sie andere Stopp-Loss-Methoden, z. B. Trailing-Stop-Loss oder progressive Stop-Loss-Level.

Optimierungsrichtlinien

Auf der Grundlage der Risikoanalyse können weitere Optimierungen in den folgenden Bereichen vorgenommen werden:

  1. Optimierung der Parameter: Verwenden Sie systematischere Methoden wie genetische Algorithmen, um optimale Parameterkombinationen für Bands und gleitende Durchschnitte zu finden, um die Strategie stabiler und profitabler zu machen.

  2. Stop-Loss-Optimierung: Verschiedene Stop-Loss-Techniken wie ATR-Stopps, Trailing-Stopps usw. testen, um den besten Stopp-Mechanismus zu bestimmen.

  3. Filteroptimierung: Versuchen Sie, andere Indikatoren wie RSI, KD usw. als zusätzliche Filter hinzuzufügen, um die Wahrscheinlichkeit eines falschen Signals zu senken und die Rentabilität zu erhöhen.

  4. Optimierung der Einstiegskriterien: Hinzufügen anderer Erwägungen wie Trendbedingungen, abnormaler Volumen usw. zur strengen Auswahl des Eintrittszeitraums, um unnötige Einträge zu vermeiden.

  5. Maschinelles Lernen: Sammeln Sie mehr historische Daten, um LSTM, RNN und andere Deep-Learning-Modelle zu erstellen, um eine optimale Ein- und Ausstiegszeit für KI-gestützte Modelle zu ermöglichen.

  6. Dynamisches Risikovergütungsmanagement: Einbeziehung von festen Ratio-Stopps, Gewinnzielanstieg nach Erreichen bestimmter Gewinnniveaus usw. zur dynamischen Steuerung des Risiko-Auszahlungsvermögens.

Durch Optimierungen in den oben genannten Bereichen können wichtige Kennzahlen wie Stabilität, Rentabilität, Risikobereitschaftsfähigkeit umfassend verbessert werden und die Strategie in einen für den Live-Handel geeigneten Produktionsalgorithmus umgewandelt werden.

Schlussfolgerung

Die Bollinger Bands Trend Following Strategy identifiziert Preistrends unter Verwendung von Bands-Indikatoren und gleitenden Durchschnitten, die an wichtigen Ausbruchspunkten eingegeben werden. Sie hat die Vorteile klarer Logik, Einfachheit, Einfachheit der Implementierung und bietet auch Verbesserungsmöglichkeiten wie Parameter-Tuning, Stop-Loss-Mechanismen. Weitere Verbesserungen wie Parameteroptimierung, Stop-Loss-Verbesserungen, Maschinellearning-Integrationen können es zu einem robusten und stabilen Algo-Handelssystem machen.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================


Mehr