
La stratégie de filtrage de vibration à double vague est une stratégie de négociation basée sur la volatilité des prix. Elle utilise deux paramètres différents, l’indicateur de la gamme moyenne de volatilité, combiné avec la relation entre les prix et la gamme de volatilité, pour générer un signal de négociation. La stratégie s’applique aux actifs numériques très volatils tels que Bitcoin.
La stratégie utilise deux indices de plage de fluctuation lisse de différentes longueurs de cycle: l’indicateur de plage de fluctuation rapide ((cycle par défaut 27) et l’indicateur de plage de fluctuation lente ((cycle par défaut 55)). La formule de calcul de l’indicateur de plage de fluctuation est la suivante: la moyenne des mouvements indiciels de l’amplitude des fluctuations des prix de la période actuelle est multipliée par un multiple ((tel que 1.6)).
La stratégie de filtrage de la double vague consiste à comparer la relation entre le prix et les deux indicateurs de la gamme de fluctuation pour déterminer si le prix se trouve actuellement dans une zone de choc d’une certaine ampleur. Un signal de transaction est généré lorsque le prix franchit cette zone de choc.
En particulier, la stratégie utilise la ligne médiane comme référence, la ligne médiane étant la moyenne des deux indicateurs de gamme de fluctuation. Un signal de plus est généré lorsque le prix dépasse une gamme de fluctuation rapide au-dessus de la ligne médiane; un signal de moins est généré lorsque le prix est inférieur à une gamme de fluctuation rapide au-dessous de la ligne médiane.
Afin de filtrer les messages erronés, la stratégie a ajouté une condition: le signal ne doit être émis que si le prix est en phase avec celui d’un cycle précédent. Par exemple, le signal de multiplication ne doit être émis que si le prix est élevé et dépasse une marge de fluctuation de la ligne médiane.
En résumé, la stratégie utilise l’indicateur de double amplitude pour identifier les zones de choc, générer des ordres de négociation avec des signaux de rupture de la zone de choc. Des filtres de direction sont également ajoutés pour réduire les faux signaux.
Les avantages de la stratégie de filtrage vibratoire à double vague sont:
L’indicateur de double amplitude d’oscillation permet de déterminer plus précisément les zones de fluctuation des prix.
L’indicateur à double amplitude d’onde contient différentes longueurs de temps. L’indicateur rapide capte les opportunités de rupture à court terme et l’indicateur lent prend en compte les tendances à long terme.
L’ajout de conditions de filtrage de la direction des prix permet de réduire les signaux erronés causés par les fluctuations à court terme.
La logique de transaction est simple et claire, facile à comprendre et adaptée aux transactions quantitatives.
La stratégie de filtrage des vibrations à double vague comporte également des risques à prendre en compte:
Les indicateurs de volatilité peuvent avoir un effet négatif sur les marchés à basse volatilité.
Les paramètres de la gamme de fluctuation doivent être ajustés et optimisés pour les différentes variétés, sinon des opportunités de négociation seront manquées ou des signaux erronés seront générés.
Il n’est pas tenu compte de la déviation des prix par rapport à la volatilité. Un signal erroné peut être émis lorsque la volatilité augmente et que le prix ne correspond pas à une hausse.
Dans des environnements à forte volatilité, le paramètre de point d’arrêt peut nécessiter des ajustements. Un arrêt trop radical entraînera des arrêts fréquents.
Cette stratégie peut être optimisée dans les domaines suivants:
Test et optimisation des paramètres de la gamme d’oscillation pour trouver la combinaison optimale de paramètres pour les différents cycles de différentes variétés.
Ajout d’un mécanisme d’ajustement des positions de stop-loss en fonction de la dynamique de la volatilité récente, optimisation de la stratégie de stop-loss.
Ajouter des conditions de filtrage basées sur les écarts entre les prix et les fluctuations pour éviter les faux signaux.
En combinaison avec d’autres indicateurs, tels que la variation du volume des transactions, cela augmente la certitude d’entrée.
Tester et intégrer des mécanismes de démarrage adaptés à la stratégie.
La stratégie de filtrage des vibrations de la double vague est une stratégie de négociation efficace pour les actifs hautement volatiles dans son ensemble. Elle utilise correctement les caractéristiques de la volatilité des prix et produit une logique de négociation simple et claire.
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © colinmck, greenmask9
//@version=4
strategy(title="Twin Range Filter Algo", overlay=true)
source = input(defval=close, title="Source")
// Smooth Average Range
per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")
per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ema(abs(x - x[1]), t)
smoothrng = ema(avrng, wper) * m
smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
// 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(source, smrng)
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])
hband = filt + smrng
lband = filt - smrng
longCond = bool(na)
shortCond = bool(na)
longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0
shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0
CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1
// Plotting
// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)
//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) =>
if s2 == "SMA"
sma(source, l2)
else
if s2 == "RMA"
rma(source, l2)
else
if s2 == "EMA"
ema(source, l2)
else
wma(source, l2)
//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) =>
if s3 == "RMA"
rma(source, l3)
else
if s3 == "SMA"
sma(source, l3)
else
if s3 == "EMA"
ema(source, l3)
else
wma(source, l3)
atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)
bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)
bullclock = barssince(bull)
bearclock = barssince(bear)
if (bull)
strategy.entry("Twin Long", strategy.long, ordersize)
strategy.exit("Exit", from_entry = "Twin Long", profit = profit, loss = stop)
if (bear)
strategy.entry("Twin Short", strategy.short, ordersize)
strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)
//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")