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é.
Calculer les moyennes mobiles simples de 10 jours, 20 jours, 50 jours, 100 jours et 200 jours.
Calculer la valeur du RSI à 14 jours.
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.
Le prix d'entrée est multiplié par (1 - pourcentage d'arrêt de perte).
Vendre lorsque:
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é.
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.
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)