Stratégie de croisement à double moyenne mobile

Auteur:ChaoZhang est là., Date: 2024-01-12 14:59:18 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de croisement de la moyenne mobile double est une stratégie typique de suivi de tendance. Elle utilise deux lignes EMA avec des périodes différentes et va long lorsque l'EMA de la période la plus courte traverse l'EMA de la période la plus longue et va court lorsque l'intersection opposée capture des renversements de tendance.

Principaux

Les indicateurs de base de cette stratégie sont deux lignes EMA, l'une à 30 périodes et l'autre à 60 périodes.

emaLen1 = emaFuncOne(close, lenMA1)
emaLen2 = emaFuncTwo(close, lenMA2)  

Les signaux de négociation sont générés à partir du croisement des deux lignes EMA:

currentState = if emaLen2 > emaLen1
    0
else 
    1

previousState = if emaLastLen2 > emaLastLen1 
    0
else
    1

convergence = if currentState != previousState
    1  
else
    0

Lorsque la courte période EMA traverse la courte période EMA, l'état actuel n'est pas égal à l'état précédent, un signal de croisement est déclenché. Lorsque la courte période EMA dépasse la courte période EMA, l'état actuel n'est pas égal à l'état précédent, un signal de croisement est déclenché, passez court.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. La logique est simple et intuitive, facile à comprendre et à mettre en œuvre
  2. Légère les fluctuations des prix avec l'EMA et filtre le bruit du marché
  3. Suivre automatiquement les tendances, éviter de manquer des transactions

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Les signaux croisés peuvent être retardés et ne pas capter les renversements en temps opportun.
  2. Les signaux de Whipsaw peuvent se produire fréquemment sur les marchés à fourchette
  3. Un mauvais réglage des paramètres peut entraîner une sursensibilité ou des retards

L'optimisation peut être effectuée en ajustant les périodes EMA ou en ajoutant des filtres.

Directions d'optimisation

Cette stratégie peut être optimisée par les aspects suivants:

  1. Testez différentes combinaisons de périodes EMA
  2. Ajouter des filtres de volume ou de volatilité pour réduire les faux signaux
  3. Incorporer d'autres indicateurs tels que le MACD pour confirmer les tendances
  4. Optimiser la gestion de l'argent avec le stop loss et le profit

Conclusion

La stratégie de croisement des moyennes mobiles doubles est une stratégie simple et pratique de suivi des tendances. Elle est simple, facile à mettre en œuvre et peut suivre automatiquement les tendances. Mais certains risques comme le retard et les faux signaux existent.


/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("ParkerMAStrat", overlay=true)

lenMA1=input(title="Length 1", defval=30)
lenMA2=input(title="Length 2",  defval=60)

x = 0

checkLines(current, last) =>

    if current > last
        x = 1
    else
        x = 0
    x
    

//plot ema based on len1
emaFuncOne(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[1])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

emaLen1 = emaFuncOne(close, lenMA1)

    
plot(emaLen1, color=green, transp=0, linewidth=2)
// now we plot the _10_period_ema

//plot ema based on len2
emaFuncTwo(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[1])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

//plot ema based on len2
emaFuncOneLast(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[0])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function

//plot ema based on len2
emaFuncTwoLast(src, time_period) =>

    alpha = 2 / (time_period + 1)
    // we have defined the alpha function above
    ema = 0.0
    // this is the initial declaration of ema, since we dont know the first ema we will declare it to 0.0 [as a decimal]
    ema := alpha * src + (1 - alpha) * nz(ema[0])
    // this returns the computed ema at the current time
    // notice the use of : (colon) symbol before =, it symbolises, that we are changing the value of ema,
    // since the ema was previously declared to 0
    // this is called mutable variale declaration in pine script
    ema
    // return ema from the function



emaLastLen1 = emaFuncOneLast(close, lenMA1)
emaLastLen2 = emaFuncTwoLast(close, lenMA2)
emaLen2 = emaFuncTwo(close, lenMA2)

    
plot(emaLen2, color=red, transp=30, linewidth=2)
// now we plot the _10_period_ema

//now we compare the two and when green crosses red we buy/sell (line1 vs line2)

previousState = if emaLastLen2 > emaLastLen1
    0
else
    1

currentState = if emaLen2 > emaLen1
    0
else
    1

convergence = if currentState != previousState
    1
else
    0

    
lineCheck = if convergence == 1 
    checkLines(currentState, previousState)
    
if lineCheck == 1
    strategy.entry("Long", strategy.long)
else
    strategy.entry("Short", strategy.short)


Plus de