Stratégie de renversement de la moyenne mobile double

Auteur:ChaoZhang est là., Date: 2023-10-24 10:56:08 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie utilise principalement des moyennes mobiles doubles comme signaux d'achat et de vente pour tirer profit des renversements de tendance. Elle devient longue lorsque la moyenne mobile à court terme dépasse la moyenne mobile à long terme et devient courte lorsque la moyenne mobile à court terme dépasse la moyenne mobile à long terme.

La logique de la stratégie

La stratégie établit d'abord deux moyennes mobiles, une moyenne de 20 jours à court terme et une moyenne de 60 jours à long terme.

Plus précisément, lorsque l'AM à court terme dépasse l'AM à long terme, cela indique une tendance haussière, donc allez long.

La méthode d'arrêt de perte après avoir fait long ou court est l'arrêt de trailing basé sur le prix le plus élevé et le prix le plus bas pour verrouiller le profit maximum.

La logique principale du code est la suivante:

  1. Calcul de l'EMA à 20 jours et de l'EMA à 60 jours
  2. Jugez si l'EMA à 20 jours dépasse l'EMA à 60 jours, si oui, allez long
  3. Jugez si l'EMA à 20 jours dépasse l'EMA à 60 jours, si oui, passez à court
  4. Après avoir passé long, régler le stop loss à 3% sous le prix le plus élevé
  5. Après une opération short, fixer un stop loss à 3% au-dessus du prix le plus bas
  6. Continuez à ajuster le stop loss lorsque vous êtes en position

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Une logique simple, facile à mettre en œuvre.
  2. Le double MA peut filtrer efficacement les fausses ruptures.
  3. Les verrous de freinage pour un profit maximal.
  4. Peut capter les signaux en temps opportun lorsque la tendance change.
  5. Contrôle de la décharge, assez stable.

Analyse des risques

Il y a aussi des risques:

  1. Des croisements fréquents entre les MAs lorsque la tendance n'est pas claire, conduisant à des pertes de suréchange.
  2. Le paramètre stop-loss peut être trop lâche ou trop agressif.
  3. Des paramètres incorrects tels que la longueur de la période peuvent manquer des signaux clés.
  4. Les coûts commerciaux élevés érodent la marge bénéficiaire.

Pour lutter contre les risques:

  1. Adopter des filtres lorsque la tendance n'est pas claire pour éviter le trading à l'aveugle.
  2. Testez et optimisez la plage de perte d'arrêt pour un réglage approprié.
  3. Trouver les paramètres optimaux par backtest et réglage.
  4. Réduire la taille de la position pour réduire les coûts de négociation.

Idées d'optimisation

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

  1. Ajoutez d'autres filtres comme RSI pour l'entrée multi-condition, évitant les fausses pauses.

  2. Optimiser les périodes MA pour trouver le meilleur mélange de paramètres.

  3. Optimiser la plage d'arrêt de perte par le calcul de backtest pour trouver la plage optimale.

  4. Définir la logique de réentrée après la sortie de stop loss pour réduire la fréquence des transactions.

  5. Combinez avec l'indicateur de tendance pour faire une pause lorsque la tendance est incertaine.

  6. Ajouter la dimension de position et le stop loss dynamique basé sur les conditions du marché.

Résumé

En résumé, la stratégie d'inversion de double MA est simple et pratique dans l'ensemble, en identifiant les points de basculement de la tendance grâce à des croisements de double MA. Mais il existe des risques qui nécessitent un ajustement des paramètres, une optimisation des stop-loss et l'ajout de filtres pour maximiser l'efficacité de la stratégie.


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


//@version=2
strategy("Noro's Bands Scalper Strategy v1.4", shorttitle = "Scalper str 1.4", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
takepercent = input(0, defval = 0, minval = 0, maxval = 1000, title = "take, %")
needbe = input(true, defval = true, title = "Bands Entry")
needct = input(false, defval = false, title = "Counter-trend entry")
needdb = input(true, defval = true, title = "Double Body")
len = input(20, defval = 20, minval = 2, maxval = 200, title = "Period")
needbb = input(true, defval = true, title = "Show Bands")
needbg = input(true, defval = true, title = "Show Background")
src = close

//PriceChannel 1
lasthigh = highest(src, len)
lastlow = lowest(src, len)
center = (lasthigh + lastlow) / 2

//Distance
dist = abs(src - center)
distsma = sma(dist, len)
hd = center + distsma
ld = center - distsma
hd2 = center + distsma * 2
ld2 = center - distsma * 2

//Trend
trend = close < ld and high < center ? -1 : close > hd and low > center ? 1 : trend[1]

//Lines
colo = needbb == false ? na : black
plot(hd2, color = colo, linewidth = 1, transp = 0, title = "High band 2")
plot(hd, color = colo, linewidth = 1, transp = 0, title = "High band 1")
plot(center, color = colo, linewidth = 1, transp = 0, title = "center")
plot(ld, color = colo, linewidth = 1, transp = 0, title = "Low band 1")
plot(ld2, color = colo, linewidth = 1, transp = 0, title = "Low band 2")

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Body
body = abs(close - open)
smabody = needdb == false ? ema(body, 30) : ema(body, 30) * 2
candle = high - low

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up7 = trend == 1 and ((bar == -1 and bar[1] == -1) or (body > smabody and bar == -1)) ? 1 : 0
dn7 = trend == 1 and ((bar == 1 and bar[1] == 1) or (close > hd and needbe == true)) and close > strategy.position_avg_price * (100 + takepercent) / 100 ? 1 : 0
up8 = trend == -1 and ((bar == -1 and bar[1] == -1) or (close < ld2 and needbe == true)) and close < strategy.position_avg_price * (100 - takepercent) / 100 ? 1 : 0
dn8 = trend == -1 and ((bar == 1 and bar[1] == 1) or (body > smabody and bar == 1)) ? 1 : 0

if up7 == 1 or up8 == 1 
    strategy.entry("Long", strategy.long, needlong == false ? 0 : trend == -1 and needct == false ? 0 : na)

if dn7 == 1 or dn8 == 1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : trend == 1 and needct == false ? 0 : na)

Plus de