Momentum-Squeeze-Breakout-Trend-Tracking-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-13 17:46:01
Tags:

img

Übersicht

Diese Strategie basiert auf dem Squeeze Momentum-Indikator von LazyBear, der Bollinger-Bänder und Keltner-Kanäle kombiniert, um Preisbrechungen aus der Kanalkompression und -erweiterung zu identifizieren, um die mögliche Trendrichtung der Preise zu bestimmen, und nimmt einen Trend-nach-Ansatz zur Entscheidung der Eintrittsrichtung an. Der Vorteil dieser Strategie besteht darin, die Fähigkeit des Momentum-Indikators voll auszunutzen, potenzielle Trends zu identifizieren, und mehrere Zustandsfilter zu setzen, um die Signalqualität zu steuern, die unsichere Signale effektiv filtern und Überhandel während der Rangierungsmärkte vermeiden kann.

Strategie Logik

  1. Berechnen Sie mittlere Band, obere Band und untere Band von Bollinger Bands. Mittlere Band ist n-Tage einfacher gleitender Durchschnitt des Schlusskurses, obere und untere Band sind mittlere Band plus/minus m mal n-Tage Standardabweichung des Schlusskurses.

  2. Berechnen Sie die mittlere Linie, die obere Linie und die untere Linie der Keltner-Kanäle. Die mittlere Linie ist der n-tägige einfache gleitende Durchschnitt des Schlusskurses, die oberen und untere Linien sind die mittlere Linie plus/minus m mal n-tägiger einfacher gleitender Durchschnitt des wahren Bereichs.

  3. Bestimmen Sie, ob der Preis durch das obere oder untere Band der Bollinger-Bänder und Keltner-Kanäle bricht, um Komprimierungs- und Expansionsmuster zu bilden.

  4. Berechnen Sie den Wert der linearen Regressionskurve als Impulsindikator.

  5. Kombination von Komprimierungs-/Expansionsmustern, Impulsrichtung, Mittelfilterung und anderen Bedingungen zur Bestimmung der endgültigen Handelssignale.

Vorteile der Strategie

  1. Die Verwendung einer doppelten Filtration von Bollinger-Bändern und Keltner-Kanälen zur Identifizierung von Qualitätskomprimierungs- und Expansionsmustern.

  2. Der Momentum-Indikator kann Preistrendumkehrungen rechtzeitig erfassen und die Kanalindikatoren ergänzen.

  3. Erlaubt einen frühen Einstieg, um die Gewinnchancen zu erhöhen.

  4. Adopt multiple condition judgment to avoid over-trading during ranging markets (Adopten Sie mehrere bedingte Urteile, um zu vermeiden, dass Sie während der verschiedenen Märkte übertraden).

  5. Die technischen Indikatorparameter können an unterschiedliche Produkte und Parameterkombinationen angepasst werden.

  6. Der Backtest-Zeitrahmen kann so eingestellt werden, dass er über bestimmte Zeiträume optimiert wird.

Risiken der Strategie

  1. Die Trendstrategie ist bei einer Trendumkehr zu Verlusten veranlasst.

  2. Eine unsachgemäße Einstellung der Parameter kann zu einem Überhandel oder zu einer schlechten Signalqualität führen.

  3. Die Abhängigkeit von historischen Daten kann keine stabile zukünftige Rendite gewährleisten.

  4. Unfähig, mit Marktturbulenzen und drastischen Kursschwankungen umzugehen, die durch schwarze Schwanen verursacht werden.

  5. Eine falsche Einstellung des Zeitfensters für Backtests kann zu einer Überanpassung führen.

Optimierungsrichtlinien

  1. Optimieren Sie die Parameter von Bollinger-Bändern und Keltner-Kanälen, um die beste Kombination zu finden.

  2. Testen Sie die Hinzufügung von Trailing Stop Loss, um den maximalen Verlust pro Handel zu kontrollieren.

  3. Versuchen Sie weitere Optimierungen für bestimmte Produkte und Perioden-/Parameterkombinationen.

  4. Explore integrating machine learning models to judge trend reversals (Erforschen Sie die Integration von Machine Learning Modellen, um Trendumkehrungen zu ermitteln).

  5. Verschiedene Eingabe-Sequenzierungs- und Positionsgrößenstrategien testen.

  6. Erforschen Sie, wie Sie Trendumkehrsignale erkennen und rechtzeitig aussteigen können.

Zusammenfassung

By customizing parameters and using multiple condition filters, it can effectively control trading frequency and improve signal quality. But reversal trades and black swan events should still be watched out for. Further exploring trend reversal signals and risk control mechanisms can be done to make the strategy more robust.


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

//@version=3
//Strategy based on LazyBear Squeeze Momentum Indicator
//I added some custom feature and filters
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
// v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears]
//
strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)

length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(16, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)

//FILTERS
useExtremeOrders  = input(false, title="Early entry on momentum change", type=bool)
useMomAverage = input(false, title="Filter for Momenutum value", type=bool)
MomentumMin = input(20, title="Min for momentum")

// Calculate BB
src = close
basis = sma(src, length)
dev = mult * stdev(src, length)
upperBB = basis + dev
lowerBB = basis - dev
 
// Calculate KC
ma = sma(src, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
 
sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)
 
val = linreg(src  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
 
bcolor = iff( val > 0,            iff( val > nz(val[1]), lime, green),            iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : aqua
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)

//LOGIC
//momentum filter
filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true

//standard condition
longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom
exitLongCondition = bcolor==green and not useExtremeOrders
shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom
exitShortCondition = bcolor==maroon and not useExtremeOrders

//early entry
extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom
exitExtLong = scolor==black or bcolor==red
extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom
exitExtShort = scolor==black or bcolor==lime

//STRATEGY

strategy.entry("SQ_Long", strategy.long, when = longCondition)
strategy.close("SQ_Long",when = exitLongCondition )

strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong)
strategy.close("SQ_Long_Ext",when = exitExtLong)
//strategy.exit("exit Long", "SQ_Long", when = exitLongCondition)

strategy.entry("SQ_Short", strategy.short, when = shortCondition)
strategy.close("SQ_Short",when = exitShortCondition)

strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort)
strategy.close("SQ_Short_Ext",when = exitExtShort)
//strategy.exit("exit Short", "SQ_Short", when = exitShortCondition)



// // === Backtesting Dates === thanks to Trost

// testPeriodSwitch = input(true, "Custom Backtesting Dates")
// testStartYear = input(2018, "Backtest Start Year")
// testStartMonth = input(1, "Backtest Start Month")
// testStartDay = input(1, "Backtest Start Day")
// testStartHour = input(0, "Backtest Start Hour")
// testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
// testStopYear = input(2018, "Backtest Stop Year")
// testStopMonth = input(12, "Backtest Stop Month")
// testStopDay = input(14, "Backtest Stop Day")
// testStopHour = input(23, "Backtest Stop Hour")
// testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
// testPeriod() =>
//     time >= testPeriodStart and time <= testPeriodStop ? true : false
// isPeriod = testPeriodSwitch == true ? testPeriod() : true
// // === /END

// if not isPeriod
//     strategy.cancel_all()
//     strategy.close_all()
        



Mehr