Stratégie de trading en pourcentage des bandes de Bollinger


Date de création: 2023-12-11 11:14:53 Dernière modification: 2023-12-11 11:14:53
Copier: 0 Nombre de clics: 750
1
Suivre
1621
Abonnés

Stratégie de trading en pourcentage des bandes de Bollinger

Aperçu

La stratégie est basée sur l’indicateur de la ceinture de Brin, combiné à des moyennes mobiles et à des indicateurs techniques ATR, pour réaliser un système de rupture de courte période. La stratégie permet de déterminer le surachat et la survente des prix en calculant le pourcentage de position relative des prix dans le canal de la ceinture de Brin, combiné à de nouvelles ruptures de hauts et de bas pour générer un signal de transaction.

Principe de stratégie

  1. Calculer le pourcentage de passage dans la ceinture de Brin et de position relative des prix dans le passage
  2. Les moyennes mobiles sont calculées pour le prix d’ouverture, le prix de clôture, le prix le plus élevé et le prix le plus bas
  3. Calculer l’indicateur ATR et définir une ligne de stop
  4. Déterminer si le prix est proche d’un nouveau sommet ou d’un nouveau creux
  5. Les prix les plus bas et les plus élevés de l’année sont combinés pour déterminer la situation à grande échelle.
  6. Déterminez si un signal de transaction est émis par les variations de pourcentage de la bande de Brin et les nouveaux hauts et nouveaux bas

La stratégie utilise le canal de la ceinture de Brin pour déterminer la volatilité du marché. La largeur du canal de la ceinture de Brin est déterminée par l’écart standard. Le prix est un point d’achat lorsqu’il se déplace de la ceinture de Brin vers le bas et le prix est un point de vente lorsqu’il se déplace de la ceinture de Brin vers le haut.

Avantages stratégiques

  1. Des jugements rigoureux sur la pénétration des voies de la ceinture de Brin peuvent réduire les fausses signaux.
  2. Les moyennes mobiles permettent d’aplanir les prix et d’identifier les tendances réelles
  3. ATR indice de suivi dynamique des arrêts de perte pour limiter les pertes individuelles
  4. Les nouveaux hauts, les nouveaux bas et les jugements annuels des hauts et des bas rendent les signaux plus fiables
  5. Une combinaison efficace de plusieurs indicateurs techniques pour améliorer l’efficacité de la stratégie

Risques stratégiques et solutions

  1. Une mauvaise configuration des paramètres de la voie de la ceinture de Brin peut entraîner une surabondance de fausses percées. Différentes combinaisons de paramètres doivent être testées pour obtenir les meilleurs résultats.
  2. Les prix de clôture peuvent être utilisés comme référence pour un retrait au-delà du seuil de stop-loss fixé par l’ATR, en tenant compte du pourcentage de prix maximal et minimal calculés à l’aide d’une plus grande amplitude
  3. Les conditions de filtrage et les délais de détention devraient être assouplies de manière appropriée
  4. L’indicateur ATR est plus lent pour suivre les fluctuations importantes des prix, des indicateurs de fluctuation plus fréquents tels que l’amplitude réelle doivent être pris en compte.
  5. Les nouvelles hautes et les nouvelles basses sont vulnérables aux perturbations de courte durée et doivent être évaluées en fonction de leur signification statistique et de la durabilité de la tendance

Orientation de l’optimisation de la stratégie

  1. Test de différentes combinaisons de paramètres pour déterminer le paramètre optimal de la bande de Bryn et la longueur de la moyenne mobile
  2. Un ensemble de modèles combinant différents paramètres de la bande de Bryn ou des moyennes mobiles pour juger le signal
  3. Test de l’adaptation aux différents paramètres de la période et de la variété pour améliorer la robustesse
  4. Combinaison de conditions plus larges, telles que le signal de la bande de Brin au niveau de la ligne solaire ou des facteurs saisonniers
  5. Évaluer les opportunités de suivi des tendances afin d’élargir la couverture stratégique et la marge de profit

Résumer

Cette stratégie utilise un ensemble d’outils techniques tels que le pourcentage de la bande de Brin, les moyennes mobiles, l’indicateur ATR, les nouveaux hauts, les nouveaux bas et les hauts et bas annuels pour construire une stratégie de trading de rupture relativement rigoureuse et efficace sur de courtes périodes. Son avantage majeur réside dans l’utilisation de divers types d’outils pour réduire le bruit et identifier les véritables signaux de tendance.

Code source de la stratégie
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, 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)

BBLength = input(100, minval=1, step=1)
StdDev = 10
useMovingAverage = input(true)
MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
lookbackPeriod = input(22, minval=10, step=10)
colorByPreviousClose = input(true)

AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(10)
AtrMult = input(4)
wicks = input(false)

considerYearlyHighLow = input(false)
considerNewLongTermHighLows = input(false)
shortHighLowPeriod = 100
longHighLowPeriod = 200
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)


//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

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

inDateRange = true
[yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
[middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev)
[middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev)
[middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev)
[middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev)

percentBClose = (close - lowerclose)*100/(upperclose-lowerclose)
percentBOpen = (open - loweropen)*100/(upperopen-loweropen)
percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh)
percentBLow = (low - lowerlow)*100/(upperlow-lowerlow)

percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod)
percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod)
percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod)
percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod)

newOpen = useMovingAverage? percentBMAOpen : percentBOpen
newClose = useMovingAverage? percentBMAClose : percentBClose
newHigh = useMovingAverage? percentBMAHigh : percentBHigh
newLow = useMovingAverage? percentBMALow : percentBLow

truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1])

averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
atr = averagetruerange * AtrMult

longStop = newClose - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = newClose + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir

trailingStop = dir == 1? longStop : shortStop

candleColor = colorByPreviousClose ?
                 (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : 
                 (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver)
plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor)
plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red)

buyCondition = dir==1 and yearlyHighCondition and newHighS
exitBuyCondition = dir == -1
sellCondition = dir == -1 and yearlyLowCondition and newLowS
exitSellCondition = dir == 1
strategy.risk.allow_entry_in(tradeDirection)

barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=exitBuyCondition)

strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=exitSellCondition)