Strategie für dynamische gleitende Durchschnitte

Schriftsteller:ChaoZhang, Datum: 2023-11-23 11:39:24
Tags:

img

Übersicht

Diese Strategie wird Dynamic Moving Average Strategy genannt. Die Hauptidee besteht darin, die Richtung des gleitenden Durchschnitts und seine Beziehung zum Preis zu verwenden, um den Trend zu bestimmen.

Strategieprinzip

Die Strategie verwendet Quellpreise über einen längeren Zeitraum, um den gleitenden Durchschnitt zu berechnen, wobei die Quellpreise OHLC4, HLC3, Schlusskurs usw. sein können. Der resultierende gleitende Durchschnitt wird als sma definiert. Dann werden die langen und kurzen Linien basierend auf einem Prozentsatz des gleitenden Durchschnittswerts gezeichnet, um festzustellen, ob wir derzeit in einem Auf- oder Abwärtstrend sind.

Insbesondere wird die kurze Linie berechnet als: shortline = sma * ((100 + shortlevel) / 100), wobei shortlevel eine positive Zahl ist, die vom Benutzer festgelegt wurde und den Prozentsatz darstellt, dass die kurze Linie über dem gleitenden Durchschnitt liegt. Die lange Linie ist ähnlich, berechnet als: longline = sma * ((100 + longlevel) / 100), wobei longlevel eine negative Zahl ist, die vom Benutzer festgelegt wurde und den Prozentsatz darstellt, dass die lange Linie unter dem gleitenden Durchschnitt liegt.

So ist der Wert der kurzen Linie immer größer als der gleitende Durchschnitt, und der Wert der langen Linie ist immer kleiner als der gleitende Durchschnitt. Wenn der Preis über die kurze Linie geht, bedeutet dies, dass ein Aufwärtstrend beginnt. Zu diesem Zeitpunkt, wenn Needlong Long zulässt, wird er einen Long-Order auf dem Preisniveau der langen Linie platzieren. Wenn der Preis unter der langen Linie geht, bedeutet dies, dass ein Abwärtstrend beginnt. Zu diesem Zeitpunkt, wenn Needshort Short zulässt, wird er einen Short-Order auf dem Preisniveau der kurzen Linie platzieren.

Unabhängig davon, ob lang oder kurz, wenn sich der Preis zurück zum gleitenden Durchschnitt bewegt, bedeutet dies, dass der Trend endet.

Also die Trendrichtung und die entsprechenden Einträge und existiert werden durch die dynamische Beziehung zwischen den langen / kurzen Linien und der gleitenden Durchschnittslinie bestimmt.

Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass sie durch die dynamische Einstellung der langen und kurzen Linien die Haupttrendrichtung relativ flexibel erfassen kann.

Zweitens hat der gleitende Durchschnitt selbst einen gewissen Filtereffekt, der verhindert, dass er in gewissem Maße von Hochfrequenzschwankungen gefangen wird.

Risiken

Das größte Risiko dieser Strategie besteht darin, dass sich die Leistung der gleitenden Durchschnitte in verschiedenen Perioden unterscheidet. Normalerweise reicht der gleitende Durchschnitt aus, um die Trendrichtung darzustellen, aber in einigen extremen Marktbedingungen könnte der gleitende Durchschnitt kurzfristig durchdrungen werden, was zu falschen Einträgen oder Spitzendivergenzen usw. führt. In diesem Fall sind längere Perioden gleitende Durchschnitte erforderlich, um die Genauigkeit des Trendurteils zu gewährleisten.

Ein weiterer Aspekt des Risikos ist, dass gleitende Durchschnitte selbst eine hohe Trägheit aufweisen. Bei einigen kurzen und intensiven Kursschwankungen ist es schwierig, dass gleitende Durchschnitte rechtzeitig reagieren, wodurch Ein- oder Ausstiegspunkte fehlen. Die Periode muss verkürzt werden, um die Reaktionsgeschwindigkeit des gleitenden Durchschnitts zu beschleunigen.

Erweiterung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Da gleitende Durchschnitte bei der Beurteilung von Trends eine Verzögerung aufweisen, kann man nicht vollständig vermeiden, dass man in die Falle gerät.

  2. Optimieren Sie die Parameter der langen/kurzen Linien. Derzeit sind die Prozentsätze, in denen die langen/kurzen Linien vom gleitenden Durchschnitt abweichen, festgelegt. Diese können auf verschiedenen Datensätzen getestet werden, um optimale Werte zu finden.

  3. Hinzufügen von Trendstärke-Urteil. Abgesehen von Long/Short Line-Positionen können Algorithmen auch die Stärke des Trends beurteilen, um Fehler durch schwache Trendsignale zu vermeiden.

  4. Versuchen Sie, gleitende Durchschnitte auf andere Handelsprodukte anzuwenden, um die Leistung der Produkte zu überprüfen.

Schlussfolgerung

Diese Strategie bestimmt den Trend und platziert entsprechende Long/Short-Trades, indem sie dynamisch Ein- und Ausstiegspunkte basierend auf gleitenden Durchschnitten festlegt. Diese Methode der dynamischen Generierung von Handelssignalen basierend auf gleitenden Durchschnitten ist im Vergleich zu statischen Auslösewerten flexibler und intelligenter bei der Erfassung von Preistrends. Sie löst auch das Problem der mangelnden Aktualität der gleitenden Durchschnitte selbst. Mit systematischem Backtesting und Parameteroptimierung kann diese Strategie gute Gewinne erzielen.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy(title = "Noro's ShiftMA Strategy v1.1", shorttitle = "ShiftMA str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
per = input(3, title = "Length")
src = input(ohlc4, title = "Source")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMAs
sma = sma(src, per) 
//sma = lowest(low, per)
shortline = sma * ((100 + shortlevel) / 100)
longline = sma * ((100 + longlevel) / 100)
plot(shortline, linewidth = 2, color = red, title = "Short line")
plot(sma, linewidth = 2, color = blue, title = "SMA line")
plot(longline, linewidth = 2, color = lime, title = "Long line")

//plot(round(buy * 100000000), linewidth = 2, color = lime)
//plot(round(sell * 100000000), linewidth = 2, color = red)

//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if (not na(close[per])) and size == 0 and needlong
    strategy.entry("L", strategy.long, lot, limit = longline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size == 0 and needshort
    strategy.entry("S", strategy.short, lot, limit = shortline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size > 0 
    strategy.entry("Close", strategy.short, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size < 0 
    strategy.entry("Close", strategy.long, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Mehr