Stratégie de rupture de portée dynamique

Auteur:ChaoZhang est là., Date: le 21 janvier 2023 à 15h03:19
Les étiquettes:

img

Résumé

Cette stratégie est conçue sur la base de l'indicateur Bollinger Bands pour créer une stratégie de trading de rupture dynamique. Elle combine les conditions du filtre du corps de la bougie et du filtre de couleur pour rechercher des opportunités d'entrée de rupture autour de la bande inférieure de Bollinger. Les sorties sont basées sur le filtre du corps.

La logique de la stratégie

Calcul des indicateurs

Tout d'abord, calculez la ligne de base et la bande inférieure des bandes de Bollinger en fonction du prix bas:

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

où src est le prix bas, la longueur est la période de calcul, la base est la moyenne mobile, dev est l'écart type et le bas est la bande inférieure.

mult est généralement réglé sur 2, ce qui signifie que la bande inférieure est à un écart type.

Conditions du filtre

La stratégie comprend deux conditions de filtrage:

Filtre du corps de la bougieUtilisez la taille du corps nbody et sa moyenne d'abody pour déterminer, ne générez un signal de trading que lorsque nbody est supérieur à la moitié d'abody.

Filtre à couleur
Ne pas long lorsque la bougie se ferme positivement (close > open).

Signaux de négociation

Générer un signal long lorsque les conditions suivantes sont remplies:

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

Lorsque la taille du corps dépasse à nouveau la moitié de la moyenne, position de rapprochement:

close > open and nbody > abody / 2  

Taille de la position

La stratégie calcule automatiquement la taille de la transaction pour une croissance exponentielle de la position:

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

Contrôle des risques

Ajouter des contraintes pour l'année, le mois et la date afin de limiter les échanges à une plage de dates spécifique:

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

Les avantages

Plage de négociation dynamique

La bande inférieure de Bollinger fournit une zone de soutien dynamique pour capturer les retracements après les tendances.

Filtre à double

La combinaison du corps de la bougie et des filtres de couleur évite efficacement les fausses éruptions.

Dimensionnement automatique de la position

Les positions augmentent de façon exponentielle jusqu'à 100%, gérant automatiquement le risque.

Plage de dates

La fixation d'une fourchette de dates réduit le risque associé à la volatilité du marché au cours de périodes spécifiques.

Les risques

Le prélèvement prolongé

Lorsque la tendance à la hausse est forte, les bandes moyennes et supérieures de BB peuvent augmenter rapidement, provoquant une baisse prolongée.

Les solutions

Combinez avec les indicateurs de tendance, arrêtez la stratégie si vous jugez que le marché est haussier pour éviter un retrait prolongé.

Échec de l' évasion

La rupture peut échouer avec un retrait et un nouveau test de la bande inférieure.

Les solutions

Ajoutez un stop-loss en dessous du niveau de support ou ajoutez une logique pour détecter un nouveau test raté pour un stop-loss rapide.

Améliorations

Ajouter le stop loss

Optimiser le stop loss en dessous du support en fonction des résultats des backtests.

Optimiser les paramètres

Filtre du corps afin de trouver la période d'absence optimale.

Ajouter un filtre de tendance

Arrêtez la stratégie en cas de marché haussier.

Conclusion

Cette stratégie combine le support BB, le filtre corps, le filtre couleur et la logique de rupture pour capturer les retraces à haute probabilité.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Plus de