Die Triangular Moving Average (TMA) Crossover-Handelsstrategie ist eine typische technische Analyse-Strategie. Sie verwendet drei gleitende Durchschnittslinien unterschiedlicher Zeitlängen, um Trends zu erfassen und einen risikoarmen Handel umzusetzen. Wenn der kurzfristige gleitende Durchschnitt den mittelfristigen gleitenden Durchschnitt nach oben überschreitet und der mittelfristige gleitende Durchschnitt über dem langfristigen gleitenden Durchschnitt liegt, wird ein Kaufsignal generiert. Wenn der kurzfristige gleitende Durchschnitt unter den mittelfristigen gleitenden Durchschnitt nach unten überschreitet und der mittelfristige gleitende Durchschnitt unter dem langfristigen gleitenden Durchschnitt liegt, wird ein Verkaufssignal generiert.
Die TMA-Strategie stützt sich hauptsächlich auf drei gleitende Durchschnittslinien, um die Trendrichtung zu bestimmen. Der kurzfristige gleitende Durchschnitt reagiert empfindlich auf Preisänderungen; der mittelfristige gleitende Durchschnitt bietet ein klareres Urteil über den Trend; der langfristige gleitende Durchschnitt filtert Marktlärm aus und bestimmt die langfristige Trendrichtung.
Wenn der kurzfristige gleitende Durchschnitt den mittelfristigen gleitenden Durchschnitt nach oben überschreitet, zeigt dies an, dass der Preis nach oben zu brechen beginnt. Wenn der mittelfristige gleitende Durchschnitt zu diesem Zeitpunkt über dem langfristigen gleitenden Durchschnitt liegt, bedeutet dies, dass der aktuelle Markt in einem Aufwärtstrend ist. Daher wird hier ein Kaufsignal generiert.
Im Gegenteil, wenn der kurzfristige gleitende Durchschnitt unter dem mittelfristigen gleitenden Durchschnitt nach unten kreuzt, zeigt dies an, dass der Preis nach unten ausbrechen begann.
Diese Strategie legt auch Stop-Loss- und Take-Profit-Linien fest. Nach dem Eintritt in einen Handel werden Stop-Loss- und Take-Profit-Preise anhand der Prozentsatz-Einstellungen berechnet. Berührt der Preis eine der Linien, wird die Position geschlossen.
Falsche Signale, wenn sich drei MAs konsolidieren
Lösung: Richten Sie die MA-Parameter ordnungsgemäß ein, um falsche Signale zu vermeiden
Zu aggressiver Stop-Loss-/Take-Profit-Prozentsatz
Lösung: Feinabstimmungsprozentsätze; weder zu groß noch zu klein
Falsche Parameter-Einstellungen führen zu zu vielen oder zu wenigen Trades
Lösung: Versuche verschiedene Parameterkombinationen, um optimale
Die TMA-Strategie kann aus folgenden Gesichtspunkten optimiert werden:
Verschiedene Kombinationen von Typ und Länge testen, um die optimale Lösung zu finden
Versuche verschiedene Kombinationen von MA-Längen oder -Typen für beste Ergebnisse
Hinzufügen anderer technischer Indikatoren als Signalfilter
Hinzufügen von Indikatoren wie KDJ, MACD usw. für die Multi-Faktor-Überprüfung
Auswahl von Parametern auf der Grundlage der Produktmerkmale
Verkürzung der MA-Perioden für flüchtige Produkte; Verlängerung der MA-Perioden für stabile Produkte
Nutzen Sie maschinelles Lernen, um optimale Parameter zu finden
Automatisches Parameter-Sweeping, um schnell das Optimum zu finden
Die TMA-Crossover-Strategie ist eine einfach zu bedienende Trend-Folge-Strategie. Sie nutzt drei MA zusammen, um Trends zu erfassen und Stop-Loss/Take-Profit zu setzen, um Risiken zu kontrollieren und stabile Gewinne zu erzielen. Weitere Verbesserungen können durch Parameteroptimierung und Integration zusätzlicher technischer Indikatoren erzielt werden. Abschließend eignet sich diese Strategie für Anleger, die nach stetigen Gewinnen suchen.
/*backtest start: 2024-01-08 00:00:00 end: 2024-01-15 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5) // // author: Kozlod // date: 2018-03-25 // //////////// // INPUTS // //////////// ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA']) short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1) short_ma_src = input(title = "Short MA Source", defval = close) medium_ma_len = input(title = "Medium MA Length", defval = 20, minval = 2) medium_ma_src = input(title = "Medium MA Source", defval = close) long_ma_len = input(title = "Long MA Length", defval = 100, minval = 3) long_ma_src = input(title = "Long MA Source", defval = close) sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01) // Set initial values to 0 short_ma = 0.0 long_ma = 0.0 medium_ma = 0.0 // Simple Moving Average (SMA) if ma_type == 'SMA' short_ma := sma(short_ma_src, short_ma_len) medium_ma := sma(medium_ma_src, medium_ma_len) long_ma := sma(long_ma_src, long_ma_len) // Exponential Moving Average (EMA) if ma_type == 'EMA' short_ma := ema(short_ma_src, short_ma_len) medium_ma := ema(medium_ma_src, medium_ma_len) long_ma := ema(long_ma_src, long_ma_len) // Weighted Moving Average (WMA) if ma_type == 'WMA' short_ma := wma(short_ma_src, short_ma_len) medium_ma := wma(medium_ma_src, medium_ma_len) long_ma := wma(long_ma_src, long_ma_len) // Hull Moving Average (HMA) if ma_type == 'HMA' short_ma := wma(2*wma(short_ma_src, short_ma_len / 2) - wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len))) medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len))) long_ma := wma(2*wma(long_ma_src, long_ma_len / 2) - wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len))) // Volume-weighted Moving Average (VWMA) if ma_type == 'VWMA' short_ma := vwma(short_ma_src, short_ma_len) medium_ma := vwma(medium_ma_src, medium_ma_len) long_ma := vwma(long_ma_src, long_ma_len) // Smoothed Moving Average (SMMA) if ma_type == 'SMMA' short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len // Double Exponential Moving Average (DEMA) if ma_type == 'DEMA' e1_short = ema(short_ma_src , short_ma_len) e1_medium = ema(medium_ma_src, medium_ma_len) e1_long = ema(long_ma_src, long_ma_len) short_ma := 2 * e1_short - ema(e1_short, short_ma_len) medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len) long_ma := 2 * e1_long - ema(e1_long, long_ma_len) ///////////// // SIGNALS // ///////////// long_signal = crossover( short_ma, medium_ma) and medium_ma > long_ma short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma // Calculate PT/SL levels // Initial values last_signal = 0 prev_tr_price = 0.0 pt_level = 0.0 sl_level = 0.0 // Calculate previous trade price prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na // Calculate SL/PT levels pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na // Calculate if price hit sl/pt long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level // What is last active trade? last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1]) ////////////// // PLOTTING // ////////////// // Plot MAs plot(short_ma, color = red, linewidth = 2) plot(medium_ma, color = green, linewidth = 2) plot(long_ma, color = yellow, linewidth = 2) // Plot Levels plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small) plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small) plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small) ////////////// // STRATEGY // ////////////// strategy.entry("long", true, when = long_signal) strategy.entry("short", false, when = short_signal) strategy.close("long", when = long_hit_pt or long_hit_sl) strategy.close("short", when = short_hit_pt or short_hit_sl)