Stratégie de bande de volatilité en douceur

Auteur:ChaoZhang est là., Date: 2024-01-29 16h22 et 14h
Les étiquettes:

img

Résumé

Cette stratégie génère des bandes de prix basées sur la volatilité lissée du prix et produit des signaux de trading lorsque le prix franchit les bandes.

La logique de la stratégie

La stratégie calcule d'abord la fourchette moyenne de volatilité du prix sur une certaine période, puis lissue la fourchette de volatilité en utilisant une moyenne mobile exponentielle pour générer une volatilité lissée.

La volatilité lissée (smrng) est calculée par la fonction smoothrng. La bande supérieure hband et la bande inférieure lband des bandes de prix sont ensuite calculées sur la base de smrng. La condition long longCondition et la condition short shortCondition sont configurées sur cette base. Lorsque longCondition est remplie, un signal d'achat est généré. Lorsque shortCondition est remplie, un signal de vente est généré.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. L'utilisation de la volatilité des prix pour construire des signaux de négociation peut suivre efficacement les changements du marché.

  2. Lisser la volatilité avec une moyenne mobile exponentielle peut filtrer le bruit et générer des signaux de trading plus fiables.

  3. L'éventail des bandes peut être ajusté par le coefficient de volatilité, ce qui rend la stratégie plus souple.

  4. Combiné avec le jugement de rupture, il peut saisir les opportunités de trading en temps opportun lorsque se produit un renversement de tendance.

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Dans une volatilité anormale du marché, la volatilité lissée peut ne pas refléter avec précision la volatilité réelle, ce qui conduit à des signaux erronés.

  2. Un réglage incorrect de la plage de bande peut entraîner un suréchange ou des signaux insuffisants.

  3. Il y a un décalage de temps dans les signaux de rupture, ce qui peut entraîner une entrée prématurée ou tardive.

Directions d'optimisation

La stratégie peut être optimisée par:

  1. Tester différents cycles de données sur les prix afin de trouver la période la plus appropriée pour calculer la volatilité.

  2. J'essaie différents algorithmes de moyenne mobile comme la moyenne mobile pondérée.

  3. Introduction du volume des transactions ou d'autres indicateurs pour confirmer les signaux de rupture.

  4. Réglage du stop loss ou du trailing stop pour contrôler les pertes par transaction.

  5. Optimisation du coefficient de volatilité multiple pour déterminer une plage de fréquences optimale.

Résumé

La logique générale de cette stratégie est claire, en utilisant la volatilité des prix pour construire des bandes et des ruptures de prix pour générer des signaux de trading, qui peuvent effectivement suivre les changements de tendance du marché.


/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)

// Source
src = input(defval=close, title="Source")

// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t * 2) - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])

downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)

strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")

// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")

// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)

// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")

Plus de