Tendance à la suite d'une stratégie basée sur une SMA à plusieurs périodes

Auteur:ChaoZhang est là., Date: 2024-02-04 14h50 et 24h
Les étiquettes:

img

Résumé

Cette stratégie combine plusieurs lignes SMA avec différentes périodes pour identifier et suivre la tendance. L'idée de base est: comparer les directions de hausse/chute des SMA avec différentes périodes pour déterminer la tendance; aller long lorsque la SMA à court terme traverse la SMA à longue période, et aller court lorsque la SMA courte traverse en dessous de la SMA longue.

La logique de la stratégie

  1. Utiliser 5 lignes SMA avec des périodes de 10, 20, 50, 100 et 200 respectivement.
  2. Comparer les directions de ces 5 SMA pour déterminer la tendance. Par exemple, lorsque les SMA de 10-, 20-, 100 et 200 périodes augmentent ensemble, cela indique une tendance à la hausse; quand elles diminuent toutes, cela indique une tendance à la baisse.
  3. Comparez les valeurs des SMA avec différentes périodes pour générer des signaux de trading. Par exemple, lorsque la SMA de 10 périodes traverse la SMA de 20 périodes, allez long; lorsque la SMA de 10 périodes traverse la SMA de 20 périodes, allez court.
  4. Utilisez ZeroLagEMA pour la confirmation d'entrée et les signaux de sortie. Allez long quand ZeroLagEMA rapide traverse ZeroLagEMA lent, sortez long quand il traverse en dessous. La logique de jugement pour les shorts est l'inverse.

Les avantages

  1. La combinaison de plusieurs SMA avec des périodes différentes peut déterminer efficacement l'évolution du marché.
  2. La comparaison des valeurs SMA génère des règles quantitatives d'entrée et de sortie.
  3. Le filtre ZeroLagEMA évite les échanges inutiles et améliore la stabilité.
  4. La combinaison du jugement de tendance et des signaux de trading permet d'obtenir une tendance après la négociation.

Risques et solutions

  1. Lorsque le marché entre dans une phase de consolidation, les croisements fréquents des SMA peuvent entraîner des pertes redondantes.
    • Solution: Augmenter le filtre ZeroLagEMA pour éviter les entrées de signaux non valides.
  2. À en juger par les SMA à plusieurs périodes, il est un peu en retard, car il ne réagit pas rapidement aux fortes variations de prix à court terme.
    • Solution: ajouter des indicateurs plus rapides comme le MACD pour faciliter le jugement.

Directions d'optimisation

  1. Optimiser les paramètres de la période SMA pour trouver la meilleure combinaison.
  2. Ajoutez des stratégies de stop-loss comme le trailing stop pour limiter davantage les pertes.
  3. Ajouter un mécanisme de dimensionnement des positions pour augmenter les mises en tendance forte et diminuer les mises en consolidation.
  4. Incorporer davantage d'indicateurs d'aide tels que le MACD et le KDJ pour améliorer la stabilité globale.

Conclusion

Cette stratégie détermine efficacement la tendance du marché en combinant des SMA à plusieurs périodes et génère des signaux de trading quantifiés. ZeroLagEMA améliore le taux de gain. En résumé, la stratégie a atteint une tendance quantitative après le trading, avec des résultats remarquables.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, title = "Start From Month", minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===

Plus de