Breakout-Bollinger-Band-Handelstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-07
Tags:

Übersicht

Diese Strategie handelt mit Ausbrüchen von Bollinger Bands und nimmt Gegentrendpositionen ein, wenn der Preis das obere oder untere Band vollständig durchdringt.

Grundsätze

Die Strategie verwendet Bollinger Bands, um den aktuellen Volatilitätsbereich zu definieren. Wenn der Preis eine volle Kerze über dem oberen Band oder unter dem unteren Band bildet, zeigt dies einen hochvolatilen Zustand und eine mögliche Umkehrung in Richtung des Mittelwerts an.

Insbesondere werden die mittleren, oberen und unteren Bands anhand von 20-Perioden-Schlusskursen berechnet. Ein langes Signal wird erzeugt, wenn der Preis nach dem Öffnen höher unter dem unteren Band schließt. Ein kurzes Signal wird ausgelöst, wenn der Preis nach dem Öffnen niedriger über dem oberen Band schließt. Der Ausbruchspunkt dient als Stop-Loss und das mittlere Band ist das anfängliche Gewinnziel.

Vorteile

Die wichtigsten Vorteile sind:

  1. Bollinger-Bänder messen die Marktvolatilität effektiv, um Anomalien zu erkennen.

  2. Der Ausbruchpunkt ist ein eindeutiger Stop-Loss-Level zur Risikokontrolle.

  3. Das mittlere Band bietet ein vernünftiges Ziel für die mittlere Reversion.

  4. Volle Leuchter filtern falsche Brüche mit größerer Signalzuverlässigkeit aus.

  5. Einfache Parameter erleichtern die Umsetzung und Optimierung.

  6. Eine saubere Logik, die im Code prägnant zum Ausdruck kommt.

Risiken

Zu den Risiken gehören:

  1. Schlechte BB-Parameter können die Strategie ungültig machen.

  2. Ausbrüche könnten den Trendstart signalisieren, Risiken eines vorzeitigen Ausstiegs.

  3. Mittlere Zielgruppen sind vielleicht zu konservativ, um Gewinne zu begrenzen.

  4. Breite Bruchstellen können sich möglicherweise nicht vollständig füllen, was zu Rutschen führt.

  5. Whipsaws können zu übermäßigen sinnlosen Geschäften in verschiedenen Märkten führen.

Verbesserungen

Einige Erweiterungserwägungen:

  1. Messen Sie die Trendstärke, um die Einstellungen oder Frequenz anzupassen.

  2. Hinzufügen anderer Indikatoren zur Feinabstimmung des Eintrittszeitpunkts.

  3. Anpassung des Stop-Loss auf der Grundlage der Volatilität.

  4. Optimieren Sie die anfänglichen Ziele für einen reibungslosen Gewinn.

  5. Implementieren Sie Mechanismen für den Wiedereintritt in die Vermögensverteilung.

  6. Bewertung der Breakout-Gültigkeit, um schlechte Trades zu vermeiden.

Schlussfolgerung

Die Strategie handelt mit BB-Breakouts für kurzfristige Gewinne, die für aktive Trader geeignet sind. Die Vorteile sind eine klare Risikokontrolle, während die Nachteile frühe Ausgänge und Gewinnbegrenzungen sind. Feinabstimmungsparameter, das Hinzufügen von Filtern usw. können die Leistung verbessern.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 3h
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/
// © Bishnu103

//@version=4
strategy(title="Full Candle Outside BB [v1.0][Bishnu103]",shorttitle="OUTSIDE BB",overlay=true,calc_on_every_tick=true,backtest_fill_limits_assumption=2)

// ***********************************************************************************************************************
// input variables
buy_session         = input(title="Buy Session", type=input.session, defval="0915-1430")
exit_inraday        = input(title="Exit Intraday?", type=input.bool, defval=true)
entry_distance      = input(title="Entry distance from alert", minval=1, maxval=10, defval=3)
show_bb_switch      = input(title="Show BB", type=input.bool, defval=true)
//
bbLength            = input(title="BB Length", minval=1, defval=20)
bbStdDev            = input(title="BB StdDev", minval=1, defval=2)

// ***********************************************************************************************************************
// global variables
long_entry          = false
short_entry         = false
long_exit           = false
short_exit          = false

// variable values available across candles
var entry_price     = 0.0  
var sl_price        = 0.0
var exit_price      = 0.0
var candle_count    = 0

// ***********************************************************************************************************************
// function to return bollinger band values based on candle poition passed 
getBB(pos) => [mBB, uBB, lBB] = bb(close[pos], bbLength, bbStdDev)

// function returns true if current time is within intraday byuing session set in input
BarInSession(sess) => time(timeframe.period, sess) != 0

// ***********************************************************************************************************************
// strategy
//
// get current bb value
[mBB_0,uBB_0,lBB_0] = getBB(0)

// check if full candle outside upper BB
outside_uBB = low > uBB_0 and close <= open
outside_lBB = high < lBB_0 and close >= open

// ***********************************************************************************************************************
// entry conditions 
long_entry   := outside_lBB
short_entry  := outside_uBB

// keep candle count since the alert generated so that order can be cancelled after N number of candle calling it out as invalid alert
candle_count := candle_count + 1
if long_entry or short_entry
    candle_count    := 0

// ***********************************************************************************************************************
// risk management
//
// decide entry and sl price
if long_entry
    entry_price := high
    
if short_entry
    entry_price := low
    
if long_entry
    sl_price    := low
    
if short_entry
    sl_price    := high

// first exit is when price hits middle BB, gets updated for each candle based on it's middle BB value
exit_price  := mBB_0

// ***********************************************************************************************************************
// position sizing
price = if close[0] > 25000
    25000
else
    price = close[0]

qty = 25000/price

// ***********************************************************************************************************************
// entry
//if long_entry and strategy.position_size == 0
//    strategy.entry("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price)) 
if long_entry and strategy.position_size == 0
    strategy.order("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price))

//if short_entry and strategy.position_size == 0
//    strategy.entry("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))
if short_entry and strategy.position_size == 0
    strategy.order("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))

// cancel an order if N number of candles are completed after alert candle
strategy.cancel_all(candle_count > entry_distance)

// if current time is outside byuing session then do not enter intraday trade
strategy.cancel_all(timeframe.isintraday and not BarInSession(buy_session))

// ***********************************************************************************************************************
// exit
if strategy.position_size > 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.short, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

if strategy.position_size < 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.long, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

// if intraday trade, close the trade at open of 15:15 candle //!!!!!!!!!!!!!!!!!!!!! TO BE CORRECTED !!!!!!!!!!!!!!!!!!!!!!!
if timeframe.isintraday and exit_inraday and hour == 15 and minute == 00
    strategy.close("BUY",  when=strategy.position_size > 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))
    strategy.close("SELL", when=strategy.position_size < 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))

// ***********************************************************************************************************************
// plots    
//
// plot BB
[mBBp,uBBp,lBBp] = getBB(0)
p_mBB = plot(show_bb_switch ? mBBp : na, color=color.teal)
p_uBB = plot(show_bb_switch ? uBBp : na, color=color.teal)
p_lBB = plot(show_bb_switch ? lBBp : na, color=color.teal)
fill(p_uBB,p_lBB,color=color.teal,transp=95)

Mehr