
La estrategia utiliza el indicador RSI para determinar si el mercado está sobrecomprando y sobrevendendo, y al mismo tiempo, en combinación con la banda de Brin, para determinar el alcance de la oscilación de los precios. Además, se generan resistencias de soporte dinámicas basadas en puntos altos y bajos, y se ejecutan operaciones de compra y venta cuando se descubre que el precio está cerca de la resistencia de soporte.
La estrategia se compone principalmente de tres partes: el indicador RSI, las bandas de Brin y la resistencia al soporte dinámico.
El RSI se utiliza en parte para juzgar sobrecompra y sobreventa. Cuando el RSI está por debajo de 30 es zona de sobreventa, en ese momento se emite una señal de compra. Cuando el RSI está por encima de 70 es zona de sobreventa, en ese momento se emite una señal de venta.
Las bandas de Brin son las bandas de subida y bajada de precios basadas en el cálculo de la media y la diferencia estándar para determinar si el precio está fuera de la zona de oscilación normal. Los precios se venden cuando están cerca de la subida y se compran cuando están cerca de la bajada.
La parte de resistencia de soporte utiliza un método de cálculo dinámico, con el precio mínimo más alto (o el precio de apertura) de un determinado período como referencia, para limitar el rango dentro de un determinado porcentaje, y para registrar el punto de inflexión histórico del precio como el punto de resistencia de soporte clave. Cuando el precio sube cerca del punto de resistencia de soporte clave, emite una señal de venta; cuando el precio cae hasta el punto de soporte clave, emite una señal de compra.
En resumen, la estrategia solo se aplica a la compra y venta cuando se cumplen las tres condiciones: el RSI está sobrecomprando y sobrevendendo, el precio está fuera del rango normal y está cerca de la resistencia al soporte dinámico.
El indicador básico se combina con el indicador técnico. El RSI determina el precio de las bandas de Brin para determinar la forma técnica del precio, mientras que el RSI determina el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin para determinar el precio de las bandas de Brin.
Calculación de la resistencia al soporte dinámico, más cercana a la resistencia al soporte real del movimiento de los precios.
El usuario puede agregar un filtro de tendencia, combinado con el RSI y la banda de Brin, que mejora considerablemente el juicio y puede filtrar la mayor parte de la señal de ruido.
La configuración incorrecta de los parámetros del RSI puede conducir a errores de juicio. El RSI demasiado corto aumenta el ruido; El RSI sobrecompra sobreventa el umbral incorrectamente configurado también puede causar errores.
Los parámetros de la banda de Bryn, como la longitud, y los factores StdDev mal configurados también pueden afectar la precisión de los juicios.
La resistencia al soporte dinámico se retrasa por el cálculo de los máximos y mínimos históricos. El usuario debe optimizar adecuadamente los parámetros de resistencia al soporte para que el nivel de resistencia al soporte se acerque más al precio actual.
Esta estrategia es más compleja, las combinaciones de varios indicadores pueden interferir entre sí. El usuario debe probar los parámetros de los indicadores para reducir los conflictos de indicadores. Además, se pueden simplificar adecuadamente las condiciones de la combinación para reducir la probabilidad de error de juicio.
Prueba la configuración de los parámetros del RSI, optimiza la longitud del RSI y supera los límites de compra y venta.
Prueba la configuración de los parámetros de la banda de Brin, optimiza la longitud de la banda de Brin, el múltiplo de StdDev.
Optimiza los parámetros de resistencia de soporte dinámico para que los niveles de resistencia de soporte estén más cerca del precio. Puede probar configuraciones como períodos más cortos y menos altos y bajos históricos.
Añadir o probar otros indicadores auxiliares, como KDJ, MACD, etc. en combinación con el RSI, para mejorar la precisión del juicio.
Prueba de parámetros de filtro de tendencia, optimiza la longitud del filtro, aumenta el tiempo de retención y reduce las operaciones de reversión innecesarias.
La estrategia utiliza múltiples indicadores como el RSI, la banda de Brin y la resistencia al soporte dinámico para aprovechar al máximo las ventajas de cada indicador, verificarse mutuamente y tener un mayor juicio. Al mismo tiempo, se puede agregar un filtro de tendencia para reducir aún más el ruido. La configuración de los parámetros de la estrategia es flexible y el usuario puede ajustar la combinación de parámetros según sus necesidades.
/*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)