
La stratégie de filtrage des signaux d’achat et de vente basée sur la gamme des fluctuations des prix (Range Filter Buy Sell Signals Strategy) est une stratégie de négociation quantitative très pratique. Elle utilise la gamme des fluctuations des prix pour filtrer les signaux d’achat et de vente, réduire les faux signaux dans les marchés à faible volatilité et améliorer la qualité des signaux dans les marchés à forte volatilité.
La stratégie commence par calculer la portée des fluctuations du prix d’un actif au cours d’une période donnée. Plus précisément, elle calcule la différence entre le prix le plus élevé et le prix le plus bas au cours d’une période donnée pour déterminer l’ampleur des fluctuations des prix.
Ensuite, il génère des signaux d’achat et de vente. Cependant, tous les signaux ne déclenchent pas l’entrée, mais doivent satisfaire aux conditions de filtrage de la gamme de fluctuation des prix. Par exemple, un signal d’achat n’est émis que lorsque le prix franchit la gamme de fluctuation.
De cette façon, la stratégie peut filtrer la plupart des faux signaux et éviter les entrées inutiles dans un environnement de marché à basse volatilité, tandis que dans un environnement à forte volatilité, elle peut capturer et tirer profit des mouvements plus orientés.
Le plus grand avantage de cette stratégie est qu’elle permet d’ajuster dynamiquement l’intensité de filtration des signaux. Lors d’une basse volatilité, elle ne choisit que des signaux de haute qualité; et lors d’une forte volatilité, elle peut saisir plus d’opportunités offertes par le marché.
Cette stratégie est plus intelligente et plus adaptable que les filtres à paramètres fixes. Elle offre un meilleur retour sur risque quel que soit l’état du marché.
En outre, cette stratégie intègre la détection de la direction de la tendance et fournit un signal de négociation plus fiable que les conditions d’opération individuelles. En même temps, elle dispose d’une fonction de blocage des pertes et de contrôle des risques des transactions individuelles.
Le risque principal de cette stratégie réside dans la définition de paramètres de gamme d’oscillation. Si la gamme est trop grande ou trop petite, cela affectera négativement la qualité du signal et les chances de gagner.
De plus, dans les marchés où les prix ont tendance à être volatiles à court terme, les chances de rentabilité de cette stratégie sont relativement faibles. La combinaison de différents systèmes cycliques peut aider à atténuer ce problème.
Cette stratégie peut être optimisée par les éléments suivants:
L’algorithme d’adaptation des paramètres permet d’optimiser automatiquement les paramètres de la gamme d’oscillation pour les rendre plus intelligents et dynamiques.
Ajout de règles de filtrage basées sur les tendances macrocycliques pour éviter d’être pris dans des marchés en crise.
Cette stratégie, combinée à des cycles différents, forme un système qui améliore la stabilité globale.
Ajout d’algorithmes d’apprentissage automatique pour améliorer les paramètres et les règles de filtrage.
La stratégie de filtrage des signaux d’achat et de vente en fonction de la gamme des fluctuations des prix est une stratégie de trading quantitative très pratique et efficace. Elle permet d’ajuster dynamiquement l’intensité du filtrage et offre un meilleur retour sur risque dans différents environnements de marché.
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
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/
// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with
//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true)
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01
emaLength = input.int(200, title="EMA Length")
// Determine stop loss price
//Range Size Function
rng_size(x, qty, n) =>
wper = n * 2 - 1
avrng = ta.ema(math.abs(x - x[1]), n)
AC = ta.ema(avrng, wper) * qty
rng_size = AC
//Range Filter Function
rng_filt(x, rng_, n) =>
r = rng_
var rfilt = array.new_float(2, x)
array.set(rfilt, 1, array.get(rfilt, 0))
if x - r > array.get(rfilt, 1)
array.set(rfilt, 0, x - r)
if x + r < array.get(rfilt, 1)
array.set(rfilt, 0, x + r)
rng_filt1 = array.get(rfilt, 0)
hi_band = rng_filt1 + r
lo_band = rng_filt1 - r
rng_filt = rng_filt1
[hi_band, lo_band, rng_filt]
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Source
rng_src = input(defval=close, title='Swing Source')
//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')
//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')
//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)
//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0
//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0
CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1
//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc
ema = ta.ema(close, emaLength)
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)
longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)
//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)
//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')
//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')
//Bar Color
barcolor(use_barcolor ? bar_color : na)
// Entry
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)
plot(ema)
//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))
//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')