
La stratégie utilise le RSI pour juger si le marché est en sur-achat et en sur-vente, en combinaison avec la courbe de Brin pour juger de la portée des fluctuations des prix. En outre, la résistance au support dynamique est générée sur la base des hauts et des bas, et les opérations d’achat et de vente ne sont mises en œuvre que lorsque le prix est proche de la résistance au support.
La stratégie est principalement composée de 3 parties: l’indicateur RSI, les bandes de Brin et la résistance au support dynamique.
La partie RSI est utilisée pour juger si le RSI est en survente ou en survente. Un RSI inférieur à 30 est une zone de survente, à partir de laquelle un signal d’achat est émis. Un RSI supérieur à 70 est une zone de survente, à partir de laquelle un signal de vente est émis.
Les bandes de Brin sont des bandes de haut en bas bas calculées sur la moyenne et l’écart-type des prix, utilisées pour déterminer si les prix sont en dehors de la zone de choc normale. Les prix sont vendus lorsqu’ils sont proches de la hauteur et achetés lorsqu’ils sont proches de la basse.
La partie de la résistance de soutien utilise une méthode de calcul dynamique, en utilisant le prix le plus bas (ou le prix d’ouverture et de clôture) pour un certain cycle, en limitant la portée à un certain pourcentage, et en enregistrant le point de retournement historique du prix comme point de résistance de soutien critique. Un signal de vente est émis lorsque le prix monte à proximité du point de résistance critique; un signal d’achat est émis lorsque le prix descend au niveau de support critique.
En résumé, la stratégie implique une opération d’achat et de vente lorsque les trois conditions suivantes sont remplies: le RSI est en sur-achat et en sur-vente, le prix est hors de la zone normale et proche de la résistance au support dynamique.
L’indicateur fondamental est combiné avec l’indicateur technique. Le RSI détermine la forme technique du prix en utilisant les bandes de Brin pour juger de la survente de l’indicateur fondamental.
Calcul de la résistance au support dynamique, plus proche de la résistance au support réelle du mouvement des prix.
L’utilisateur peut ajouter un filtre de tendance, associé au RSI et aux bandes de Brin, pour améliorer considérablement le jugement et filtrer la plupart des signaux de bruit.
Une mauvaise définition des paramètres RSI peut entraîner des erreurs de jugement. Une RSI trop courte augmente le bruit. Une mauvaise définition des seuils RSI de surachat et de survente peut également entraîner des erreurs.
Les paramètres de la bande de Bryn, tels que la longueur, et les multiples StdDev mal définis peuvent également affecter l’exactitude des jugements.
Le support-résistance dynamique est retardé par le calcul des hauts et des bas historiques. L’utilisateur doit optimiser le paramètre de support-résistance de manière à ce que le niveau de support-résistance soit plus proche du prix actuel.
Cette stratégie est complexe et les combinaisons d’indicateurs peuvent interférer les uns avec les autres. L’utilisateur doit tester les paramètres de l’indicateur pour réduire les conflits d’indicateurs.
Tester les paramètres du RSI, optimiser la longueur du RSI et dépasser les seuils de survente.
Testez les paramètres de la bande de Bryn, optimisez la longueur de la bande de Bryn, le multiple de StdDev.
Optimiser les paramètres de résistance au support dynamique pour que le niveau de résistance au support soit plus proche du prix. Vous pouvez essayer des cycles plus courts, moins de hauts et de bas historiques, etc.
Ajouter ou tester d’autres indicateurs auxiliaires, tels que KDJ, MACD, etc. en combinaison avec le RSI, pour améliorer la précision du jugement.
Tester les paramètres du filtre de tendance, optimiser la longueur du filtre, augmenter le temps de détention et réduire les opérations de retour inutiles.
Cette stratégie utilise plusieurs indicateurs, tels que le RSI, les bandes de Brin et la résistance au support dynamique, pour tirer pleinement parti des avantages de chaque indicateur, se vérifier mutuellement et faire preuve de plus de jugement. Des filtres de tendance peuvent être ajoutés pour réduire davantage le bruit. Les paramètres de la stratégie sont configurés de manière flexible, et l’utilisateur peut ajuster la combinaison de paramètres en fonction de ses besoins.
/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("RSI + BB + S/R Strategy with Trend Filter", shorttitle="RSI + BB + S/R + Trend Filter", overlay=true)
// RSI Settings
rsi_length = input.int(14, title="RSI Length")
overbought = input.int(70, title="Overbought Level")
oversold = input.int(30, title="Oversold Level")
// Bollinger Bands Settings
bb_length = input.int(20, title="BB Length")
bb_deviation = input.float(2.0, title="BB Deviation")
// Dynamic Support/Resistance Settings
pivot_period = input.int(10, title="Pivot Period")
pivot_source = input.string("High/Low", title="Pivot Source", options=["High/Low", "Close/Open"])
max_pivots = input.int(20, title="Maximum Number of Pivot", minval=5, maxval=100)
channel_width = input.int(10, title="Maximum Channel Width %", minval=1)
max_sr_levels = input.int(5, title="Maximum Number of S/R Levels", minval=1, maxval=10)
min_strength = input.int(2, title="Minimum Strength", minval=1, maxval=10)
// Trend Filter Settings
use_trend_filter = input.bool(false, title="Use Trend Filter")
trend_filter_length = input.int(50, title="Trend Filter Length")
// Calculate RSI and Bollinger Bands
rsi = ta.rsi(close, rsi_length)
basis = ta.sma(close, bb_length)
deviation = ta.stdev(close, bb_length)
upper_band = basis + bb_deviation * deviation
lower_band = basis - bb_deviation * deviation
// Plot Bollinger Bands on the chart
plot(upper_band, color=color.blue, title="Upper Bollinger Band")
plot(lower_band, color=color.red, title="Lower Bollinger Band")
// Dynamic Support/Resistance Calculation
float src1 = pivot_source == "High/Low" ? high : math.max(close, open)
float src2 = pivot_source == "High/Low" ? low : math.min(close, open)
float ph = ta.pivothigh(src1, pivot_period, pivot_period)
float pl = ta.pivotlow(src2, pivot_period, pivot_period)
// Calculate maximum S/R channel zone width
prdhighest = ta.highest(300)
prdlowest = ta.lowest(300)
cwidth = (prdhighest - prdlowest) * channel_width / 100
var pivotvals = array.new_float(0)
if ph or pl
array.unshift(pivotvals, ph ? ph : pl)
if array.size(pivotvals) > max_pivots
array.pop(pivotvals)
get_sr_vals(ind) =>
float lo = array.get(pivotvals, ind)
float hi = lo
int numpp = 0
for y = 0 to array.size(pivotvals) - 1 by 1
float cpp = array.get(pivotvals, y)
float wdth = cpp <= lo ? hi - cpp : cpp - lo
if wdth <= cwidth
if cpp <= hi
lo := math.min(lo, cpp)
else
hi := math.max(hi, cpp)
numpp += 1
[hi, lo, numpp]
var sr_up_level = array.new_float(0)
var sr_dn_level = array.new_float(0)
sr_strength = array.new_float(0)
find_loc(strength) =>
ret = array.size(sr_strength)
for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1
if strength <= array.get(sr_strength, i)
break
ret := i
ret
check_sr(hi, lo, strength) =>
ret = true
for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
if strength >= array.get(sr_strength, i)
array.remove(sr_strength, i)
array.remove(sr_up_level, i)
array.remove(sr_dn_level, i)
else
ret := false
break
ret
if ph or pl
array.clear(sr_up_level)
array.clear(sr_dn_level)
array.clear(sr_strength)
for x = 0 to array.size(pivotvals) - 1 by 1
[hi, lo, strength] = get_sr_vals(x)
if check_sr(hi, lo, strength)
loc = find_loc(strength)
if loc < max_sr_levels and strength >= min_strength
array.insert(sr_strength, loc, strength)
array.insert(sr_up_level, loc, hi)
array.insert(sr_dn_level, loc, lo)
if array.size(sr_strength) > max_sr_levels
array.pop(sr_strength)
array.pop(sr_up_level)
array.pop(sr_dn_level)
// Calculate the Trend Filter
trend_filter = use_trend_filter ? ta.sma(close, trend_filter_length) : close
// Buy Condition (RSI + Proximity to Support + Trend Filter)
buy_condition = ta.crossover(rsi, oversold) and close <= ta.highest(high, max_sr_levels) and close >= ta.lowest(low, max_sr_levels) and (not use_trend_filter or close > trend_filter)
// Sell Condition (RSI + Proximity to Resistance + Trend Filter)
sell_condition = ta.crossunder(rsi, overbought) and close >= ta.lowest(low, max_sr_levels) and close <= ta.highest(high, max_sr_levels) and (not use_trend_filter or close < trend_filter)
// Strategy Orders
strategy.entry("Buy", strategy.long, when = buy_condition)
strategy.entry("Sell", strategy.short, when = sell_condition)