Diese Strategie basiert auf dem Squeeze Momentum-Indikator von LazyBear
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.
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.
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.
Berechnen Sie den Wert der linearen Regressionskurve als Impulsindikator.
Kombination von Komprimierungs-/Expansionsmustern, Impulsrichtung, Mittelfilterung und anderen Bedingungen zur Bestimmung der endgültigen Handelssignale.
Die Verwendung einer doppelten Filtration von Bollinger-Bändern und Keltner-Kanälen zur Identifizierung von Qualitätskomprimierungs- und Expansionsmustern.
Der Momentum-Indikator kann Preistrendumkehrungen rechtzeitig erfassen und die Kanalindikatoren ergänzen.
Erlaubt einen frühen Einstieg, um die Gewinnchancen zu erhöhen.
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).
Die technischen Indikatorparameter können an unterschiedliche Produkte und Parameterkombinationen angepasst werden.
Der Backtest-Zeitrahmen kann so eingestellt werden, dass er über bestimmte Zeiträume optimiert wird.
Die Trendstrategie ist bei einer Trendumkehr zu Verlusten veranlasst.
Eine unsachgemäße Einstellung der Parameter kann zu einem Überhandel oder zu einer schlechten Signalqualität führen.
Die Abhängigkeit von historischen Daten kann keine stabile zukünftige Rendite gewährleisten.
Unfähig, mit Marktturbulenzen und drastischen Kursschwankungen umzugehen, die durch schwarze Schwanen verursacht werden.
Eine falsche Einstellung des Zeitfensters für Backtests kann zu einer Überanpassung führen.
Optimieren Sie die Parameter von Bollinger-Bändern und Keltner-Kanälen, um die beste Kombination zu finden.
Testen Sie die Hinzufügung von Trailing Stop Loss, um den maximalen Verlust pro Handel zu kontrollieren.
Versuchen Sie weitere Optimierungen für bestimmte Produkte und Perioden-/Parameterkombinationen.
Explore integrating machine learning models to judge trend reversals (Erforschen Sie die Integration von Machine Learning Modellen, um Trendumkehrungen zu ermitteln).
Verschiedene Eingabe-Sequenzierungs- und Positionsgrößenstrategien testen.
Erforschen Sie, wie Sie Trendumkehrsignale erkennen und rechtzeitig aussteigen können.
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()