Handelsstrategie für den Kreuzhandel mit dreieckigen gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 2024-01-16 18:18:02
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

  • Verwenden Sie drei gleitende Durchschnitte zusammen, um die Richtigkeit des Urteils zu verbessern
  • Einrichtung von Stop-Loss und Take-Profit, um das Handelsrisiko effektiv zu kontrollieren
  • Anpassbare gleitende Durchschnittsparameter für verschiedene Produkte
  • Sieben Optionen für gleitende Durchschnittsarten, diversifizierte Strategiearten

Risikoanalyse und Lösungen

  • 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

Optimierungsrichtlinien

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

Schlussfolgerung

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)

Mehr