Trendfolgestrategie basierend auf dem Kompressionsmomentumindikator


Erstellungsdatum: 2023-11-13 17:46:01 zuletzt geändert: 2023-11-13 17:46:01
Kopie: 0 Klicks: 883
1
konzentrieren Sie sich auf
1617
Anhänger

Trendfolgestrategie basierend auf dem Kompressionsmomentumindikator

Überblick

Die Strategie basiert auf LazyBears Kompressionsdynamik-Indikator, kombiniert mit Brin-Band und Keltner-Kanal, identifiziert Kompressions- und Expansionsformationen, die bei einem Preisbruch-Kanal entstehen, beurteilt die potenzielle Trendrichtung des Aktienpreises und entscheidet über die Richtung der Position. Der Vorteil der Strategie besteht darin, dass die Fähigkeit des Dynamik-Indikators, potenzielle Trends zu identifizieren, optimal genutzt wird.

Strategieprinzip

  1. Berechnen Sie den einfachen Moving Average für den n-Tage-Schlusskurs in der Brin-Reihe, der oberen und der unteren Schiene. Der Standarddifferenz für den n-Tage-Schlusskurs in der oberen und unteren Schiene ist m-fach.

  2. Berechnen Sie die mittlere, obere und untere Linie in Keltner-Kanal. Die mittlere Linie ist der einfache Moving Average für den n-Tage-Schlusskurs, die obere Linie ist der einfache Moving Average für die n-Tage-Realwellenlänge plus oder minus m.

  3. Die Verdichtung und Expansion von Preisen, die die Ober- und Unterbahn des Brin-Bands und des Keltner-Kanals durchbrechen, bilden die Verdichtung, wenn der Preis die Unterbahn von oben durchbricht, und die Expansion, wenn der Preis die Oberbahn von unten durchbricht.

  4. Berechnen Sie die Werte der linearen Regressionskurve als Dynamikindikator. 0 auf der Dynamiklinie als Kaufsignal und 0 unten als Verkaufssignal.

  5. Die endgültige Handelssignal wird in Kombination mit Kompressions- und Expansionsform, Dynamik-Indikator-Richtung, Mittelwert-Filter und anderen mehreren Bedingungen beurteilt. Nur wenn alle Bedingungen erfüllt sind, wird ein Handelssignal erzeugt, um falsche Geschäfte zu vermeiden.

Strategische Vorteile

  1. Doppelfilterung mit Brin-Band und Keltner-Kanal zur Identifizierung hochwertiger Kompressions- und Expansionsformen.

  2. Die Dynamik-Indikatoren sind in der Lage, die Preisentwicklung und die Umkehrung zeitnah zu erfassen und ergänzen die Kanal-Indikatoren.

  3. Das ist eine sehr gute Gelegenheit, um zu gewinnen.

  4. Es ist wichtig, dass Sie mehrere Kriterien berücksichtigen, um nicht zu häufig Positionen zu eröffnen, wenn ein Sturm auftritt.

  5. Die Parameter der technischen Kennzahlen können für verschiedene Sorten und Parameterkombinationen angepasst werden.

  6. Es ist möglich, die Rückmesszeit festzulegen, um die Tests für bestimmte Zeiträume zu optimieren.

Strategisches Risiko

  1. Die Trend-Tracking-Strategie, bei der es leicht zu Verlusten kommt, wenn sich der Trend umkehrt.

  2. Die falsche Einstellung der Parameter kann zu einer zu hohen Handelsfrequenz oder einer schlechten Signalqualität führen.

  3. Es gibt keine Garantie, dass die Rückkehr in die Zukunft stabil bleibt, wenn man sich auf die Tests der historischen Daten stützt.

  4. Die jüngsten Ereignisse in der Region haben zu einem starken Anstieg der Preise geführt, was zu einem starken Anstieg der Marktpreise geführt hat.

  5. Die falsche Einstellung des Retrieval-Zeitfensters könnte zu einer Überübung führen.

Richtung der Strategieoptimierung

  1. Optimierung der Parameter von Brin-Band und Keltner-Kanal, um die optimale Kombination zu finden.

  2. Die Tests beinhalten die Einbeziehung von mobilen Stop-Losses, um den maximalen Verlust eines einzelnen Handels zu kontrollieren.

  3. Versuchen Sie, die Optimierung unter bestimmten Varietäten und Zyklusparametern weiter zu optimieren.

  4. Das ist eine neue Art von “Machine-Learning-Modell”, um zu erforschen, wie Trends umgekehrt werden können.

  5. Verschiedene Eintrittsordnungen und Strategien für die Positionsverwaltung werden getestet.

  6. Die Studie untersucht, wie Trendwende-Signale erkannt und zeitnah gestoppt werden können.

Zusammenfassen

Die Strategie kombiniert mehrere technische Indikatoren, um die Richtung des Preistrends zu bestimmen und den Trend zu verfolgen. Sie ist sehr anpassungsfähig. Durch die Anpassung der Parameter und die Filterung mehrerer Bedingungen kann die Handelsfrequenz effektiv gesteuert und die Signalqualität verbessert werden.

Strategiequellcode
/*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()