Stratégie de suivi de tendance à moyenne mobile équilibrée long-short


Date de création: 2024-01-18 12:07:52 Dernière modification: 2024-01-18 12:07:52
Copier: 0 Nombre de clics: 608
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance à moyenne mobile équilibrée long-short

Aperçu

Cette stratégie est une stratégie simple de suivi de la tendance des moyennes mobiles pour Bitcoin et Ethereum. Elle combine plusieurs indicateurs tels que la moyenne, le MACD et le RSI pour identifier la direction de la tendance et suivre la tendance en utilisant des positions fixes.

Principe de stratégie

La logique centrale de la stratégie est de faire plus lorsque l’EMA du 20e jour traverse la SMA du 100e jour et plus lorsque la SMA du 100e jour traverse la SMA du 200e jour; et de faire moins lorsque l’EMA du 20e jour traverse la SMA du 100e jour en utilisant les moyennes mobiles de trois périodes différentes pour déterminer la direction de la tendance.

Plus précisément, la stratégie détermine la tendance en calculant les valeurs des lignes EMA de 20 jours, SMA de 100 jours et SMA de 200 jours et en comparant leur relation de grandeur. Lorsque la ligne EMA de 20 jours traverse la ligne EMA de 100 jours, c’est-à-dire que la ligne EMA de 20 jours est supérieure à la ligne EMA de 100 jours, cela indique que le prix commence à monter; à ce moment-là, si la ligne EMA de 100 jours est également supérieure à la ligne EMA de 200 jours, cela indique que la tendance à moyen et long terme est également à la hausse, ce qui est un signal plus fort.

Après avoir franchi une position sur plusieurs jours, la stratégie conserve la position et suit la tendance. Lorsque la ligne 20 EMA revient en dessous de la ligne 100 SMA, indiquant un signal de revers de la tendance à court terme, la stratégie choisit de fermer la position.

En outre, la stratégie combine des indicateurs tels que le MACD et le RSI pour confirmer la tendance. La position est ouverte uniquement lorsque la ligne DIF, la ligne DEMA et la colonne HIST du MACD sont à la hausse et que l’indicateur RSI est supérieur à 50.

Avantages stratégiques

Le plus grand avantage de cette stratégie réside dans la définition de règles de trading de tendances claires qui permettent de suivre efficacement les tendances à long terme. Les avantages spécifiques sont les suivants:

  1. L’utilisation de moyennes mobiles multigroupes est plus fiable pour déterminer la tendance.
  2. Le suivi de la tendance est effectué par la détention d’une position longue ligne, qui ne peut pas être perturbée par les fluctuations du marché à court terme.
  3. Les indicateurs comme le MACD et le RSI sont utilisés pour confirmer les signaux stratégiques et filtrer les fausses ruptures.
  4. Les points d’entrée et de sortie sont déterminés par la ligne EMA et la ligne SMA. Les règles sont simples et claires.
  5. Il est possible de contrôler efficacement les risques et de limiter les pertes par des arrêts de perte.

Risques et solutions

La stratégie comporte également des risques, principalement l’impossibilité de s’arrêter à temps lorsque la tendance est inversée. Les risques spécifiques et les solutions sont les suivants:

  1. Il est possible de raccourcir le cycle moyen ou d’ajouter plus d’indicateurs pour un jugement global.

  2. La durée d’une position trop longue peut entraîner des pertes plus importantes: la ligne de départ peut être raccourcie de manière appropriée et la perte peut être arrêtée à temps.

  3. L’indicateur de ligne moyenne est sujet au retard: une ligne de stop-loss peut être ajoutée avec un certain taux de rétractation, un stop-loss actif.

Direction d’optimisation

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

  1. Test de plus de combinaisons de périodes de moyenne ligne pour trouver le paramètre optimal.

  2. Essayez d’autres indicateurs ou modèles pour juger de la tendance et de l’heure d’entrée. Par exemple, les bandes de Brin, l’indicateur KD, etc.

  3. Paramètres d’optimisation dynamique utilisant l’apprentissage automatique et d’autres méthodes. Par exemple, l’utilisation de l’apprentissage par renforcement pour ajuster l’amplitude d’arrêt.

  4. Les indicateurs de volume de transactions sont combinés pour éviter les fausses ruptures, tels que l’indicateur de marée énergétique, le volume de transactions, etc.

  5. Développer un système d’arrêt automatique et de suivi des pertes, permettant d’ajuster les positions de stop en fonction des conditions du marché.

Résumer

L’ensemble de la stratégie est une stratégie simple et directe de suivi de la tendance. Elle utilise les moyennes mobiles pour déterminer la direction de la tendance, les signaux filtrés du MACD et du RSI.

Code source de la stratégie
/*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