Stratégie de négociation de cryptos basée sur le MACD

Auteur:ChaoZhang est là., Date: 2023-09-19 11:21:42 Je vous en prie.
Les étiquettes:

Résumé

Cette stratégie utilise les indicateurs de convergence moyenne mobile (MACD) et d'indice de force relative (RSI) pour identifier les signaux de trading pour les crypto-monnaies.

La logique de la stratégie

  1. Calculer l'EMA à 12 jours et l'EMA à 26 jours comme moyennes mobiles à court et à long terme.

  2. Calculer la différence entre les courts et les longs EMA sous forme d'histogramme MACD.

  3. Calculer l'EMA à 9 jours du MACD comme ligne de signal.

  4. Calculer le RSI de 14 jours pour juger des niveaux de surachat/survente.

  5. Afficher le signal d'achat lorsque le MACD traverse au-dessus de la ligne de signal et que le RSI est supérieur à 81.

  6. Affichage du signal de vente lorsque le MACD traverse la ligne de signal et que le RSI est inférieur à 27.

  7. Utiliser le module de stratégie intégré pour les entrées et les sorties.

Analyse des avantages

  1. Le MACD peut identifier les tendances et les changements, le RSI montre les niveaux de surachat/survente.

  2. Le MACD au-dessus/au-dessous de la ligne zéro indique la direction/la force de la tendance à court terme par rapport à la tendance à long terme.

  3. L'indicateur RSI à des niveaux élevés/faibles indique une possible surchauffe/survente.

  4. Des signaux de trading clairs et simples, faciles à exécuter systématiquement.

  5. Paramètres personnalisables pour l'optimisation et l'adaptation aux différentes conditions du marché.

Analyse des risques

  1. Les données MACD et RSI, sujettes à de fausses ruptures et anomalies, peuvent générer des signaux incorrects.

  2. Les paramètres fixes peuvent ne pas s'adapter à l'évolution des marchés et doivent être optimisés.

  3. Les signaux peuvent être retardés, incapables de négocier à des moments cruciaux.

  4. Seulement long/short, incapable de tirer profit de divers marchés.

Directions d'optimisation

  1. Testez différentes combinaisons de paramètres pour trouver les paramètres optimaux.

  2. Ajoutez des filtres pour éviter les faux échanges.

  3. Ajouter un stop loss pour limiter les pertes sur les marchés unilatéraux.

  4. Gérer la taille des positions, l'augmentation des tendances et la diminution des fourchettes.

  5. Combinez avec d'autres indicateurs pour obtenir des signaux plus précis.

  6. Test sur différents instruments et délais.

Résumé

Cette stratégie utilise les forces complémentaires du MACD et du RSI pour identifier les tendances et les signaux de trading. Les paramètres de réglage fin et l'ajout de filtres peuvent améliorer la robustesse et la rentabilité.


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

//@version=3
// Revision:        5
// Author:          @Hugo_Moriceau
//study("Thesis_EMLYON_Withdate-strategies-Daily_Crypto_Moriceau_indicator",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Daily_Crypto_Moriceau_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)



tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
aboveBelow = fastMA >= slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === Plot Setting ===

//plot(fastMA,color=red)
//plot(slowMA,color=blue)
//barcolor(color=iff(fastMA > slowMA, yellow, na))
//barcolor(color=iff(fastMA < slowMA, black, na))
barcolor(color=iff(macd > 0.12*close , fuchsia, na))
barcolor(color=iff(macd < -0.1*close , lime, na))
dataS= macd > 0.125 and rsi>81 and fastMA > slowMA
dataB= macd < -0.1  and rsi<27 and fastMA< slowMA


plotchar(dataB, char='B',color=black,size = size.tiny,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.tiny,location = location.abovebar,transp= 0)


// === BACKTEST RANGE ===
FromMonth = input(defval = 01, title = "From Month", minval = 1)
FromDay   = input(defval = 01, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year", minval = 2014)
ToMonth   = input(defval = 2, title = "To Month", minval = 1)
ToDay     = input(defval = 10, title = "To Day", minval = 1)
ToYear    = input(defval = 2019, title = "To Year", minval = 2018)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 20000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 1500, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 100, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===

// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===

enterShort() => tradeDirection[1] and not tradeDirection
exitShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Short", long = false, when = enterShort())
strategy.close(id = "Short", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===

// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

Plus de