Cette stratégie utilise principalement le croisement de la double dynamique EMA et de la dynamique DEMA pour identifier les tendances et intègre l'indice de volatilité ATR pour filtrer les fausses ruptures, en mettant en œuvre une stratégie de négociation quantitative avec des indicateurs de double dynamique et un filtrage de volatilité.
Les principales composantes de cette stratégie sont les suivantes:
Calculer l'EMA et la DEMA du prix comme indicateurs de dynamique doubles. L'EMA à plus longue période reflète les tendances à long terme, tandis que la DEMA sert d'indicateur de dynamique à court terme plus sensible. Un signal d'achat est généré lorsque la DEMA franchit le sommet de l'EMA.
Calculer l'indice de volatilité ATR. Utiliser la valeur ATR pour déterminer la volatilité du marché et les conditions de liquidité. Filtrer les signaux de l'indicateur de dynamique lorsque la volatilité est trop élevée pour éviter de fausses ruptures.
La volatilité de l'ATR est jugée élevée ou basse par une ligne de moyenne mobile paramétrée.
Les paramètres contrôlent le délai d'ATR, la longueur d'ATR, le type et la longueur de la moyenne mobile d'ATR, etc.
Mettre en place des règles de stop loss, de profit et de trailing stop pour les positions longues.
L'ajout de l'indice de volatilité ATR filtre efficacement les signaux trompeurs des fluctuations mineures et évite d'être piégé.
En comparaison avec les indicateurs de momentum simples, la conception double peut améliorer l'efficacité du jugement.
En ajustant les paramètres ATR, des seuils de volatilité appropriés peuvent être fixés pour différents indicateurs, ce qui améliore l'adaptabilité de la stratégie.
Le plus grand risque est que des paramètres mal réglés puissent entraîner trop peu de signaux de trading. Des longueurs DEMA et EMA trop longues, ou des seuils de volatilité ATR trop élevés, peuvent tous compromettre les performances réelles de la stratégie. Des backtests répétés sont nécessaires pour trouver la combinaison optimale de paramètres.
Un autre risque potentiel est que, dans des conditions de marché extrêmes, les fluctuations de prix peuvent violer les contraintes du paramètre ATR entraînant des pertes.
Testez différentes combinaisons de paramètres de l'indicateur de momentum pour trouver les réglages optimaux.
Essayez de remplacer les indicateurs de dynamique de la double EMA par le MACD ou d'autres indicateurs.
Test de différentes configurations d'indice de volatilité, telles que l'ATR historique global, l'indice de volatilité du marché, etc.
Ajouter un filtre de volume pour éviter le risque de fausses écarts de prix.
Optimiser les mécanismes de stop-loss et de prise de profit pour améliorer le rapport risque/rendement.
Cette stratégie intègre l'analyse de l'élan et la recherche de la volatilité avec une base théorique solide. Grâce à l'optimisation des paramètres et de la logique, elle peut devenir un système de trading algorithmique stable et fiable. Avec des signaux commerciaux clairs et des risques contrôlables, il vaut la peine d'être vérifié et mis en œuvre dans le trading en direct.
/*backtest start: 2023-11-21 00:00:00 end: 2023-12-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Qorbanjf //@version=4 strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true) // DEMA length = input(10, minval=1, title="DEMA LENGTH") src = input(close, title="Source") e1 = ema(src, length) e2 = ema(e1, length) dema1 = 2 * e1 - e2 plot(dema1, "DEMA", color=color.yellow) //EMA len = input(25, minval=1, title="EMA Length") srb = input(close, title="Source") offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) ema1 = ema(srb, len) plot(ema1, title="EMA", color=color.blue, offset=offset) // Inputs atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution) atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer) useMA = input(title = "Show Moving Average?", type = input.bool, defval = true) maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type") maLength = input(defval = 20, title = "Moving Average Period", minval = 1) //longLossPerc = input(title="Long Stop Loss (%)", // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01 longTrailPerc = input(title="Trail stop loss (%)", type=input.float, minval=0.0, step=0.1, defval=50) * 0.01 longProfitPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=3000) / 100 // === 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 = 2017, title = "From Year", minval = 2000) 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 = 9999, title = "To Year", minval = 2017) // ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30) atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback)) atrp = (atrValue/close)*100 // Moving Average Logic ma(maType, src, length) => maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc) maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength)) // variables for enter position enterLong = crossover(dema1, ema1) and atrp < maFilter // variables for exit position sale = crossunder(dema1, ema1) // stop loss //longStopPrice = strategy.position_avg_price * (1 - longLossPerc) // trail stop // Determine trail stop loss prices longStopTrail = 0.0 longStopTrail := if (strategy.position_size > 0) stopValue = close * (1 - longTrailPerc) max(stopValue, longStopTrail[1]) else 0 //Take profit Percentage longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) //Enter trades when conditions are met strategy.entry(id="long", long=strategy.long, when=enterLong, comment="long") // strategy.close("long", when = sale, comment = "Sell") //place exit orders (only executed after trades are active) strategy.exit(id="sell", limit = longExitPrice, stop = longStopTrail, comment = "SL/TP")