Stratégie d'arrêt des pertes de suivi des moyennes mobiles

Auteur:ChaoZhang est là., Date: 2023-10-24 11h21 et 57 min
Les étiquettes:

img

Résumé

L'idée de base de cette stratégie est de concevoir un système de négociation automatisé qui peut tirer profit des marchés en tendance tout en contrôlant les retraits en utilisant des moyennes mobiles et un mécanisme de stop loss.

La logique de la stratégie

  1. La stratégie permet aux utilisateurs de choisir parmi différents types de moyennes mobiles, y compris la moyenne mobile simple, la moyenne mobile exponentielle, la moyenne mobile pondérée, etc. Les utilisateurs peuvent sélectionner le type de moyenne mobile en fonction de leurs préférences.

  2. Les utilisateurs doivent définir la période de la moyenne mobile, généralement comprise entre 20 et 60 pour les transactions à moyen terme.

  3. Une fois la moyenne mobile choisie, la stratégie la calculera en temps réel. Elle sera longue lorsque le prix dépasse la moyenne mobile et courte lorsque le prix dépasse la moyenne mobile.

  4. La stratégie utilise un mécanisme de stop loss de suivi. Après avoir ouvert une position, elle surveillera en permanence la relation entre la moyenne mobile et le prix et ajustera dynamiquement le niveau de stop loss. Plus précisément, le stop loss est défini à la moyenne mobile plus/moins un pourcentage de stop loss défini par l'utilisateur.

  5. Les utilisateurs peuvent définir le pourcentage de stop loss. Un pourcentage plus élevé signifie une plage de stop loss plus large et moins de sensibilité. Un pourcentage plus petit signifie un stop loss plus serré et un risque plus faible. Le pourcentage de stop loss est généralement placé entre 2% et 5%.

  6. Après avoir ouvert une position, si le prix dépasse la moyenne mobile, la position sera fermée.

Les avantages

  • Peut ouvrir des positions le long de la tendance et réaliser des bénéfices plus importants sur les marchés en tendance
  • Utilise le stop loss pour ajuster le niveau de stop en fonction de l'action des prix, évitant ainsi que les stops soient trop serrés
  • Permet de personnaliser les moyennes mobiles et le pourcentage de stop loss en fonction de l'appétit pour le risque
  • Prend en charge divers types de moyennes mobiles, permettant une optimisation par des tests
  • Une logique simple et claire, facile à comprendre et à modifier

Les risques

  • Les prix peuvent fluctuer autour de la moyenne mobile sur les marchés à fourchette, ce qui entraîne une négociation excessive
  • Un pourcentage de stop loss trop élevé peut entraîner une augmentation des pertes
  • Les paramètres optimaux pour la moyenne mobile et le stop loss peuvent différer selon les produits et les délais.
  • Évitez d'utiliser cette stratégie à proximité d'événements majeurs.

Les risques peuvent être optimisés et contrôlés par:

  • Utilisation de la stratégie dans des produits et des délais avec des tendances évidentes
  • Ajustement des moyennes mobiles de période, en utilisant des moyennes mobiles à plus long terme
  • Réduction appropriée du pourcentage de stop loss pour un contrôle plus strict des risques
  • Test séparément sur chaque produit pour trouver les paramètres optimaux
  • Arrêtez de négocier avant les événements majeurs

Des possibilités d'amélioration

La stratégie peut être encore optimisée dans les aspects suivants:

  1. Ajouter d'autres indicateurs pour la confirmation, évitant les transactions excessives pendant les marchés à plage.

  2. Utilisez une combinaison de moyennes mobiles. Par exemple, un MA de 5 jours et un MA de 20 jours peuvent être utilisés ensemble, de sorte que les transactions ne sont effectuées que lorsque les deux s'alignent dans la même direction.

  3. Les paramètres diffèrent selon les produits et les délais, il est donc nécessaire de procéder à des essais distincts.

  4. Ajoutez des règles de dimensionnement de position, par exemple une quantité fixe pour la position initiale, puis ajoutez à la position basée sur la distance stop loss.

  5. Définir le nombre maximal de transactions par jour ou le temps minimum entre les transactions.

  6. Ajouter des algorithmes d'apprentissage automatique pour optimiser dynamiquement les paramètres basés sur des données historiques, en évitant le réglage de paramètres statiques.

  7. Incorporer des modèles d'apprentissage en profondeur pour prédire la tendance des prix, aidant à juger de la direction de la tendance.

Conclusion

Dans l'ensemble, il s'agit d'une stratégie de suivi de tendance très pratique. Il utilise des moyennes mobiles pour déterminer la direction de la tendance et des arrêts de trail pour contrôler le risque. Il peut produire de bons rendements sur les marchés en tendance. La combinaison de l'optimisation des paramètres et de l'intégration avec d'autres indicateurs ou modèles peut encore améliorer la stabilité et la rentabilité. Les utilisateurs doivent noter les différences de paramètres entre les produits et les délais, ainsi que l'impact des événements majeurs.


/*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())

Plus de