Neun Moving Average Crossover-Strategien


Erstellungsdatum: 2024-01-02 10:37:21 zuletzt geändert: 2024-01-02 10:37:21
Kopie: 0 Klicks: 767
1
konzentrieren Sie sich auf
1621
Anhänger

Neun Moving Average Crossover-Strategien

Überblick

Die Strategie nutzt zwei verschiedene Parameter-Einstellungen für die Kreuzung von Moving Averages, um die Richtung des Trends zu bestimmen, die Position zu eröffnen und zu beenden. Die Strategie ermöglicht die Auswahl von 9 verschiedenen Arten von Moving Averages, darunter einfache Moving Averages (SMA), Index Moving Averages (EMA), Gewichtete Moving Averages (WMA), Almo Moving Averages (ALMA), Quantitative Value Moving Averages (VWMA) usw. Die Strategie setzt gleichzeitig eine Stop-Loss- und eine Stop-Stop-Position.

Strategieprinzip

Die Kernlogik der Strategie besteht darin, die Werte zweier Moving Averages zu vergleichen, um die Richtung des Markttrends anhand der Kreuzung der beiden Moving Averages zu bestimmen. Insbesondere setzen wir zwei Moving Averages auf, eine schnelle und eine langsame Linie. Wenn die schnelle Linie die langsame Linie durchbricht, wird angenommen, dass der Markt in einen Aufwärtstrend eingetreten ist, und mehr getan; wenn die schnelle Linie die langsame Linie unterbricht, wird angenommen, dass der Markt in einen Abwärtstrend eingetreten ist und leer gemacht wurde.

Nach dem Eintritt in die Position, wenn der Preis die Stop-Loss-Linie berührt, verliert er die Position; Wenn der Preis die Stop-Loss-Linie berührt, erreicht der Gewinn die erwartete Position. Auf diese Weise kann der Gewinn gesperrt werden, um zu verhindern, dass die Verluste sich ausdehnen.

Die Strategie besteht logischerweise aus vier Teilen:

  1. Berechnen Sie den Moving Average. Berechnen Sie den Moving Average für die schnelle und die langsame Linie, je nachdem, welche Art von Moving Average der Benutzer auswählt.

  2. Erzeugt Handelssignale. Entsprechend der Kreuzung von schnellen und langsamen Linien erzeugt er Plus- und Minussignale.

  3. Der Preis für die Stop-Loss-Linie und die Stop-Loss-Linie wird in Echtzeit berechnet, basierend auf dem Einstiegspreis und dem eingestellten Stop-Loss-Prozentsatz.

  4. Ein- und Ausstiegszeichen: Ein- und Ausstiegszeichen: Ein- und Ausstiegszeichen:

Analyse der Stärken

Der größte Vorteil dieser Strategie besteht darin, dass man die Freiheit hat, verschiedene Arten von Moving Averages auszuwählen. Die verschiedenen Arten von Moving Averages sind unterschiedlich preissensitiv, so dass der Benutzer den geeigneten Moving Average nach seinen Bedürfnissen auswählen kann. Außerdem kann die Länge der Moving Average anpassen, um die Zeitdimension zu optimieren.

Ein weiterer Vorteil ist, dass ein Stop-Loss-Stopp-Mechanismus eingerichtet ist. Dies verhindert effektiv, dass die Verluste weiter ausgeweitet werden, während die Gewinne gesperrt werden. Insgesamt ist die Strategie flexibel und hochgradig anpassbar und für verschiedene Benutzer geeignet.

Risikoanalyse

Das Hauptrisiko dieser Strategie besteht darin, dass der Moving Average nachlässig ist. Wenn der Preis plötzlich stark schwankt, kann der Moving Average nicht rechtzeitig reagieren, was dazu führen kann, dass die beste Einstiegs- oder Ausstiegszeit verpasst wird. Dies führt zu größeren Verlusten.

Ein weiteres Risiko ist die Einstellung der Stop-Loss-Stopp-Position. Wenn die Einstellung zu klein ist, kann es zu einer Arbitrage kommen. Wenn sie zu groß ist, kann es dazu führen, dass die Gewinne nicht rechtzeitig gesperrt werden.

In der Regel ist die Strategie basierend auf den beweglichen Durchschnitten, die die Richtung der Tendenz bestimmen, so dass die Wirkung in den Fällen, in denen ein unerwartetes Ereignis zu starken Preisschwankungen führt, abgeschrieben wird. Darüber hinaus hat die Einstellung der Parameter einen großen Einfluss auf die Erträge der Strategie.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimierung der Arten von Moving Averages. Entsprechend der unterschiedlichen Marktbedingungen und der verschiedenen Handelsarten werden die passendsten Moving Averages ausgewählt.

  2. Parameter zur Optimierung von Moving Averages. Anpassung der Periodenlänge von Moving Averages, um sie besser an die Merkmale des Marktes anzupassen.

  3. Hinzufügen von Filtern für andere Indikatoren. Sie können andere Indikatoren wie MACD, RSI und andere hinzufügen, um den häufigen Handel in einem Markt ohne Trend zu vermeiden.

  4. Optimierung des Stop-Loss-Stopp-Ratios. Berechnung der optimalen Stop-Loss-Stopp-Parameter basierend auf historischen Daten.

  5. Hinzufügen von maschinellen Lernmodellen. Algorithmen wie LSTM und Random Forest werden verwendet, um Preisbewegungen vorherzusagen und die Generierung von Handelssignalen zu unterstützen.

  6. Die Verwendung von Stop-Tracking-Algorithmen ermöglicht es den Stop-Lines, sich schrittweise mit der Preisentwicklung zu bewegen, um die Wahrscheinlichkeit zu verringern, dass ein Stop-Loss ausgelöst wird.

Zusammenfassen

Diese Strategie ist insgesamt relativ einfach, direkt, durch die Kreuzung der Richtung der Tendenz zu urteilen, gehört zu den typischen Trend-Follow-Strategie. Die Vorteile sind einfach und leicht zu verstehen, hohe Flexibilität, können selbst wählen, die Art der Moving Average und Parameter.

Strategiequellcode
/*backtest
start: 2022-12-26 00:00:00
end: 2024-01-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - Yet Another Moving Average Cross Strategy", shorttitle="kozlod_yamacs", overlay = true)

// 
// author: Kozlod
// date: 2018-03-06
// 

////////////
// INPUTS //
////////////

ma_type      = input(title = "MA Type",          defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'ALMA', 'VWMA', 'HMA', 'LSMA', 'SMMA', 'DEMA'])
short_ma_len = input(title = "Short MA Length",  defval = 5,     minval = 1)
short_ma_src = input(title = "Short MA Source",   defval = close)
long_ma_len  = input(title = "Long MA Length",   defval = 15,    minval = 2)
long_ma_src  = input(title = "Long MA Source",    defval = close)
alma_offset  = input(title = "ALMA Offset",     type = float,   defval = 0.85,  step = 0.01, minval = 0, maxval = 1)
alma_sigma   = input(title = "ALMA Sigma",      type = float,   defval = 6,     step = 0.01)
lsma_offset  = input(title = "LSMA Offset",      defval = 0,     step = 1)

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

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_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)
    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)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Arnaud Legoux Moving Average (ALMA)
if ma_type == 'ALMA'
    short_ma := alma(short_ma_src, short_ma_len,  alma_offset, alma_sigma)
    long_ma  := alma(long_ma_src,  long_ma_len,   alma_offset, alma_sigma)

// 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)))
    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)
    long_ma  := vwma(long_ma_src,  long_ma_len)

// Least Square Moving Average (LSMA)
if ma_type == 'LSMA'
    short_ma := linreg(short_ma_src, short_ma_len, lsma_offset)
    long_ma  := linreg(long_ma_src,  long_ma_len,  lsma_offset)

// 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
    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_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, long_ma)
short_signal = crossunder(short_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] or short_signal[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(long_ma,  color = green, 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)