L'idée de base de cette stratégie est de générer des signaux de trading basés sur le croisement de multiples moyennes mobiles exponentielles (EMA). Elle va long lorsque l'EMA à court terme traverse l'EMA à long terme depuis le bas, et ferme les positions lorsque l'EMA à court terme traverse l'EMA à long terme. Cette stratégie permet de configurer plusieurs périodes EMA, et chaque EMA peut être activée indépendamment.
Stratégie de négociation dynamique EMA sur plusieurs délais
La stratégie définit 8 périodes de courbe de croissance (EMR) - 8 jours, 13 jours, 21 jours, 34 jours, 55 jours, 89 jours, 144 jours et 233 jours.
Il génère des signaux longs lorsque l'EMA à court terme traverse l'EMA à long terme depuis le bas. Il génère des signaux de sortie lorsque l'EMA à court terme traverse l'EMA à long terme depuis le haut. Donc, si deux EMA sont activés, l'EMA plus court > longerEMA est un signal long, l'EMA plus court < longerEMA est un signal de sortie.
Par exemple, si l'EMA de 55 jours et l'EMA de 89 jours sont activés, la stratégie va long lorsque l'EMA de 55 jours traverse l'EMA de 89 jours et quitte lorsque l'EMA de 55 jours traverse l'EMA de 89 jours. Cela permet à la stratégie d'ajuster dynamiquement les combinaisons d'EMA utilisées, passant de plus longs délais à plus courts ou inversement.
La taille de la position est réglée sur le capital de compte divisé par le nombre d'EMA activées divisé par le nombre d'EMA fermées.
Considérez la combinaison de l'EMA avec d'autres indicateurs, par exemple des canaux ou des oscillateurs pour filtrer les signaux, ou incorporer des indicateurs de tendance et d'inversion.
La stratégie peut être optimisée sous plusieurs aspects:
Optimiser les paramètres EMA par le biais de la numérisation des paramètres et de l'analyse progressive pour trouver les meilleures combinaisons EMA.
Ajoutez des conditions de filtrage sur les croisements EMA pour éviter les faux signaux, par exemple le filtre de volume, le filtre de volatilité, etc.
Combinez avec d'autres indicateurs comme le MACD, le KDJ, les bandes de Bollinger pour tirer parti de la complémentarité.
Ajustez dynamiquement la taille des positions sur chaque EMA en fonction de la volatilité du marché ou de la force de la tendance.
Optimiser les niveaux de stop loss et de profit pour obtenir le meilleur rapport risque/rendement.
Dans l'ensemble, il s'agit d'une stratégie très simple et directe générant des signaux à partir des croisements EMA pour capturer les tendances à court et à moyen terme. Son principal avantage réside dans la haute configuration et la flexibilité pour permettre aux traders de sélectionner les EMA qui leur conviennent. Cependant, EMA seul peut donner facilement de faux signaux, ce qui est le plus grand risque.
/*backtest start: 2023-11-11 00:00:00 end: 2023-12-11 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMA Fan", shorttitle = "EMA Fan", overlay=true) // Revision: 1 // Author: @ToS_MavericK buyprice = 0.0 buyprice := buyprice[1] // === INPUT SMA === EMA1 = input(8) EMA2 = input(13) EMA3 = input(21) EMA4 = input(34) EMA5 = input(55) EMA6 = input(89) EMA7 = input(144) EMA8 = input(233) EnableEMA1 = input(true) EnableEMA2 = input(true) EnableEMA3 = input(true) EnableEMA4 = input(true) EnableEMA5 = input(true) EnableEMA6 = input(true) EnableEMA7 = input(true) EnableEMA8 = input(true) //Profit = input(defval = 5, type = integer, title = "Profit", minval = 1, step = 1) //StopLoss = input(defval = 15, type = integer, title = "StopLoss", minval = 1, step = 1) // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2020, title = "To Year", minval = 2012) // === 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" // === SERIES SETUP === vEMA1 = ema(close, EMA1) vEMA2 = ema(close, EMA2) vEMA3 = ema(close, EMA3) vEMA4 = ema(close, EMA4) vEMA5 = ema(close, EMA5) vEMA6 = ema(close, EMA6) vEMA7 = ema(close, EMA7) vEMA8 = ema(close, EMA8) count = -1 if (EnableEMA1 == true) count := count + 1 if (EnableEMA2 == true) count := count + 1 if (EnableEMA3 == true) count := count + 1 if (EnableEMA4 == true) count := count + 1 if (EnableEMA5 == true) count := count + 1 if (EnableEMA6 == true) count := count + 1 if (EnableEMA7 == true) count := count + 1 if (EnableEMA8 == true) count := count + 1 // set position size Amount = 1 / (close * count) // === EXECUTION === strategy.entry("EMA1", strategy.long, qty = Amount, when = window() and crossover(vEMA1,vEMA2) and EnableEMA1 and EnableEMA2) strategy.close("EMA1", time > finish or crossunder(vEMA1,vEMA2)) strategy.entry("EMA2", strategy.long, qty = Amount, when = window() and crossover(vEMA2,vEMA3) and EnableEMA2 and EnableEMA3) strategy.close("EMA2", time > finish or crossunder(vEMA2,vEMA3)) strategy.entry("EMA3", strategy.long, qty = Amount, when = window() and crossover(vEMA3,vEMA4) and EnableEMA3 and EnableEMA4) strategy.close("EMA3", time > finish or crossunder(vEMA3,vEMA4)) strategy.entry("EMA4", strategy.long, qty = Amount, when = window() and crossover(vEMA4,vEMA5) and EnableEMA4 and EnableEMA5) strategy.close("EMA4", time > finish or crossunder(vEMA4,vEMA5)) strategy.entry("EMA5", strategy.long, qty = Amount, when = window() and crossover(vEMA5,vEMA6) and EnableEMA5 and EnableEMA6) strategy.close("EMA5", time > finish or crossunder(vEMA5,vEMA6)) strategy.entry("EMA6", strategy.long, qty = Amount, when = window() and crossover(vEMA6,vEMA7) and EnableEMA6 and EnableEMA7) strategy.close("EMA6", time > finish or crossunder(vEMA6,vEMA7)) strategy.entry("EMA7", strategy.long, qty = Amount, when = window() and crossover(vEMA7,vEMA8) and EnableEMA7 and EnableEMA8) strategy.close("EMA7", time > finish or crossunder(vEMA7,vEMA8)) plot(vEMA1, title = 'EMA1', color = red, linewidth = 2, style = line) // plot FastMA plot(vEMA2, title = 'EMA2', color = orange, linewidth = 2, style = line) // plot SlowMA plot(vEMA3, title = 'EMA3', color = yellow, linewidth = 2, style = line) // plot SlowMA plot(vEMA4, title = 'EMA4', color = green, linewidth = 2, style = line) // plot SlowMA plot(vEMA5, title = 'EMA5', color = teal, linewidth = 2, style = line) // plot SlowMA plot(vEMA6, title = 'EMA6', color = blue, linewidth = 2, style = line) // plot SlowMA plot(vEMA7, title = 'EMA7', color = maroon, linewidth = 2, style = line) // plot SlowMA plot(vEMA8, title = 'EMA8', color = white, linewidth = 2, style = line) // plot SlowMA //plot(long_stop, title = 'High-ATR', color = red, linewidth = 2, style = line) // plot SlowMA //plot(short_stop, title = 'Low+ATR', color = green, linewidth = 2, style = line) // plot SlowMA