Stratégie de teneur de marché avec limite de bande de Bollinger


Date de création: 2024-01-24 11:05:56 Dernière modification: 2024-01-24 11:05:56
Copier: 0 Nombre de clics: 526
1
Suivre
1166
Abonnés

Stratégie de teneur de marché avec limite de bande de Bollinger

Aperçu

Cette stratégie est une stratégie de négociation qui utilise les bandes de Brin comme entries, les moyennes mobiles comme fermeture, et les pourcentages de stop simple comme arrêt. Elle a obtenu des bénéfices extrêmement élevés sur les contrats xtbtusd de juin 2022.

Principe de stratégie

Cette stratégie utilise les rails supérieurs et inférieurs de la ceinture de Brin comme zone d’opportunité pour la construction de la position. Plus précisément, lorsque le prix est inférieur au rail inférieur, une position de construction multiple est ouverte; lorsqu’il est supérieur au rail supérieur, une position de construction unique est ouverte.

En outre, la stratégie utilise également les moyennes mobiles comme référence pour les positions en cours. Lorsque vous avez plusieurs ordres, vous choisissez la position en cours si le prix est supérieur à la moyenne mobile. De même, lorsque vous avez des ordres vides, vous choisissez la position en cours si le prix est inférieur à la moyenne mobile.

Pour le stop loss, la stratégie utilise ce simple stop roll à un certain pourcentage du prix d’entrée. Cela permet d’éviter efficacement des pertes massives dans des conditions unilatérales.

Analyse des avantages

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

  1. L’utilisation des bandes de Brin permet de capturer efficacement la volatilité des prix et d’obtenir plus d’opportunités de négociation lorsque la volatilité augmente.
  2. La stratégie de marchandise permet d’obtenir des revenus de commissions pour les acheteurs et les vendeurs grâce à des transactions bidirectionnelles.
  3. L’utilisation d’un pourcentage de stop loss permet de contrôler activement les risques et d’éviter efficacement les pertes énormes dans des situations unilatérales.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. La ceinture de Brin n’est pas toujours un indicateur fiable d’entrée, elle peut parfois donner de faux signaux.
  2. Les stratégies de marketing peuvent facilement se retrouver prisonnières d’une situation de crise.
  3. Les pourcentages d’arrêt peuvent être trop arbitraires et ne permettent pas une flexibilité suffisante pour faire face à des situations complexes.

Pour réduire ces risques, nous pouvons envisager de filtrer en combinaison avec d’autres indicateurs, d’optimiser la définition de la stratégie de stop loss ou de limiter la taille de la position de manière appropriée.

Direction d’optimisation

Il y a encore de la place pour optimiser cette stratégie:

  1. Il est possible de tester différentes combinaisons de paramètres pour trouver le paramètre optimal.
  2. Il est possible d’ajouter d’autres paramètres de filtrage pour une vérification multifactorielle.
  3. Les paramètres peuvent être optimisés automatiquement à l’aide de méthodes d’apprentissage automatique.
  4. On peut envisager d’utiliser des méthodes d’arrêt plus subtiles, telles que l’arrêt parallèle.

Résumer

Cette stratégie est globalement une stratégie de trading à haute fréquence très rentable. Elle utilise les bandes de Bourin pour offrir des opportunités de trading tout en contrôlant les risques. Mais nous devons également être conscients de ses problèmes et de ses lacunes et la vérifier avec soin dans le monde réel.

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