Dies ist eine quantitative Handelsstrategie, die auf der Grundlage des Momentum-Squeeze-Indikators von LazyBear entwickelt wurde. Die Strategie integriert Bollinger-Bands, Keltner-Kanäle und Momentum-Indikatoren, um durch die Kombination mehrerer technischer Indikatoren einen hohen Gewinnrate-Momentum-Breakout-Handel zu erzielen.
Der Kernindikator dieser Strategie ist der Momentum-Squeeze-Indikator von LazyBear. Dieser Indikator bestimmt, ob die Bollinger-Bänder von den Keltner-Kanälen
Konkret berechnet die Strategie zunächst die 21-Perioden-Bollinger-Bänder mit einer Breite von 2 Standardabweichungen des Preises. Gleichzeitig berechnet sie die 20-Perioden-Keltner-Kanäle mit einer Breite von 1,5 Mal der Preisamplitude.
Wenn sich die Farbe des Impulsindikators bei Ausgängen auf grau ändert, bedeutet dies, dass der Druckzustand beendet ist und sich der Trend umkehren kann.
Durch die Beurteilung der allgemeinen Beziehung zwischen diesen Indikatoren kann die Genauigkeit von Handelsentscheidungen verbessert und die Wahrscheinlichkeit fehlerhafter Geschäfte verringert werden.
Die Momentum-Squeeze-Strategie kann wichtige Punkte erfassen, an denen der Markt wahrscheinlich ausbrechen wird. Diese Punkte sind oft Wendepunkte, an denen der Markt wichtige Richtungsurteile fällt. Wenn sie richtig beurteilt wird, wird die anschließende Marktbewegung relativ lang sein, so dass der potenzielle Gewinnraum der Strategie groß ist.
Im Vergleich zum zufälligen Breakout-Handel liegt der bei dieser Strategie gewählte Einstiegspunkt am Quetschpunkt zwischen Bollinger Bands und Keltner Channels.
Die Zyklusparameter und Bandbreitenparameter der Bollinger-Bänder und Keltner-Kanäle haben einen großen Einfluss auf die Handelsergebnisse. Wenn die Parameter unangemessen eingestellt sind, können Fehleinschätzungen auftreten. Dies erfordert die Suche nach den optimalen Parametern durch viel Backtesting.
Es besteht immer das Risiko, dass der Preis nach dem Durchbruch des durch diese Strategie gewählten Punktes zurückfällt und einen Verlust verursacht.
Wenn der Squeeze-Zustand endet, schließt diese Strategie alle Positionen. Manchmal kann der Kurstrend jedoch weiterhin andauern, was das Risiko eines vorzeitigen Ausstiegs darstellt. Die Ausstiegslogik muss optimiert werden.
Durch mehr Tests von Daten aus dem Backtesting können bessere Zyklus- und Bandbreitenparameter eingestellt werden, um die Strategieleistung zu verbessern.
Setzen Sie bewegliche oder schwingende Stopps ein, um bei Preisumkehr schnell Verluste zu reduzieren.
Wenn die Strategie die Positionen beendet, können bestimmte Wiedereintrittsbedingungen festgelegt werden, um den Markt wieder zu betreten, wenn der Trend anhält.
Versuchen Sie, mehr Indikatoren verschiedener Art einzubeziehen, wie andere Volatilitätsindikatoren, Volumenindikatoren usw., um eine zusammengesetzte Strategie der Indikatorenintegration zu erarbeiten, um die Genauigkeit der Entscheidungen zu verbessern.
Die Strategie integriert Bollinger-Bänder, Keltner-Kanäle und Momentum-Indikatoren. Durch das Beurteilen der Beziehungen zwischen diesen Indikatoren tritt sie an hohen Erfolgsquote-Breakout-Punkten ein. Es gibt Optimierungsräume in vielen Aspekten wie Parameteroptimierung, Stop-Loss-Strategien, Wiedereintrittsbedingungen und Komposit-Indikatorenintegration, um die Strategieleistung weiter zu verbessern.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //All credits to LazyBear. All I did was turn it into a strategy! strategy(title = "SQZMOM STRAT", overlay=false) // --- GENERAL INPUTS --- FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2020, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToYear = input(defval = 9999, title = "To Year", minval = 2017) FromDay = 1 ToDay = 1 start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision) trade_leverage = input(1, title = "Trade - Leverage", step = 0.25) trade_risk = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100) tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"]) // --- SQZMOM CODE length = input(21, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool) // Calculate BB source = close basis = sma(source, length) dev = multKC * stdev(source, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(source, 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(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0) bcolor = color.gray if (val > 0 and val > nz(val[1])) bcolor := color.green if (val < 0 and val < nz(val[1])) bcolor := color.red scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray plot(val, color=bcolor, style=plot.style_histogram, linewidth=4) plot(0, color=scolor, style=plot.style_cross, linewidth=2) // --- VWMA CODE --- useVWMA = input(false, title = "Use VWMA to selectively long/short?", type = input.bool) lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1) useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?") nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA) medianSrc=close calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares) m=calc_evwma(medianSrc, lengthVWMA, nbfs) // ---STRATEGY--- if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false)) longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (longCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("LONG", strategy.long, qty = contracts, when = window()) if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false)) shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (shortCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("SHORT", strategy.short, qty = contracts, when = window()) if (bcolor == color.gray) strategy.close("LONG") strategy.close("SHORT")