Stratégie de mise en correspondance de moyenne mobile double basée sur des bandes de Bollinger

Auteur:ChaoZhang est là., Date: 2023-11-24 15h32 et 57 min
Les étiquettes:

img

Résumé

La stratégie de correspondance de moyenne mobile double basée sur les bandes de Bollinger est une stratégie de suivi de tendance qui fonctionne avec le prix et le volume sur le marché.

Principe de stratégie

Cette stratégie est principalement basée sur les signaux croisés de l'indicateur des bandes de Bollinger et de l'indicateur de moyenne mobile pour le trading. Plus précisément, elle utilise le rail du milieu, le rail supérieur des bandes de Bollinger et 7 moyennes mobiles avec des longueurs de 5 à 200 jours en même temps. Elle génère un signal d'achat lorsque le prix traverse les rails du milieu et du bas des bandes de Bollinger de bas en haut; elle génère un signal de vente lorsque le prix traverse le rail supérieur des bandes de Bollinger de bas en haut pour atteindre la tendance suivante.

En outre, la stratégie introduit également l'indicateur moveToFract pour juger des positions longues et courtes. Cet indicateur détermine si la tendance actuelle du marché est à la hausse ou à la baisse en calculant l'ordre d'arrangement des moyennes mobiles à court et à long terme, évitant ainsi de générer de mauvais signaux sur les marchés à plage. Enfin, combiné à des règles de stop profit et de stop loss configurables, il forme une tendance plus complète suivant la stratégie de trading.

Analyse des avantages

  1. Configuration flexible permettant de personnaliser les combinaisons de paramètres en fonction des différents environnements du marché
  2. La combinaison de deux indicateurs différents comme filtres peut réduire les signaux erronés
  3. L'indicateur d'évaluation des tendances peut éviter les opérations inverses sur les marchés volatils
  4. Le suivi de l'arrêt des pertes maximisera les bénéfices

Analyse des risques

  1. Les paramètres doivent être ajustés de manière appropriée pour s'adapter à des cycles de différentes périodes afin d'éviter une survente
  2. Le suivi de l'arrêt des pertes peut accroître les pertes en baisse rapide
  3. Assurer des fonds suffisants, sinon incapable de supporter le risque de pertes continues

Directions d'optimisation

  1. Ajouter des jugements de croix d'or et de croix de mort pour optimiser davantage
  2. Différentes variétés ont des paramètres différents, considérer l'apprentissage automatique pour les paramètres optimaux
  3. Combiner avec l'indice de volatilité pour déterminer la volatilité de tendance et renforcer le contrôle des risques

Conclusion

En général, il s'agit d'une stratégie de suivi de tendance très pratique. Il utilise un croisement d'indicateurs pour la prise de décision, et intègre également un module de jugement de tendance pour filtrer efficacement les mauvais signaux. Après avoir configuré le stop profit et le stop loss, il peut suivre pleinement les tendances pour le trading et obtenir de bons rendements. En ajustant les combinaisons de paramètres et en ajoutant plus de filtres, cette stratégie peut être optimisée pour s'adapter à plus d'environnements de marché, et a une grande marge d'amélioration et de perspectives d'application.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )




Plus de