Strategie zur Verfolgung des gleitenden Durchschnitts Stop Loss

Schriftsteller:ChaoZhang, Datum: 2023-10-24 11:21:57
Tags:

img

Übersicht

Die Kernidee dieser Strategie besteht darin, ein automatisiertes Handelssystem zu entwerfen, das in Trendmärkten profitieren kann und gleichzeitig Drawdowns unter Verwendung gleitender Durchschnitte und eines Trailing-Stop-Loss-Mechanismus kontrolliert.

Strategie Logik

  1. Die Strategie ermöglicht es den Nutzern, aus verschiedenen Arten von gleitenden Durchschnitten zu wählen, einschließlich einfacher gleitender Durchschnitte, exponentieller gleitender Durchschnitte, gewichteter gleitender Durchschnitte usw. Die Nutzer können den gleitenden Durchschnittstyp basierend auf ihren Vorlieben auswählen.

  2. Der Nutzer muss die Periode des gleitenden Durchschnitts festlegen, die für den mittelfristigen Handel im Allgemeinen zwischen 20-60 liegt.

  3. Sobald der gleitende Durchschnitt gewählt wurde, berechnet die Strategie ihn in Echtzeit.

  4. Die Strategie verwendet einen Trailing-Stop-Loss-Mechanismus. Nach dem Öffnen einer Position wird die Beziehung zwischen dem gleitenden Durchschnitt und dem Preis kontinuierlich überwacht und das Stop-Loss-Niveau dynamisch angepasst. Insbesondere wird der Stop-Loss auf den gleitenden Durchschnitt plus/minus einen vom Benutzer festgelegten Stop-Loss-Prozentsatz gesetzt.

  5. Benutzer können den Stop-Loss-Prozentsatz festlegen. Ein größerer Prozentsatz bedeutet einen breiteren Stop-Loss-Bereich und weniger Empfindlichkeit. Ein kleiner Prozentsatz bedeutet einen engeren Stop-Loss und ein geringeres Risiko. Der Stop-Loss-Prozentsatz wird im Allgemeinen zwischen 2% und 5% festgelegt.

  6. Wenn der Kurs nach der Eröffnung einer Position durch den gleitenden Durchschnitt zurückbricht, wird die Position geschlossen.

Vorteile

  • Kann Positionen entlang des Trends eröffnen und größere Gewinne auf Trending-Märkten erzielen
  • Verwendet Trailing-Stop-Loss, um den Stop-Level basierend auf der Kursentwicklung anzupassen, um zu enge Stops zu vermeiden
  • Ermöglicht die Anpassung von gleitenden Durchschnitten und Stop-Loss-Prozentsatz entsprechend der Risikobereitschaft
  • Unterstützt verschiedene gleitende Durchschnittsarten, die eine Optimierung durch Tests ermöglichen
  • Einfache und klare Logik, leicht zu verstehen und zu ändern

Risiken

  • Der Preis kann in den Bereichsgebundenen Märkten um den gleitenden Durchschnitt schwanken, was zu einem übermäßigen Handel führt.
  • Ein zu großer Stop-Loss-Prozentsatz kann zu größeren Verlusten führen
  • Optimale Parameter für gleitende Durchschnitte und Stop-Loss können sich je nach Produkt und Zeitrahmen unterscheiden
  • Vermeiden Sie diese Strategie in der Nähe von wichtigen Nachrichtenveranstaltungen

Die Risiken können durch folgende Maßnahmen optimiert und kontrolliert werden:

  • Nutzung der Strategie in Produkten und Zeitrahmen mit offensichtlichen Trends
  • Anpassung des gleitenden Durchschnitts über einen Zeitraum unter Verwendung längerfristiger gleitender Durchschnitte
  • angemessene Verringerung des Stop-Loss-Prozentsatzes für eine strengere Risikokontrolle
  • Versuche für jedes Produkt, um optimale Parameter zu finden
  • Stoppen Sie den Handel vor wichtigen Nachrichten.

Möglichkeiten zur Verbesserung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Hinzufügen anderer Indikatoren zur Bestätigung, um übermäßige Trades während von Range-bound-Märkten zu vermeiden.

  2. Verwenden Sie eine Kombination von gleitenden Durchschnitten. Zum Beispiel können ein 5-Tage-MA und ein 20-Tage-MA zusammen verwendet werden, so dass Trades nur getätigt werden, wenn beide in die gleiche Richtung ausgerichtet sind.

  3. Die Parameter unterscheiden sich je nach Produkt und Zeitrahmen, so dass separate Tests erforderlich sind.

  4. Fügen Sie Positionsgrößenregeln hinzu, z. B. eine feste Menge für die Ausgangsposition, und fügen Sie dann die Position basierend auf der Stop-Loss-Distanz hinzu.

  5. Festlegen Sie die maximale Anzahl der Trades pro Tag oder die Mindestzeit zwischen den Trades.

  6. Hinzufügen von Algorithmen für maschinelles Lernen zur dynamischen Optimierung von Parametern basierend auf historischen Daten, ohne statische Parameter einzustellen.

  7. Einbeziehung von Deep-Learning-Modellen zur Prognose der Preisentwicklung und Unterstützung bei der Beurteilung der Trendrichtung.

Schlussfolgerung

Im Allgemeinen ist dies eine sehr praktische Trendfolgestrategie. Sie verwendet gleitende Durchschnitte, um die Trendrichtung zu bestimmen, und Trailing Stops, um das Risiko zu kontrollieren. Sie kann in Trendmärkten gute Renditen erzielen. Die Kombination von Parameteroptimierung und Integration mit anderen Indikatoren oder Modellen kann die Stabilität und Rentabilität weiter verbessern.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-03-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//attoCryp, @HikmetSezen58
strategy("MOST Multi MAs", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
sx=input(defval = "close" ,title="Fiyat sec", options=[ "close", "high", "low", "open", "hl2", "hlc3", "hlco4", "hlcc4", "hlccc5"])
smox=input(defval = "HulleMA", title = "Hareketli Ortalama: ", options=["T3", "SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "EVWMA", "HullMA", "HulleMA", "LSMA", "ALMA", "TMA", "SSMA"])
timeFramemost = input(title="++++++++++++++++++++++++++++++++++++", defval="MOST Ayarlari:")
yuzde=input(defval=3.8, minval=0, step=0.1, title="Yuzde Oran")/100
ortalamauzunluk=input(defval=28, title="Periyot Uzunlugu", minval=1)
f=input(defval=0.4, step=0.1, title="T3 icin Factor", minval=0.01)
timeFrameadd=input(title="++++++++++++++++++++++++++++++++++++", defval="Diger Orta.Ayar:")
offsig=input(defval=4, title="LSMA icin Offset veya ALMA icin Sigma", minval=0)
offalma=input(defval=0.6, title="ALMA icin Offset", minval=0, step=0.01)
timeFramess=input(title="++++++++++++++++++++++++++++++++++++", defval="Baslangic-Bitis:")
gun_baslangic=input(defval=1, title="Baslangic Gunu", minval=1, maxval=31)
ay_baslangic=input(defval=1, title="Baslangic Ayi", minval=1, maxval=12)
yil_baslangic=input(defval=2017, title="Baslangic Yili", minval=2010)
gun_bitis=input(defval=1, title="Bitis Gunu", minval=1, maxval=31)
ay_bitis=input(defval=1, title="Bitis Ayi", minval=1, maxval=12)
yil_bitis = input(defval=2019, title="Bitis Yili", minval=2010)

// backtest icin baslangic ve bitis zamanlarini belirleme
baslangic=timestamp(yil_baslangic, ay_baslangic, gun_baslangic, 00, 00)
bitis=timestamp(yil_bitis, ay_bitis, gun_bitis, 23, 59) 
zamanaraligi() => true

//guncel fiyatti belirleme
guncelfiyat=sx=="high"?high : sx=="close"?close : sx=="low"?low : sx=="open"?open : sx=="hl2"?(high+low)/2 : sx=="hlc3"?(high+low+close)/3 : sx=="hlco4"?(high+low+close+open)/4 : sx=="hlcc4"?(high+low+close+close)/4 : sx=="hlccc5"?(high+low+close+close+close)/5 : close 

/////Ortalama Hesaplamalari/////
// Tillson T3
sm0(guncelfiyat,ortalamauzunluk,f) =>
    t3e1=ema(guncelfiyat, ortalamauzunluk)
    t3e2=ema(t3e1, ortalamauzunluk)
    t3e3=ema(t3e2, ortalamauzunluk)
    t3e4=ema(t3e3, ortalamauzunluk)
    t3e5=ema(t3e4, ortalamauzunluk)
    t3e6=ema(t3e5, ortalamauzunluk)
    c1=-f*f*f
    c2=3*f*f+3*f*f*f
    c3=-6*f*f-3*f-3*f*f*f
    c4=1+3*f+f*f*f+3*f*f
    s0=c1 * t3e6 + c2 * t3e5 + c3 * t3e4 + c4 * t3e3

// Basit ortalama
sm1(guncelfiyat,ortalamauzunluk) =>
    s1=sma(guncelfiyat, ortalamauzunluk)

// Ustel ortalama
sm2(guncelfiyat,ortalamauzunluk) =>
    s2=ema(guncelfiyat, ortalamauzunluk)

// Cift Ustel ortalama
sm3(guncelfiyat,ortalamauzunluk) =>
    s3=2*ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)

// Uclu Ustel ortalama
sm4(guncelfiyat,ortalamauzunluk) =>
    s4=3*(ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)) + ema(ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk), ortalamauzunluk)

// Agirlikli Ortalama  
sm5(guncelfiyat,ortalamauzunluk) =>
    s5=wma(guncelfiyat, ortalamauzunluk)

// Hacim Agirlikli Ortalama
sm6(guncelfiyat,ortalamauzunluk) =>
    s6=vwma(guncelfiyat, ortalamauzunluk)

// Smoothed
sm7(guncelfiyat,ortalamauzunluk) =>
    s7=0.0
    s7:=na(s7[1]) ? sma(guncelfiyat, ortalamauzunluk) : (s7[1] * (ortalamauzunluk - 1) + guncelfiyat) / ortalamauzunluk

// Hull Ortalama
sm8(guncelfiyat,ortalamauzunluk) =>
    s8=wma(2 * wma(guncelfiyat, ortalamauzunluk / 2) - wma(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))
    
// Hull Ustel Ortalama
sm81(guncelfiyat,ortalamauzunluk) =>
    s8=ema(2 * ema(guncelfiyat, ortalamauzunluk / 2) - ema(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))

// Least Square
sm9(guncelfiyat,ortalamauzunluk,offsig) =>
    s9=linreg(guncelfiyat, ortalamauzunluk, offsig)

// Arnaud Legoux
sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) =>
    s10=alma(guncelfiyat, ortalamauzunluk, offalma, offsig)

// Triangular
sm11(guncelfiyat, ortalamauzunluk) =>
    s11=sma(sma(guncelfiyat, ortalamauzunluk),ortalamauzunluk)

// SuperSmoother filter
sm12(guncelfiyat,ortalamauzunluk) =>
    a1=exp(-1.414*3.14159 / ortalamauzunluk)
    b1=2*a1*cos(1.414*3.14159 / ortalamauzunluk)
    c2=b1
    c3=(-a1)*a1
    c1=1 - c2 - c3
    s12=0.0
    s12:=c1*(guncelfiyat + nz(guncelfiyat[1])) / 2 + c2*nz(s12[1]) + c3*nz(s12[2])
    
//Elastic Volume Weighted Moving Average
sm13(guncelfiyat,ortalamauzunluk) =>
    hacimtoplam=sum(volume, ortalamauzunluk)
    s13=0.0
    s13:=(nz(s13[1]) * (hacimtoplam - volume)/hacimtoplam) + (volume*guncelfiyat/hacimtoplam)

ortalamafiyat=smox=="T3"?sm0(guncelfiyat,ortalamauzunluk,f) : smox=="SMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="EMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="DEMA"?sm3(guncelfiyat,ortalamauzunluk) : smox=="TEMA"?sm4(guncelfiyat,ortalamauzunluk) : smox=="WMA"?sm5(guncelfiyat,ortalamauzunluk) : smox=="VWMA"?sm6(guncelfiyat,ortalamauzunluk) : smox=="SMMA"?sm7(guncelfiyat,ortalamauzunluk) : smox=="HullMA"?sm8(guncelfiyat,ortalamauzunluk) : smox=="HulleMA"?sm81(guncelfiyat,ortalamauzunluk) : smox=="LSMA"?sm9(guncelfiyat,ortalamauzunluk,offsig) : smox=="ALMA"?sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) : smox=="TMA"?sm11(guncelfiyat,ortalamauzunluk) : smox=="SSMA"?sm12(guncelfiyat,ortalamauzunluk) : smox=="EVWMA"?sm13(guncelfiyat,ortalamauzunluk) : guncelfiyat

/////MOST'u hesaplama/////
stopfiyat=ortalamafiyat*yuzde
mostfiyat=0.0
mostfiyat:=iff(ortalamafiyat>nz(mostfiyat[1],0) and ortalamafiyat[1]>nz(mostfiyat[1],0),max(nz(mostfiyat[1],0),ortalamafiyat-stopfiyat),iff(ortalamafiyat<nz(mostfiyat[1],0) and ortalamafiyat[1]<nz(mostfiyat[1],0),min(nz(mostfiyat[1],0),ortalamafiyat+stopfiyat),iff(ortalamafiyat>nz(mostfiyat[1],0),ortalamafiyat-stopfiyat,ortalamafiyat+stopfiyat)))

mostcolor=ortalamafiyat>mostfiyat?lime:fuchsia
plot(mostfiyat, color=mostcolor, linewidth=4, title="Most-fiyat")

/////AL-SAT LONG-SHORT girislerini belirleme/////
long=ortalamafiyat>mostfiyat and ortalamafiyat[1]<mostfiyat[1]
short=ortalamafiyat<mostfiyat and ortalamafiyat[1]>mostfiyat[1]
if (long) 
    strategy.entry("AL-Long", strategy.long, when = zamanaraligi())
if (short) 
    strategy.entry("SAT-Short", strategy.short, when = zamanaraligi())

Mehr