Diese Strategie verwendet Bollinger-Bänder, Keltner-Kanäle und Adaptive Relative Strength Index, um die aktuelle Trendrichtung zu bestimmen, kombiniert mit Parabol SAR, um den Eintritt zu zeitlich festzulegen.
Diese Strategie kombiniert folgende drei technische Indikatoren, um den aktuellen Trend zu bestimmen:
SQUEEZE Momentum Indicator: Berechnet Bollinger-Bänder und Keltner-Kanäle. Wenn sich die beiden Bande überschneiden, erzeugt er eine Verdichtung und signalisiert eine bevorstehende Trendänderung. Er gibt den Verdichtungszustand und die lineare Regressionsneigung zurück.
RSI Volumengewichtet: Berechnet den RSI nach Volumengewicht. Verwendet den Mittelpunkt zur Bestimmung von Überkauf-/Überverkaufswerten.
Parabolische SAR: Beurteilt die Position des aktuellen Preises in Bezug auf die SAR-Linie. SAR über dem Preis zeigt Abwärtstrend an, während SAR unter dem Preis Aufwärtstrend anzeigt.
Die Strategie verwendet Bollinger-Bänder, um die Trendrichtung zu bestimmen, Keltner-Kanäle, um sie zu verfeinern, RSI, um Umkehrmöglichkeiten bei Überkauf/Überverkauf zu finden, und SAR, um den Eintrag zu zeitlich festlegen.
Berechnen Sie Bollinger-Bänder, Keltner-Kanäle, Squeeze-Indikator.
Berechnen Sie den volumengewichteten RSI. Der RSI über dem Mittelpunkt zeigt einen Aufwärtstrend an, unter dem Mittelpunkt einen Abwärtstrend.
Berechnen Sie Parabol SAR. SAR unter dem Preis zeigt Aufwärtstrend, über dem Preis zeigt Abwärtstrend.
Kombinieren Sie die drei Indikatoren: Wenn ein Squeeze auftritt, geht der RSI über den Mittelfeldpunkt, SAR ist unter dem Preis, ein langes Signal wird generiert.
Wenn ein Signal ausgelöst wird, überprüfen Sie, ob die Beurteilungen der drei Indikatoren auf der vorherigen Stange das Gegenteil des aktuellen Signals sind.
Setzen Sie Stop-Loss und nehmen Sie Profit nach dem Eintritt, hinter dem Stop-Loss.
Die Vorteile dieser Strategie:
Die Kombination mehrerer Indikatoren verbessert die Genauigkeit des Trendbeurteilens. Squeeze erkennt Trendänderungen genau, der RSI identifiziert überkaufte/überverkaufte Niveaus deutlich, SAR multipliziert den Eintrag genau.
Die Indikatorlogik ist einfach und leicht verständlich.
Die Bestätigung mehrerer Indikatoren hilft, falsche Ausbrüche zu filtern.
Die Stop-Loss- und Take-Profit-Mechanik sperrt Gewinne ein und begrenzt Risiken.
Umfangreiche Daten aus Backtests gewährleisten die Zuverlässigkeit.
Es gibt auch einige Risiken:
Die lange und die kurze Eingangslogik sind ähnlich und können widersprüchliche Signale erzeugen.
Alle Indikatoren verwenden eine Parameteroptimierung, es besteht ein Risiko einer Überanpassung.
Hohe Handelsfrequenz, Positionsgröße muss kontrolliert werden.
Der Stop-Loss kann zu nah sein und leicht ausgeschaltet werden.
Lösungen:
Hinzufügen einer Persistenzprüfung der Indikatorurteile, um Signalschwankungen zu vermeiden.
Verwenden Sie die analytische Vorwärtsbewegung, um die Parameter anzupassen und Überanpassung zu verhindern.
Stellen Sie die Pyramidengröße fest, um die Positionen pro Richtung zu steuern.
Verschiedene Stop-Loss-Bereiche testen, um den Stop-Loss-Preis zu optimieren.
Einige Richtungen zur Optimierung der Strategie:
Optimieren Sie die Indikatorparameter für Stabilität.
Hinzufügen von Positionsgrößenlogik wie festes/gleiches Prozent.
Verschiedene Stop-Loss-Methoden wie Volatilität oder lineare Stops, Nullstellungen usw. testen.
Fügen Sie Geldmanagement hinzu, wie z.B. eine feste Positionsaufteilung.
Verwenden Sie maschinelle Lernmodelle für dynamischen Ein- und Ausstieg.
Hinzu kommen Absicherungsmechanismen, die sowohl Long- als auch Short-Optionen zur Verringerung korrelierter Systemrisiken beinhalten.
Überlegen Sie mehr Indikatoren und bauen Sie Abstimmungsmechanismen auf, um die Genauigkeit zu verbessern.
Die Strategie hat eine klare Logik, mehrere Indikatoren zu verwenden, um die Trendrichtung zu bestimmen und klug in den Squeeze einzutreten. Die Stop-Loss- und Take-Profit-Mechanik begrenzt Risiken. Parameteroptimierung und Risikokontrolle können die Rücktest- und Live-Ergebnisse weiter verbessern. Es ist eine stabile Trendfolgestrategie, die für Trending-Produkte geeignet ist, und kann auch in größeren Zeitrahmen wie täglich arbeiten. Mit starkem praktischem Wert kann diese Strategie in vielen Aspekten weiter optimiert werden.
/*backtest start: 2023-10-06 00:00:00 end: 2023-11-05 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © XaviZ //#####©ÉÉÉɶN############################################### //####*..´´´´´´,,,»ëN######################################## //###ë..´´´´´´,,,,,,''%©##################################### //###'´´´´´´,,,,,,,'''''?¶################################### //##o´´´´´´,,,,,,,''''''''*©################################# //##'´´´´´,,,,,,,'''''''^^^~±################################ //#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N########### //#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶######## //#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë###### //©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É#### //¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ### //N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ## //#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N# //#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É# //#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£# //##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É# //##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ# //###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=## //####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©## //#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N### //######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§#### //########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN##### //#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@####### //###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É######### //##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É########### //#################É=~~~~~~~~~~~~~~^^^*~'''*~?§############## //#####################N§£I/~~~~~~»*?~»o§æN################## //@version=4 strategy(title="M-SQUEEZE", overlay = true) //study(title="M-SQUEEZE", overlay = true) src = input(close, "SOURCE", type = input.source) // ███▓▒░░ VARIABLES ░░▒▓███ var bool longCond = na, var bool shortCond = na var int CondIni_long0 = 0, var int CondIni_short0 = 0 var int CondIni_long = 0, var int CondIni_short = 0 var float last_open_longCondition = na, var float last_open_shortCondition = na var int last_longCondition0 = na, var int last_shortCondition0 = na var int last_longCondition = na, var int last_shortCondition = na var bool long_tp = na, var bool short_tp = na var int last_long_tp = na, var int last_short_tp = na var bool Final_Long_tp = na, var bool Final_Short_tp = na var bool SMI_longCond = na, var bool SMI_shortCond = na var bool RSI_longCond = na, var bool RSI_shortCond = na var bool ADX_longCond = na, var bool ADX_shortCond = na var bool SAR_longCond = na, var bool SAR_shortCond = na var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na var bool Final_longCondition = na, var bool Final_shortCondition = na // ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███ Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR") BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1) BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1) KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1) KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1) SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=> // Calculate BB basis = sma(_src, _BB_length) dev = _BB_mult * stdev(_src, _BB_length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(src, _KC_length) rangema = sma(tr, _KC_length) upperKC = ma + rangema * _KC_mult lowerKC = ma - rangema * _KC_mult // Squeeze sqzOn = lowerBB > lowerKC and upperBB < upperKC sqzOff = lowerBB < lowerKC and upperBB > upperKC nosqz = sqzOn == false and sqzOff == false // Linear Regression curve val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0) [nosqz,val] [NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult) barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon))) // ███▓▒░░ SAR ░░▒▓███ Act_SAR = input(true, "PARABOLIC SAR") Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01) Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01) Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01) SAR = sar(Sst, Sinc, Smax) plot(SAR, style = plot.style_cross, title = "SAR") // ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███ Act_RSI = input(true, "RSI VOLUME WEIGHTED") RSI_len = input(22, "RSI LENGHT", minval = 1) RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1) WiMA(_src, _length)=> var float MA_s=0.0 MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length MA_s RSI_Volume(fv, length)=> up=iff(fv>fv[1],abs(fv-fv[1])*volume,0) dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0) upt=WiMA(up,length) dnt=WiMA(dn,length) 100*(upt/(upt+dnt)) RSI_V = RSI_Volume(src, RSI_len) // ███▓▒░░ STRATEGY ░░▒▓███ SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond) RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond) SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond) SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond) RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond) SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond) longCond := SMI_longCond and RSI_longCond and SAR_longCond shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1] CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1] longCondition0 = (longCond and CondIni_long0[1] == -1) shortCondition0 = (shortCond and CondIni_short0[1] == 1) CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1] CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1] longCondition = (longCond[1] and CondIni_long[1] == -1) shortCondition = (shortCond[1] and CondIni_short[1] == 1) // ███▓▒░░ ALERTS & SIGNALS ░░▒▓███ plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny) plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny) //alertcondition(longCondition, title="Long Alert", message = "LONG") //alertcondition(shortCondition, title="Short Alert", message = "SHORT") // ███▓▒░░ BACKTESTING ░░▒▓███ testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, maxval = 2222) testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12) testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31) testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222) testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12) testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31) testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod) strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)