Stratégie de dynamique basée sur le croisement DEMA et EMA avec filtre de volatilité ATR

Auteur:ChaoZhang est là., Date: le 08 janvier 2024
Les étiquettes:

img

I. Vue d'ensemble de la stratégie

Cette stratégie s'appelle Momentum Strategy Based on DEMA and EMA Crossover with ATR Volatility Filter. Elle génère des signaux de trading à court terme en détectant les croisements DEMA et EMA combinés à l'indice de volatilité ATR. Lorsque DEMA traverse en dessous de l'EMA tandis que l'ATR augmente, elle raccourcit le titre. Lorsque DEMA recroît au-dessus de l'EMA, elle ferme la position.

II. Logique stratégique

  1. Calculez l'indicateur DEMA. DEMA est la moyenne mobile exponentielle double en utilisant des EMA doubles, qui peuvent filtrer le bruit de marché à court terme et améliorer la précision du signal.

  2. Calculer l'indicateur EMA. L'EMA est la moyenne mobile exponentielle qui réagit plus rapidement aux variations de prix.

  3. Calculer l'indice de volatilité de l'ATR. L'ATR mesure la volatilité du marché et les niveaux de risque.

  4. Lorsque la DEMA dépasse la EMA et que l'ATR dépasse le seuil, cela indique le début d'une tendance à la baisse à court terme et un risque de marché accru.

  5. Lorsque la DEMA recroise la EMA, elle signale un soutien des prix et un rebond à la hausse.

III. Avantages

  1. La combinaison de la double EMA et de la EMA peut améliorer efficacement la précision du signal.

  2. Le filtre de volatilité ATR élimine les transactions à faible risque.

  3. La période de détention courte convient au suivi de l'élan à court terme et évite une couverture prolongée.

  4. Une logique simple et claire, facile à comprendre et à mettre en œuvre.

IV. Les risques

  1. Des paramètres ATR inappropriés peuvent manquer des opportunités de négociation.

  2. Besoin de surveiller simultanément les signaux longs et courts, augmentant la difficulté d'exploitation.

  3. Affecté par la volatilité à court terme du marché.

Solutions: Optimisation des paramètres par backtesting. Simplifier la logique pour se concentrer sur un seul côté. Relaxer les niveaux de stop loss de manière appropriée.

V. Directions d'optimisation

  1. Optimiser les paramètres pour DEMA et EMA pour trouver les meilleures combinaisons.

  2. Optimiser la période d'observation de l'ATR afin de déterminer le point de référence de volatilité optimal.

  3. Ajouter d'autres indicateurs comme les bandes BOLL pour améliorer la précision du signal.

  4. Introduisez des règles de stop loss et de profit pour obtenir des profits plus constants.

VI. Conclusion

Cette stratégie construit un système de négociation à court terme simple mais efficace en utilisant le DEMA, les croisements EMA et l'indice de volatilité ATR. La logique propre et la facilité d'utilisation le rendent approprié pour le trading de momentum à haute fréquence.


/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 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
// 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("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", 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)

// get ATR VALUE
atr = atr(14)

//ATRP (Average True Price in precentage)

// 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)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)

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


// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry

//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and  crossover(dema1, ema1)


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

//Invert trade direction & flipping 
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")

// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)

// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
    shortStopSaved := slType ? shortStop : shortStopPercent
    enterShort:= true
    entry := close


// long conditions 
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)

//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")

//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
 from_entry="short",
 limit=exitSignal ? close : na,
 stop=shortStopSaved,
 when=strategy.position_size > 0,
 comment="end short")
 

//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1) 
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())


Plus de