Stratégie de trading de paires de moyennes mobiles de bandes de Bollinger


Date de création: 2023-11-24 15:32:57 Dernière modification: 2023-11-24 15:32:57
Copier: 0 Nombre de clics: 706
1
Suivre
1617
Abonnés

Stratégie de trading de paires de moyennes mobiles de bandes de Bollinger

Aperçu

La paire de courbes de Brin est une stratégie de suivi des tendances qui fonctionne avec la quantité de marché. Elle utilise le croisement des courbes de Brin et de la courbe de Brin comme signal de négociation, permettant une stratégie quantitative qui permet d’identifier automatiquement les tendances du marché et de négocier avec des règles de stop-loss.

Principe de stratégie

Cette stratégie est basée sur des signaux croisés de l’indicateur de la ceinture de Brin et de l’indicateur de la moyenne mobile. Plus précisément, elle utilise simultanément le milieu de la ceinture de Brin, le haut de la ceinture de Brin et 7 moyennes mobiles de 5 à 200 jours de longueur.

En outre, la stratégie introduit l’indicateur de jugement polyvalent MoveToFract. Cet indicateur détermine si le marché est actuellement à la hausse ou à la baisse en calculant une séquence de moyennes mobiles à court et à long terme, évitant ainsi de produire de faux signaux dans des conditions de choc. Enfin, combiné à une règle de stop-loss configurable, il forme une stratégie de suivi de tendance plus complète.

Analyse des avantages

  1. Flexibilité de configuration, permettant de personnaliser les combinaisons de paramètres pour s’adapter à différents environnements de marché
  2. La combinaison de deux indicateurs différents comme filtres peut réduire les faux signaux
  3. Les indicateurs de tendance permettent d’éviter les opérations inverses lors de chocs.
  4. La mise en place d’un arrêt de suivi pour maximiser les bénéfices

Analyse des risques

  1. Les paramètres doivent être adaptés aux différentes périodes afin d’éviter une survente.
  2. Le suivi des arrêts de perte peut augmenter les pertes en cas de chute rapide
  3. Il faut être suffisamment financé pour ne pas courir le risque de pertes continues.

Direction d’optimisation

  1. L’ajout d’une croix dorée ou d’un crochet mort peut être optimisé.
  2. Paramètres variés selon les variétés, les meilleurs paramètres pour l’apprentissage automatique
  3. L’indice de volatilité est utilisé pour évaluer les variations de tendance et la maîtrise des vents.

Résumer

Cette stratégie est une stratégie de suivi de tendance très pratique dans l’ensemble. Elle utilise des indicateurs croisés pour la prise de décision, et ajoute un module de jugement de tendance, qui permet d’éliminer efficacement les signaux erronés. Après la configuration d’un stop loss, il est possible de suivre pleinement la tendance et de négocier pour obtenir de meilleurs résultats.

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