Moyenne mobile à facteurs multiples suivant une stratégie

Auteur:ChaoZhang est là., Date: 18 janvier 2024
Les étiquettes:

img

Résumé

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 la stratégie

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.

Les avantages

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.

  1. Utilisez plusieurs moyennes mobiles combinées pour juger de la tendance, qui est relativement fiable.

  2. 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é.

  3. La combinaison d'indicateurs tels que le MACD et le RSI pour la confirmation du signal de stratégie peut filtrer les fausses ruptures.

  4. 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.

  5. Peut contrôler efficacement les risques en limitant les pertes par le biais d'un stop loss.

Risques et solutions

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:

  1. 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.

  2. 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.

  3. Les indicateurs de moyenne mobile ont tendance à être en retard: ajouter un certain pourcentage de lignes de stop-loss pour les stop-loss actifs.

Directions d'optimisation

Cette stratégie peut également être optimisée dans les aspects suivants:

  1. Testez plus de combinaisons de cycles de moyenne mobile pour trouver les paramètres optimaux.

  2. 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.

  3. Utilisez l'apprentissage automatique et d'autres méthodes pour optimiser dynamiquement les paramètres.

  4. Incorporer des indicateurs de volume de négociation pour éviter les fausses ruptures, par exemple le volume du solde, le volume des transactions, etc.

  5. 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é.

Conclusion

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
        


Plus de