Stratégie de tendance à long terme de la BTC et de l'ETH

Auteur:ChaoZhang est là., Date: 2023-10-07 10:16:09 Je vous en prie.
Les étiquettes:

Résumé

Il s'agit d'une stratégie de tendance à long terme automatisée basée sur des indicateurs techniques simples pour les crypto-monnaies comme le Bitcoin et l'Ethereum, visant à capturer les tendances haussières majeures et à réduire les pertes de frais de négociation dues au trading fréquent.

La logique de la stratégie

  1. Utiliser le MACD pour déterminer la direction de la tendance, long lorsque le MACD croise vers le haut;

  2. Calculer l'EMA à 20 périodes, la SMA à 100 périodes et la SMA à 200 périodes, aller long lorsque l'EMA et la SMA pointent vers le haut ensemble;

  3. Acheter lorsque l'EMA est supérieure à la SMA et que la SMA est supérieure à la SMA lente;

  4. Mettez la ligne stop-loss, arrêtez-vous quand le prix dépasse.

  5. Fermer une position lorsque le prix chute et que l'EMA dépasse la SMA.

Cette stratégie combine plusieurs indicateurs pour déterminer la tendance et le moment de l'entrée afin de tirer profit des tendances haussières majeures.

Les avantages

  1. Une combinaison de plusieurs indicateurs peut aider à filtrer les fausses fuites et les signaux erronés.

  2. Seules les tendances évidentes peuvent réduire les transactions inutiles et réduire la fréquence des transactions.

  3. Le stop loss peut effectivement limiter la perte maximale par transaction.

  4. Le backtest montre une rentabilité décente en BTC et ETH.

  5. Une logique simple et claire, facile à comprendre et à mettre en œuvre, bonne pour les débutants.

  6. Une grande extensibilité pour inclure plus d'indicateurs d'optimisation.

Les risques

  1. Un marché très aléatoire, des risques de mauvais jugement.

  2. L'approche de la position unique ne peut pas couvrir les risques systématiques.

  3. Un mauvais réglage du stop-loss peut entraîner un surstop-loss.

  4. Le backtest ne représente pas les résultats en direct, les performances réelles n'ont pas encore été validées.

  5. L'impact des coûts de négociation n'est pas pris en compte, peut différer de la performance en direct.

  6. Les caractéristiques du produit n'ont pas été prises en compte, des paramètres doivent être ajustés.

Directions d'optimisation

  1. Testez différentes combinaisons de paramètres pour optimiser les paramètres de l'indicateur.

  2. Ajoutez des filtres comme KDJ pour filtrer les signaux d'entrée.

  3. Optimiser la stratégie de stop loss, comme ajouter un stop loss dynamique.

  4. Considérez la taille des positions en fonction de la taille du compte.

  5. Distinguer les caractéristiques du produit et ajuster les paramètres en conséquence.

  6. Incorporer plus de délais pour l'analyse.

  7. Essayez différents produits et trouvez ceux qui vous conviennent le mieux.

Conclusion

La logique de la stratégie est simple et claire. L'utilisation de plusieurs indicateurs peut aider à filtrer efficacement les mauvais signaux. Mais une optimisation supplémentaire des paramètres, du contrôle des risques, etc. est nécessaire, combinée à une vérification de la négociation en direct, avant l'application réelle.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////


[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 (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order 
//positionSize = input (1000, "in $")
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  = 2019


//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     = 31
ToMonth   = 12
ToYear    = 2099

// === 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"



//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length") 
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]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
 
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2) 
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)

atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price


//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
//    //calculate the percentegage difference over the last 10 bars
//    smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
//    if smaPercentageIncrease < SMA_PERCENT_INCREASE
//        //Not enough increase we reset the flag 
//        bSMASlowIsRising := false 
        
 
if (window()) 
    //Check if we can open a LONG
//sma > smaSlow and
    if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
    // add comparaison between macd and macd signal line
    //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < 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]) or currentPrice < sma[1]))  
    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