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.
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.
Der Nutzer muss die Periode des gleitenden Durchschnitts festlegen, die für den mittelfristigen Handel im Allgemeinen zwischen 20-60 liegt.
Sobald der gleitende Durchschnitt gewählt wurde, berechnet die Strategie ihn in Echtzeit.
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.
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.
Wenn der Kurs nach der Eröffnung einer Position durch den gleitenden Durchschnitt zurückbricht, wird die Position geschlossen.
Die Risiken können durch folgende Maßnahmen optimiert und kontrolliert werden:
Die Strategie kann in folgenden Bereichen weiter optimiert werden:
Hinzufügen anderer Indikatoren zur Bestätigung, um übermäßige Trades während von Range-bound-Märkten zu vermeiden.
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.
Die Parameter unterscheiden sich je nach Produkt und Zeitrahmen, so dass separate Tests erforderlich sind.
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.
Festlegen Sie die maximale Anzahl der Trades pro Tag oder die Mindestzeit zwischen den Trades.
Hinzufügen von Algorithmen für maschinelles Lernen zur dynamischen Optimierung von Parametern basierend auf historischen Daten, ohne statische Parameter einzustellen.
Einbeziehung von Deep-Learning-Modellen zur Prognose der Preisentwicklung und Unterstützung bei der Beurteilung der Trendrichtung.
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())