Squeeze Momentum Breakout-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-30 17:33:49
Tags:

img

Übersicht

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.

Strategie Logik

Der Kernindikator dieser Strategie ist der Momentum-Squeeze-Indikator von LazyBear. Dieser Indikator bestimmt, ob die Bollinger-Bänder von den Keltner-Kanälen gepresst werden.

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.

Vorteile

  1. Integriert mehrere technische Indikatoren zur Verbesserung der Genauigkeit

Durch die Beurteilung der allgemeinen Beziehung zwischen diesen Indikatoren kann die Genauigkeit von Handelsentscheidungen verbessert und die Wahrscheinlichkeit fehlerhafter Geschäfte verringert werden.

  1. Genaue Momentum-Squeeze-Punkte mit großem Gewinnpotenzial

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.

  1. Erreichung eines breakout-Handels mit hoher Erfolgsquote

Im Vergleich zum zufälligen Breakout-Handel liegt der bei dieser Strategie gewählte Einstiegspunkt am Quetschpunkt zwischen Bollinger Bands und Keltner Channels.

Risiken

  1. Risiko einer unsachgemäßen Einstellung der Parameter

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.

  1. Ausfallrisiko

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.

  1. Trendumkehrrisiko

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.

Optimierungsrichtlinien

  1. Optimierung der Parameter-Einstellungen

Durch mehr Tests von Daten aus dem Backtesting können bessere Zyklus- und Bandbreitenparameter eingestellt werden, um die Strategieleistung zu verbessern.

  1. Hinzufügen einer Stop-Loss-Strategie

Setzen Sie bewegliche oder schwingende Stopps ein, um bei Preisumkehr schnell Verluste zu reduzieren.

  1. Hinzufügen von Wiedereintrittsbedingungen

Wenn die Strategie die Positionen beendet, können bestimmte Wiedereintrittsbedingungen festgelegt werden, um den Markt wieder zu betreten, wenn der Trend anhält.

  1. Mehr Indikatoren aufnehmen

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.

Zusammenfassung

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")

Mehr