Stratégie de suivi de tendance basée sur l'indicateur SMA multi-périodes


Date de création: 2024-02-04 14:50:24 Dernière modification: 2024-02-04 14:50:24
Copier: 0 Nombre de clics: 680
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance basée sur l’indicateur SMA multi-périodes

Aperçu

Cette stratégie permet de juger et de suivre la tendance en combinant plusieurs moyennes SMA de différentes périodes. L’idée centrale est de comparer les directions de hausse et de baisse des SMA de différentes périodes pour juger de la tendance.

Principe de stratégie

  1. La moyenne SMA est utilisée pour 5 cycles différents: 10 cycles, 20 cycles, 50 cycles, 100 cycles et 200 cycles.
  2. Comparer la direction de la hausse et de la baisse des cinq courbes moyennes pour déterminer la direction de la tendance. Par exemple, lorsque les courbes moyennes SMA à 10 cycles, 20 cycles, 100 cycles et 200 cycles augmentent simultanément, la tendance est à la hausse; lorsque la courbe moyenne diminue simultanément, la tendance est à la baisse.
  3. Par exemple, lorsque le SMA de 10 cycles est supérieur à celui de 20 cycles, un signal d’entrée est formé; lorsque le SMA de 10 cycles est inférieur à celui de 20 cycles, un signal d’entrée est formé.
  4. Utiliser ZeroLagEMA comme signal de confirmation d’entrée et de sortie. Faire plus lorsque le cycle rapide est sur ZeroLagEMA, faire plus lorsque le cycle lent est sur ZeroLagEMA; faire plus lorsque le cycle lent est sur le plateau.

Avantages stratégiques

  1. L’utilisation de combinaisons de moyennes SMA de différentes périodes permet de déterminer efficacement la direction des tendances du marché.
  2. La comparaison des valeurs SMA périodiques peut générer des signaux de négociation et former des règles d’entrée et de sortie quantifiées.
  3. Le filtrage Zero LagEMA évite les transactions inutiles et améliore la stabilité de la stratégie.
  4. Le suivi de la tendance est réalisé en combinant le jugement de la tendance et les signaux de négociation.

Risques stratégiques et solutions

  1. Lorsque le marché entre dans la phase de rattrapage de la secousse, les signaux de ligne moyenne SMA peuvent se croiser fréquemment, ce qui entraîne un risque accru de transactions inefficaces et de pertes.
    • Solution: augmenter le paramètre de filtrage de ZeroLagEMA pour éviter l’entrée de signaux invalides.
  2. En se référant à des SMA plus cycliques, le signal a été jugé retardé et il n’a pas été possible de réagir rapidement aux fortes variations de prix à court terme.
    • La solution: un jugement d’accompagnement combiné à des indicateurs plus sensibles, tels que le MACD.

Orientation de l’optimisation de la stratégie

  1. Optimiser les paramètres du cycle SMA pour trouver la meilleure combinaison de paramètres.
  2. Augmentation des stratégies de stop loss, telles que le suivi des stop loss, afin de mieux contrôler les pertes individuelles.
  3. L’ajout d’un mécanisme de gestion des positions permettant aux stratégies d’augmenter les positions en cas de forte tendance et de réduire les positions en cas de choc.
  4. La stabilité globale de la stratégie est améliorée par la combinaison d’un plus grand nombre d’indicateurs auxiliaires, tels que le MACD, le KDJ, etc.

Résumer

Cette stratégie permet de juger efficacement de la direction des tendances du marché en combinant plusieurs courbes moyennes SMA et de générer des signaux de trading quantifiés. En même temps, l’application de ZeroLagEMA améliore la fluidité de la stratégie.

Code source de la stratégie
/*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 ===