Il s'agit d'une stratégie simple de suivi de la tendance de la moyenne mobile adaptée au Bitcoin et à Ethereum. Il combine plusieurs indicateurs tels que les moyennes mobiles, le MACD et le RSI pour identifier la direction de la tendance, et adopte un dimensionnement de position fixe pour le suivi de la tendance à long terme.
La logique de base de la stratégie est d'aller long lorsque l'EMA de 20 jours franchit le SMA de 100 jours et que le SMA de 100 jours franchit le SMA de 200 jours; fermer les positions lorsque l'EMA de 20 jours franchit le SMA de 100 jours. C'est-à-dire utiliser trois moyennes mobiles de différentes périodes pour déterminer la direction de la tendance.
Plus précisément, la stratégie calcule les valeurs de l'EMA à 20 jours, de la SMA à 100 jours et de la SMA à 200 jours, et compare leur relation de magnitude pour juger de la tendance. Lorsque l'EMA à 20 jours franchit le sommet de la SMA à 100 jours, cela signifie que les prix ont commencé à augmenter. À ce stade, si la SMA à 100 jours est également supérieure à la SMA à 200 jours, cela indique que les tendances à moyen et long terme augmentent également. C'est un signal long fort.
Après avoir entré dans une position longue, la stratégie continuera à maintenir la position pour suivre la tendance. Lorsque l'EMA de 20 jours franchit à nouveau le seuil inférieur à la SMA de 100 jours, cela indique qu'un signal d'inversion de tendance à court terme s'est produit. À ce stade, la stratégie choisira de fermer les positions pour arrêter les pertes.
En outre, la stratégie intègre également des indicateurs tels que le MACD et le RSI pour confirmer la tendance.
L'avantage majeur de cette stratégie est qu'elle formule des règles claires de négociation de tendances qui permettent de suivre efficacement les tendances à moyen et à long terme.
Utilisez plusieurs moyennes mobiles combinées pour juger de la tendance, qui est relativement fiable.
Adopter des positions de détention à long terme pour suivre les mouvements de tendance sans être dérangé par les fluctuations à court terme du marché.
La combinaison d'indicateurs tels que le MACD et le RSI pour la confirmation du signal de stratégie peut filtrer les fausses ruptures.
En utilisant la croix dorée et la croix de la mort des lignes EMA et SMA pour déterminer les points d'entrée et de sortie, les règles sont simples et claires.
Peut contrôler efficacement les risques en limitant les pertes par le biais d'un stop loss.
Il y a aussi des risques pour cette stratégie. Le principal problème est qu'elle ne peut pas arrêter les pertes à temps lorsque la tendance s'inverse. Les risques et les solutions spécifiques sont les suivants:
Incapacité de suivre les points d'inversion de tendance dans le temps: raccourcir les cycles de moyenne mobile ou ajouter plus d'indicateurs pour un jugement complet.
Une longue durée de détention peut facilement entraîner des pertes plus importantes: raccourcir correctement les lignes de sortie pour un stop-loss rapide.
Les indicateurs de moyenne mobile ont tendance à être en retard: ajouter un certain pourcentage de lignes de stop-loss pour les stop-loss actifs.
Cette stratégie peut également être optimisée dans les aspects suivants:
Testez plus de combinaisons de cycles de moyenne mobile pour trouver les paramètres optimaux.
Essayez d'autres indicateurs ou modèles pour juger des tendances et du moment de l'entrée. tels que les bandes de Bollinger, l'indicateur KD, etc.
Utilisez l'apprentissage automatique et d'autres méthodes pour optimiser dynamiquement les paramètres.
Incorporer des indicateurs de volume de négociation pour éviter les fausses ruptures, par exemple le volume du solde, le volume des transactions, etc.
Développer des systèmes automatiques d'arrêt des pertes et de suivi des arrêts de pertes qui peuvent ajuster les positions d'arrêt des pertes en fonction des conditions du marché.
En résumé, cette stratégie est une stratégie de suivi de tendance simple et directe. Elle utilise des moyennes mobiles pour déterminer la direction de la tendance, le MACD et le RSI pour filtrer les signaux. Adopter des périodes de détention relativement longues pour suivre les mouvements de tendance. Elle peut capturer efficacement les opportunités de tendance à moyen et long terme.
/*backtest start: 2024-01-16 00:00:00 end: 2024-01-17 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="BTC_Long_Only_TV01_200507", overlay=true) //////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! ///////////////////// //280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020 [macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7) //_rsi_len = input(14, title="RSI length") _rsi_len = 14 NewValue = 0 PreviousValue = 0 leverage = 1 smaPercentageIncrease = 0.0 SMA_PERCENT_INCREASE = 0.0 float atrValue = 0 bool bPositionOpened = false float stockPositionSize = 0 float volatilityPercentage = 0.0 bool bDisplayArrow = false bool bEMAIsRising = false bool bSMAIsRising = false bool bSMASlowIsRising = false bool bMACDIsRising = false bool bMACDHistIsRising = false bool bMACDSignalIsRising = false float stopLoss = input (5, "StopLoss in %", type=input.float) //StopLoss associated with the order //Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order float positionSize = 1000 float currentPrice = close float stopLossPrice = 0 float entryPrice = 0 //----------------------------------------------------------- // === INPUT BACKTEST RANGE ONE YEAR //FromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31) //FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12) //FromYear = input(defval = 2020, title = "From Year", minval = 2017) FromDay = 01 FromMonth = 01 FromYear = 2020 //ToDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31) //ToMonth = input(defval = 01, title = "To Month", minval = 1, maxval = 12) //ToYear = input(defval = 2023, title = "To Year", minval = 2017) ToDay = 14 ToMonth = 05 ToYear = 2029 // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" //FUNCTION DEFINITIONS //---------------------- IsRising(data, loopBack) => bIsRising = true for n = 1 to loopBack if data[n] > data[n-1] bIsRising := false continue bIsRising IsFalling(data, loopBack) => bIsFalling = true for n = 1 to loopBack if data[n] < data[n-1] bIsFalling := false continue bIsFalling // END OF FUNCTION DEFINITIONS // emaLength = 20 smaLength = 100 smaSlowLength = 200 ema = ema(close, emaLength) sma = sma(close, smaLength) smaSlow = sma(close, smaSlowLength) plot(sma, color=color.green) plot(smaSlow, color=color.orange) plot(ema, color=color.yellow) //reload previous values stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1] entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1] bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1] positionSize := na(positionSize[1]) ? 1000 : positionSize[1] stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1] //leverage := na(leverage[1]) ? 1 : leverage[1] bEMAIsRising := IsRising(ema, 2) bSMAIsRising := IsRising(sma, 3) bMACDIsRising := IsRising(macdLine, 3) bMACDHistIsRising := IsRising(macdHist, 1) bSMASlowIsRising := IsRising(smaSlow, 10) bMACDSignalIsRising := IsRising(macdSignalLine, 3) atrValue := atr(14) volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price if (window()) //Check if we can open a LONG if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice) //Enter in short position stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured. //calculate exit values stopLossPrice := currentPrice*(1-stopLoss/100) strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice)) entryPrice := currentPrice //store the entry price bPositionOpened := true bDisplayArrow := true if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]))) strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect. //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) //reset some flags bPositionOpened := false bDisplayArrow := true entryPrice := 0.0