Stratégie de négociation algorithmique de rupture de dynamique double et de filtrage de la volatilité

Auteur:ChaoZhang est là., Date: le 22 décembre 2023 12:01:21
Les étiquettes:

img

Résumé

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é.

Principe de stratégie

Les principales composantes de cette stratégie sont les suivantes:

  1. 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.

  2. 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.

  3. La volatilité de l'ATR est jugée élevée ou basse par une ligne de moyenne mobile paramétrée.

  4. 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.

  5. Mettre en place des règles de stop loss, de profit et de trailing stop pour les positions longues.

Analyse des avantages

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.

Analyse des risques

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.

Directions d'optimisation

  1. Testez différentes combinaisons de paramètres de l'indicateur de momentum pour trouver les réglages optimaux.

  2. Essayez de remplacer les indicateurs de dynamique de la double EMA par le MACD ou d'autres indicateurs.

  3. Test de différentes configurations d'indice de volatilité, telles que l'ATR historique global, l'indice de volatilité du marché, etc.

  4. Ajouter un filtre de volume pour éviter le risque de fausses écarts de prix.

  5. Optimiser les mécanismes de stop-loss et de prise de profit pour améliorer le rapport risque/rendement.

Conclusion

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")



Plus de