Stratégie de suivi des tendances basée sur la moyenne mobile

Auteur:ChaoZhang est là., Date: 2023-10-07 15:04:00 Je vous en prie.
Les étiquettes:

Résumé

Cette stratégie identifie la direction de la tendance actuelle en calculant les moyennes mobiles de différentes périodes et génère des signaux de trading combinés à l'indicateur RSI. Lorsque la moyenne mobile de courte période dépasse la moyenne mobile de longue période, la tendance est considérée comme élevée et un signal d'achat est généré. Lorsque la moyenne mobile de courte période dépasse la moyenne mobile de longue période, la tendance est considérée comme inversée et un signal de vente est généré.

La logique de la stratégie

  1. Calculer les moyennes mobiles simples de 10 jours, 20 jours, 50 jours, 100 jours et 200 jours.

  2. Calculer la valeur du RSI à 14 jours.

  3. Lorsque la SMA à 10 jours franchit le seuil de la SMA à 50 jours et que le RSI est supérieur à 30 et que la SMA à 20 jours est supérieure ou égale à la SMA à 100 jours ou que la SMA à 50 jours est supérieure ou égale à la SMA à 100 jours, acheter.

  4. Le prix d'entrée est multiplié par (1 - pourcentage d'arrêt de perte).

  5. Vendre lorsque:

    • La SMA à 10 jours franchit la barre inférieure à la SMA à 50 jours et la clôture est inférieure à la SMA à 20 jours: signal de vente de renversement de tendance
    • Fermeture inférieure à 95% du prix d'entrée: vente de stop loss
    • La clôture est inférieure au prix du stop-loss: vente de stop-loss

Cette stratégie juge la tendance du marché en utilisant des moyennes mobiles et définit un stop loss pour contrôler les risques. Le RSI filtre les fausses ruptures. Il achète lorsque la SMA à court terme franchit la SMA à long terme, indiquant une tendance haussière, et définit une ligne de stop loss pour contrôler les risques pendant la période de détention. Il vend lorsqu'un signal d'inversion de tendance se produit ou que le prix de stop loss est déclenché.

Analyse des avantages

  • En utilisant des moyennes mobiles pour déterminer la direction de la tendance, l'achat pendant la tendance haussière évite de négocier sur des marchés à fourchette
  • L'utilisation de moyennes mobiles sur plusieurs périodes permet d'éviter d'être induit en erreur par les fluctuations de prix à court terme
  • La combinaison avec le RSI filtre les faux signaux
  • Définition des contrôles des risques à la baisse pour chaque transaction
  • Utilisation d'un stop-loss de suivi pour verrouiller les bénéfices

Analyse des risques

  • Les moyennes mobiles ont un décalage et peuvent manquer le meilleur moment pour l'inversion des prix
  • Le paramètre de stop-loss trop lâche peut entraîner des pertes importantes pour les transactions uniques
  • Le paramètre de stop loss trop serré peut entraîner des déclencheurs de stop loss trop fréquents.
  • L'arrêt de perte de trailing peut être exécuté trop tôt en manquant des bénéfices plus importants

L'optimisation peut être effectuée en ajustant les périodes de moyenne mobile, les niveaux de stop loss, etc. Considérez également la combinaison avec d'autres indicateurs pour améliorer la précision.

Directions d'optimisation

  • Ajustement des périodes moyennes mobiles pour s'adapter aux différentes conditions du marché
  • Optimiser les paramètres de l'indicateur RSI pour mieux identifier les conditions de surachat/survente
  • Définir des niveaux raisonnables de perte de freinage statique et de freinage de traînée en fonction des caractéristiques de l'instrument
  • Ajouter d'autres indicateurs pour éviter les faux signaux
  • Ajustez dynamiquement le stop loss en fonction de la volatilité, etc.
  • Optimiser automatiquement les paramètres par apprentissage automatique

Résumé

La stratégie a une logique générale claire, utilisant des moyennes mobiles pour la détermination de la tendance et la définition d'un stop loss pour contrôler les risques. C'est une stratégie de suivi de tendance typique. D'autres améliorations peuvent être obtenues grâce à l'ajustement des paramètres et à l'ajout d'autres indicateurs. Mais aucune stratégie n'est parfaite, des ajustements et des optimisations continus sont nécessaires pour faire face aux incertitudes du marché, ainsi qu'une bonne gestion des risques.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)
    
    


Plus de