Dynamische Breakout-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-21 15:03:19
Tags:

img

Übersicht

Diese Strategie basiert auf dem Bollinger Bands Indikator, um eine dynamische Breakout-Handelsstrategie zu erstellen. Sie kombiniert die Bedingungen des Kerzenkörperfilters und des Farbfilters, um nach Breakout-Eintrittsmöglichkeiten um das untere Bollinger Band zu suchen. Die Ausgänge basieren auf dem Körperfilter. Die Strategie verwaltet automatisch die Positionsgröße und das Risiko.

Strategie Logik

Berechnung der Indikatoren

Berechnen Sie zunächst die Basislinie und das untere Band der Bollinger Bands anhand des niedrigen Preises:

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

Hierbei ist src der niedrige Preis, Länge der Berechnungszeitraum, Basis der gleitende Durchschnitt, dev die Standardabweichung und niedriger das untere Band.

Mult wird normalerweise auf 2 gesetzt, was bedeutet, dass das untere Band eine Standardabweichung entfernt ist.

Filterbedingungen

Die Strategie beinhaltet zwei Filterbedingungen:

KerzenkörperfilterVerwenden Sie die Körpergröße nbody und seine durchschnittliche Körpergröße, um zu bestimmen, erzeugen Sie nur ein Handelssignal, wenn nbody größer als die Hälfte der Körpergröße ist.

Farbfilter
Nicht lange, wenn die Kerze positiv schließt (schließen > öffnen). Dies verhindert einen falschen Ausbruch an der Spitze der Box.

Handelssignale

Länges Signal erzeugen, wenn folgende Bedingungen erfüllt sind:

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

Wenn die Körpergröße erneut die Hälfte des Mittelwerts überschreitet, muss die Position der Nähe:

close > open and nbody > abody / 2  

Positionsgröße

Die Strategie berechnet automatisch die Handelsgröße für das exponentielle Wachstum der Position:

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

Risikokontrolle

Hinzufügen von Einschränkungen für Jahr, Monat und Datum, um den Handel nur in einem bestimmten Datumsbereich zu begrenzen:

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

Vorteile

Dynamischer Handelsbereich

Das untere Bollinger-Band bietet einen dynamischen Unterstützungsbereich, um Retracements nach Trends zu erfassen.

Doppelfilter

Die Kombination von Kerzenkörper und Farbfiltern verhindert effektiv falsche Ausbrüche.

Automatische Positionsgrößerung

Die Positionsgröße steigt exponentiell auf 100% und das Risikomanagement automatisch.

Datumsbereich

Die Festlegung eines Datumsbereichs verringert das mit der Marktvolatilität in bestimmten Perioden verbundene Risiko.

Risiken

Verlängerte Abnahme

Bei starkem Aufwärtstrend können sich BB-Mitte- und Oberbands schnell nach oben bewegen und einen längeren Rückgang verursachen.

Lösungen

Kombiniert mit Trendindikatoren, Stopp-Strategie, wenn es sich um einen Bullenmarkt handelt, um einen längeren Rückgang zu vermeiden.

Versagter Ausbruch

Der Ausbruch kann scheitern, wenn die Unterbänder zurückgezogen und erneut getestet werden.

Lösungen

Fügen Sie Stop-Loss unterhalb des Support-Niveaus hinzu oder Logik hinzu, um fehlgeschlagene Wiederholungstests für einen schnellen Stop-Loss zu erkennen.

Verbesserungen

Stop Loss hinzufügen

Optimieren Sie den Stop-Loss unterhalb der Unterstützung basierend auf den Rücktests.

Optimieren von Parametern

Feinschaltkörperfilter Aufenthaltsdauer, Farbfilter usw., um das Optimum zu finden.

Trendfilter hinzufügen

Stoppen Sie die Strategie, wenn es sich um einen Bullenmarkt handelt.

Schlussfolgerung

Diese Strategie kombiniert BB-Unterstützung, Körperfilter, Farbfilter und Breakout-Logik, um Hochwahrscheinlichkeits-Retracements zu erfassen.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Mehr