Dies ist eine quantitative Handelsstrategie, die dreifache Supertrend-, EMA- und ADX-Indikatoren kombiniert.
Verwenden Sie drei Supertrend-Systeme mit unterschiedlichen Parametern und erzeugen Sie Handelssignale, wenn sich alle drei Supertrends auf die Richtung einigen.
Verwenden Sie EMA als Trendfilter, gehen Sie nur lang, wenn der Schluß über der EMA liegt, und kurz, wenn der Schluß unter der EMA liegt.
ADX als Trendstärkefilter anwenden, nur dann handeln, wenn ADX über einem Schwellenwert liegt.
Erlaubt die Wiedereintrittsoption zur Anpassung von Rentabilität und Risikokontrolle.
Insbesondere ist die Long-Entry-Bedingung, wenn alle drei Supertrends bullisch werden, der Close über der EMA liegt und der ADX über der Schwelle liegt. Die Short-Entry-Bedingung ist, wenn alle drei Supertrends bärisch werden, der Close unter der EMA liegt und der ADX über der Schwelle liegt. Der Exit erfolgt, wenn sich einer der Supertrends umkehrt.
Die Strategie zeichnet auch Supertrend-Unterstützungs- und Widerstandslinien auf, um die visuelle Trendbestimmung zu unterstützen.
Das Dreifach-Supertrend-System filtert falsche Ausbrüche und verbessert die Eingabegenauigkeit.
Die doppelten Filter der EMA und ADX verringern Verluste und verbessern das Risikomanagement.
Die Wiedereintrittsoption ermöglicht die Anpassung der Rentabilität anhand der Risikopräferenz.
Visuelle Supertrendlinien helfen, die Trendrichtung zu bestimmen.
Supertrend und andere Indikatoren haben Verzögerungen und können zu einem späten Eintritt oder einem frühen Ausstieg führen.
Zu strenge Filter können Gelegenheiten verpassen.
Whipsaws können Verluste auf den Märkten mit Bandbreite verursachen.
Durch die Erlaubnis des Wiedereintritts steigen die Handelshäufigkeit und die Kosten für die Ausfallrate.
Diese Risiken können durch die Optimierung von Parametern, Filtern und die Verwendung dynamischer Stopps verringert werden.
Diese Strategie kann in mehreren Aspekten optimiert werden:
Versuche verschiedene Parameterkombinationen, um optimale Supertrend- und EMA-Einstellungen zu finden.
Optimieren Sie den ADX-Schwellenwert, um falsche Signale zu reduzieren.
Hinzufügen anderer Filter wie Volatilität, Volumen usw.
Optimieren Sie die Parameter für verschiedene Produkte separat.
Entwicklung dynamischer Stop-Loss-Mechanismen für eine bessere Risikokontrolle.
Erforschen Sie maschinelles Lernen, um bessere Ein- und Ausstiegsregeln zu finden.
Diese Strategie nutzt die Stärken von dreifachen Supertrend-Systemen und ergänzt sie mit EMA- und ADX-Doppelfiltern, um die Signalqualität und Risikokontrolle effektiv zu verbessern. Weitere Verbesserungen bei Parametern, Filtern, dynamischen Stops können seine Robustheit und Anpassungsfähigkeit verbessern. In Kombination mit der Trendanalyse liefert sie effektive Ein- und Ausstiegssignale für den quantitativen Handel.
/*backtest start: 2023-08-18 00:00:00 end: 2023-09-17 00:00:00 period: 2h 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/ // ©kunjandetroja //@version=5 strategy('Triple Supertrend with EMA and ADX', overlay=true) m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1') m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2') m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3') p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1') p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2') p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3') len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1) len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1) len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1) adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5) var bool long_position = false adx_filter = input.bool(false, "Add Adx & EMA filter") renetry = input.bool(true, "Allow Reentry") f_getColor_Resistance(_dir, _color) => _dir == 1 and _dir == _dir[1] ? _color : na f_getColor_Support(_dir, _color) => _dir == -1 and _dir == _dir[1] ? _color : na [superTrend1, dir1] = ta.supertrend(m1, p1) [superTrend2, dir2] = ta.supertrend(m2, p2) [superTrend3, dir3] = ta.supertrend(m3, p3) EMA = ta.ema(close, len_EMA) [diplus,diminus,adx] = ta.dmi(len_Di,len_ADX) // ADX Filter adxup = adx > adx_above and close > EMA adxdown = adx > adx_above and close < EMA sum_dir = dir1 + dir2 + dir3 dir_long = if(adx_filter == false) sum_dir == -3 else sum_dir == -3 and adxup dir_short = if(adx_filter == false) sum_dir == 3 else sum_dir == 3 and adxdown Exit_long = dir1 == 1 and dir1 != dir1[1] Exit_short = dir1 == -1 and dir1 != dir1[1] // BuySignal = dir_long and dir_long != dir_long[1] // SellSignal = dir_short and dir_short != dir_short[1] // if BuySignal // label.new(bar_index, low, 'Long', style=label.style_label_up) // if SellSignal // label.new(bar_index, high, 'Short', style=label.style_label_down) longenter = if(renetry == false) dir_long and long_position == false else dir_long shortenter = if(renetry == false) dir_short and long_position == true else dir_short if longenter long_position := true if shortenter long_position := false strategy.entry('BUY', strategy.long, when=longenter) strategy.entry('SELL', strategy.short, when=shortenter) strategy.close('BUY', Exit_long) strategy.close('SELL', Exit_short) buy1 = ta.barssince(dir_long) sell1 = ta.barssince(dir_short) colR1 = f_getColor_Resistance(dir1, color.red) colS1 = f_getColor_Support(dir1, color.green) colR2 = f_getColor_Resistance(dir2, color.orange) colS2 = f_getColor_Support(dir2, color.yellow) colR3 = f_getColor_Resistance(dir3, color.blue) colS3 = f_getColor_Support(dir3, color.maroon) plot(superTrend1, 'R1', colR1, linewidth=2) plot(superTrend1, 'S1', colS1, linewidth=2) plot(superTrend2, 'R1', colR2, linewidth=2) plot(superTrend2, 'S1', colS2, linewidth=2) plot(superTrend3, 'R1', colR3, linewidth=2) plot(superTrend3, 'S1', colS3, linewidth=2) // // Intraday only // var int new_day = na // var int new_month = na // var int new_year = na // var int close_trades_after_time_of_day = na // if dayofmonth != dayofmonth[1] // new_day := dayofmonth // if month != month[1] // new_month := month // if year != year[1] // new_year := year // close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15) // strategy.close_all(time > close_trades_after_time_of_day)