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 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é.
Les avantages de cette stratégie sont les suivants:
L'utilisation de la volatilité des prix pour construire des signaux de négociation peut suivre efficacement les changements du marché.
Lisser la volatilité avec une moyenne mobile exponentielle peut filtrer le bruit et générer des signaux de trading plus fiables.
L'éventail des bandes peut être ajusté par le coefficient de volatilité, ce qui rend la stratégie plus souple.
Combiné avec le jugement de rupture, il peut saisir les opportunités de trading en temps opportun lorsque se produit un renversement de tendance.
Cette stratégie comporte également certains risques:
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.
Un réglage incorrect de la plage de bande peut entraîner un suréchange ou des signaux insuffisants.
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.
La stratégie peut être optimisée par:
Tester différents cycles de données sur les prix afin de trouver la période la plus appropriée pour calculer la volatilité.
J'essaie différents algorithmes de moyenne mobile comme la moyenne mobile pondérée.
Introduction du volume des transactions ou d'autres indicateurs pour confirmer les signaux de rupture.
Réglage du stop loss ou du trailing stop pour contrôler les pertes par transaction.
Optimisation du coefficient de volatilité multiple pour déterminer une plage de fréquences optimale.
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")