Stratégie de créateur de marché à bande de Bollinger

Auteur:ChaoZhang est là., Date: 24 janvier 2024 à 11h05
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de fabricant de marché qui utilise les bandes de Bollinger comme entrées, la moyenne mobile comme fermeture et un simple stop loss en pourcentage.

La logique de la stratégie

La stratégie utilise les bandes supérieures et inférieures des bandes de Bollinger comme zones d'opportunité pour entrer dans des positions.

En outre, la stratégie utilise également la moyenne mobile comme référence pour la clôture des positions. Lorsqu'elle détient des positions longues, si le prix est supérieur à la moyenne mobile, elle choisira de fermer des positions longues; de même, lorsqu'elle détient des positions courtes, si le prix est inférieur à la moyenne mobile, elle choisira également de fermer des positions courtes.

Pour le stop loss, il utilise un simple pourcentage de stop loss basé sur le prix d'entrée. Cela peut efficacement éviter d'énormes pertes sur les marchés tendance.

Analyse des avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. L'utilisation de bandes de Bollinger peut capturer efficacement la volatilité des prix et obtenir plus d'opportunités de trading lorsque la volatilité augmente.
  2. Les stratégies de fabrication de marché peuvent bénéficier de l'écart demande-offre en négociant des deux côtés.
  3. Le pourcentage d'arrêt de perte peut contrôler de manière proactive les risques et éviter d'énormes pertes sur les marchés tendance.

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Les bandes de Bollinger ne sont pas toujours des signaux d'entrée fiables et peuvent parfois donner de faux signaux.
  2. Les stratégies des créateurs de marché sont vulnérables à la manipulation sur les différents marchés.
  3. Le pourcentage d'arrêt de perte peut être trop brutal et incapable de s'adapter à des situations de marché complexes.

Pour atténuer ces risques, nous pouvons envisager d'ajouter d'autres filtres, d'optimiser les paramètres de stop loss ou de limiter correctement la taille des positions.

Directions d'optimisation

Il est possible d'optimiser davantage:

  1. Nous pouvons tester différentes combinaisons de paramètres pour trouver les paramètres optimaux.
  2. Nous pouvons ajouter plus de filtres pour la vérification multi-facteurs.
  3. Nous pouvons utiliser des méthodes d'apprentissage automatique pour optimiser les paramètres.
  4. Nous pouvons envisager des méthodes de stop loss plus sophistiquées comme le SAR parabolique.

Conclusion

Dans l'ensemble, il s'agit d'une stratégie de création de marché à haute fréquence très rentable. Elle capitalise sur les bandes de Bollinger pour les signaux de trading et contrôle le risque. Mais nous devons également être conscients de ses défauts et vérifier soigneusement dans le trading en direct. Avec d'autres optimisations, cette stratégie a le potentiel de générer des rendements encore plus stables et démesurés.


/*backtest
start: 2023-12-24 00:00:00
end: 2024-01-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle="BBL", title="BB limit", overlay = true)


length = input(200, minval=1)
src = input(hlc3, title="Source")
xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)")
s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"])
basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length)
sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"])
mult = xmult / 10  
dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length)
diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

pyr = input(1, title = "Pyramiding")
useStopLoss = input(true)
stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%")
stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10  
dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis
upper = basis + (1*dev)
lower = basis - (1*dev)
plot(basis, color=fuchsia, linewidth=2)
plot(upper, color=green, linewidth=2)
plot(lower, color=green, linewidth=2)


strategy.cancel_all()

if strategy.position_size > 0 and close <= basis + diff * 2
    strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis))
else 
    if strategy.position_size < 0 and close >= basis - diff * 2
        strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis))
            
stopLossPrice1 = na
stopLossPrice2 = na
add = na
openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100)))
if openOrderCondition
    add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size
    strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower))
if useStopLoss and (strategy.position_size > 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / lower : 0
    posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price
    posSize = strategy.position_size <= 0 ? 0 : strategy.position_size
    stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100)
    strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1))


openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper))
if openOrderCondition
    add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size
    strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper))
if useStopLoss and (strategy.position_size < 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / upper : 0
    posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price
    posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size
    stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100)
    strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2))

plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2)
plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Plus de