Stratégie du système d'inversion des oscillations de l'EMA

Auteur:ChaoZhang est là., Date: 2023-10-18 12h23 et 13h
Les étiquettes:

img

Résumé

Cette stratégie utilise un système de moyenne mobile pour déterminer la direction de la tendance et combine un indice de volatilité pour éviter les marchés oscillants à faible volatilité, avec une sortie de lustre pour gérer les transactions.

Principe

La stratégie juge la direction de la tendance en comparant les moyennes mobiles rapides et lentes. Elle va long lorsque la MA rapide traverse au-dessus de la MA lente et court lorsque la MA rapide traverse au-dessous de la MA lente. Pour éviter les marchés oscillants, la stratégie intègre également des bandes de Bollinger. Elle génère des signaux de trading lorsque le taux de changement de la largeur de BB dépasse un seuil. Enfin, la stratégie utilise les sorties de Chandelier comme stop loss pour éviter d'être piégé dans les marchés à plage.

Plus précisément, la logique de négociation est la suivante:

  1. Le calcul de l'AM rapide (20 jours par défaut) et de l'AM lente (50 jours par défaut) est effectué.

  2. Calculer le taux de variation de la largeur de la bande de Bollinger (défaut de 40 jours, 2 écarts types).

  3. Passer long lorsque l'AM rapide dépasse l'AM lent et que le taux de variation de la largeur BB dépasse le seuil par défaut de 9%.

  4. Faire court lorsque l'AM rapide dépasse l'AM lente et que le taux de variation de la largeur BB dépasse le seuil par défaut de 9%.

  5. Calculer les arrêts longs et courts de Chandelier.

  6. L'arrêt long est le plus élevé, le plus élevé - ATR * multiplicateur.

Les avantages

  1. Le système MA suit efficacement les tendances.

  2. Le changement de largeur de BB filtre les oscillations, réduisant les transactions inutiles.

  3. Chandelier sort à temps pour éviter d'être pris au piège.

  4. Plusieurs paramètres réglables pour optimisation.

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

Les risques

  1. Le décalage de l'AM peut manquer des renversements rapides.

  2. Les paramètres BB incorrects peuvent filtrer les signaux valides.

  3. Des sorties excessives provoquent une survente.

  4. Une optimisation insuffisante des paramètres conduit à des risques de détention.

  5. Incapable de s'adapter aux changements extrêmes survenus sur le marché suite à des événements majeurs.

Optimisation

  1. Testez différentes combinaisons de MA pour trouver les paramètres optimaux.

  2. Testez différentes périodes BB pour obtenir le meilleur filtre de volatilité.

  3. Ajouter d'autres indicateurs pour la confirmation de l'entrée.

  4. Introduire des arrêts dynamiques pour mieux suivre les marchés.

  5. Utilisez l'apprentissage automatique pour optimiser automatiquement pour les marchés changeants.

Résumé

Cette stratégie intègre le système MA, l'indicateur BB et les sorties du lustre pour former un système de suivi de tendance relativement stable. Une bonne optimisation des paramètres peut obtenir de bons résultats. Mais les risques d'inversion de tendance et d'oscillation demeurent. L'apprentissage automatique peut encore améliorer la robustesse.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
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/
// © juanchez

//@version=4
strategy("CHI", overlay = true, close_entries_rule = "ANY")

n = input(title= "highest high o lowest low period", defval= 22)
f= input(title= "multiplicador", defval= 4)
long = highest(high, n) - atr(n)*f
short= lowest(low, n) + atr(n)*f
plot(long, color= color.red)
plot(short, color= color.green)

//moving averages
period= input(title= "moving averages period", defval= 50)
period2= input(title= "moving averages period2", defval= 20)
type= input(title= "moving averages type", options= ["sma", "ema"], defval= "ema")

//moving average function
mo(p, t) =>
    if t == "sma"
        sma(close[barstate.islast ? 1: 0], p)
    else  if t== "ema"
        ema(close[barstate.islast ? 1: 0], p)

m= mo(period, type)
m2= mo(period2, type)

trend= m2 > m 

plot(m, color = color.maroon, linewidth = 3)
plot(m2, linewidth= 3)


//BOLLINGER BANDS ENTRIES
bb1_period= input(title= "Bollinger bands 1 period", defval=40, minval=1)
bb1_source=input(title="Bollinger band 1 source", defval=close)
bb1_multi=input(title="Bollinger Bands 1 factor", defval=2, minval=1, step=0.1)
show_bb1= input(title="Show Bollinger bands 1", defval=false)
//BOLLINGER BANDS
_bb(src, lenght, multi)=>
    float moving_avg= sma(src[barstate.islast? 1: 0], lenght)
    float deviation= stdev(src[barstate.islast? 1: 0], lenght)
    float lowerband = moving_avg - deviation*multi
    float upperband = moving_avg + deviation*multi
    
    [moving_avg, lowerband, upperband]
    
[bb1, lowerband1, upperband1]= _bb(bb1_source,  bb1_period, bb1_multi)

//FIRST BAND    
plot(show_bb1? bb1 : na, title="BB1 Moving average", linewidth= 3, color= color.fuchsia)
plot(show_bb1? upperband1 : na, title="BB1 Upper Band", linewidth= 3, color= color.green)
plot(show_bb1? lowerband1 : na, title="BB1 Lower Band", linewidth= 3, color= color.red)

//BB's Width threshold 
thresh= input(title= "widen %", defval= 9, minval = 0, step = 1, maxval= 100)

widht= (upperband1 - lowerband1)/bb1
roc= change(widht)/widht[1]*100
cross=crossover(roc, thresh)

// entry
//long
elong= input(true, title= "enable long")
longcondition= m2 > m and cross and elong

//short
eshort= input(true, title= "enable short")
shortcondition= m2 < m and cross and eshort


plotshape(longcondition? true: false , location= location.belowbar, style= shape.labelup, size= size.small, color= color.green, text= "Buy", textcolor= color.white)
plotshape(shortcondition? true: false , location= location.abovebar, style= shape.labeldown, size= size.small, color= color.red, text= "Sell", textcolor= color.white)

out= crossunder(close, long)
outt= crossover(close, short)

strategy.entry("long", strategy.long, when = longcondition)
strategy.close("long", when = out)

strategy.entry("short", strategy.short, when = shortcondition)
strategy.close("short", when = outt)

Plus de