
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.
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.
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:
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:
Il est possible de raccourcir le cycle moyen ou d’ajouter plus d’indicateurs pour un jugement global.
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.
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.
La stratégie peut également être optimisée dans les domaines suivants:
Test de plus de combinaisons de périodes de moyenne ligne pour trouver le paramètre optimal.
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.
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.
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.
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é.
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.
/*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