La estrategia de ruptura del nivel verdadero del RSI combina el indicador del RSI con canales de nivel verdadero adaptativos para implementar el comercio de ruptura. Calcula las bandas superior e inferior del nivel verdadero y utiliza las señales de sobrecompra / sobreventa del RSI para generar operaciones de ruptura. En los mercados de tendencia, puede capturar temprano la dirección de la tendencia. En los mercados de rango, puede filtrar eficazmente el ruido y capturar oportunidades direccionales significativas.
La estrategia primero requiere establecer manualmente 14 bandas de nivel verdadero con diferentes parámetros. Los niveles verdaderos se calculan en función de los precios de cierre, la desviación estándar y la regresión lineal durante un cierto período. La banda superior es regresión lineal + n desviaciones estándar. La banda inferior es regresión lineal - n desviaciones estándar. La n se puede ajustar a través del panel de entrada. Esto traza 14 bandas de nivel verdadero con diferentes parámetros.
Luego, la estrategia calcula la banda más alta de las 14 bandas como la banda superior del nivel verdadero, y la más baja como la banda inferior en cada período. Combinado con los valores del indicador RSI, determina si el RSI entra en zonas de sobrecompra o sobreventa. Cuando el RSI está sobrecomprado o el precio se rompe por debajo de la banda superior, se corta. Cuando el RSI se sobreventa o el precio se rompe por encima de la banda inferior, se sale largo.
Finalmente, se establecen las bandas de entrada y salida. La banda de entrada es el nivel verdadero inferior y la banda de salida es el nivel verdadero superior.
En resumen, la estrategia utiliza tanto la fuerza de la tendencia del RSI como la capacidad de adaptación de los canales de True Level para determinar efectivamente la dirección de la tendencia, captar grandes oportunidades en mercados de rango y controlar el riesgo con las bandas de salida.
Las bandas superior e inferior cambian dinámicamente para adaptarse a las fluctuaciones del mercado.
Los usuarios pueden optimizar los parámetros para diferentes condiciones del mercado.
Combina el RSI sobrecomprado/sobrevendido para evitar los golpes en los mercados laterales.
El diseño razonable de las líneas de entrada y salida controla el riesgo.
Los parámetros del RSI necesitan una optimización cuidadosa.
Los parámetros de True Level necesitan pruebas y optimización.
Riesgo alto en mercados agitados cuando los precios alcanzan frecuentemente las bandas de salida.
Las bandas de nivel verdadero necesitan un período suficiente para formarse.
Los riesgos se pueden mitigar optimizando los parámetros del RSI, ajustando la configuración de True Level, agregando filtros y utilizando salidas inteligentes.
Optimice los parámetros del RSI para encontrar los mejores ajustes. Pruebe diferentes períodos del RSI.
Optimizar los parámetros de True Level para los mercados actuales.
Agregue otros filtros como MACD, KD para evitar malas operaciones en mercados agitados.
Prueba diferentes tiempos de negociación o productos para encontrar el entorno óptimo.
Optimice las salidas, como las paradas traseras o las paradas basadas en ATR.
Combinar los parámetros y probar la máxima estabilidad.
Utiliza el aprendizaje automático y el big data para optimizar automáticamente.
La estrategia de ruptura del RSI True Level combina las fortalezas de un indicador de tendencia y canales adaptativos. Puede determinar efectivamente la dirección de la tendencia y capturar grandes oportunidades en mercados de rango mientras controla el riesgo con stop loss. La alta personalización de parámetros permite ajustarlo para diferentes condiciones de mercado. En general, al integrar múltiples indicadores, tiene ventajas en la determinación de tendencias y el control de riesgos. Con una optimización adicional, es una estrategia comercial cuantitativa recomendada.
/*backtest start: 2022-11-01 00:00:00 end: 2023-11-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/ // © Julien_Eche //@version=4 strategy("RSI TrueLevel Strategy", shorttitle="RSI TL", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10) // Input parameters for RSI rsiPeriod = input(14, title="RSI Period", type=input.integer) rsiOverbought = input(65, title="RSI Overbought Level", type=input.integer) rsiOversold = input(40, title="RSI Oversold Level", type=input.integer) // Inputs for selecting bands entry_band = input(12, title="Entry TrueLevel Band", type=input.integer, minval=1, maxval=14) exit_band = input(12, title="Exit TrueLevel Band", type=input.integer, minval=1, maxval=14) // Input for long and short mode long_and_short = input(false, title="Enable Long and Short", type=input.bool) // Calculate the RSI rsi = rsi(close, rsiPeriod) // User inputs len1 = input(title="Length 1", type=input.integer, defval=126) len2 = input(title="Length 2", type=input.integer, defval=189) len3 = input(title="Length 3", type=input.integer, defval=252) len4 = input(title="Length 4", type=input.integer, defval=378) len5 = input(title="Length 5", type=input.integer, defval=504) len6 = input(title="Length 6", type=input.integer, defval=630) len7 = input(title="Length 7", type=input.integer, defval=756) len8 = input(title="Length 8", type=input.integer, defval=1008) len9 = input(title="Length 9", type=input.integer, defval=1260) len10 = input(title="Length 10", type=input.integer, defval=1638) len11 = input(title="Length 11", type=input.integer, defval=2016) len12 = input(title="Length 12", type=input.integer, defval=2646) len13 = input(title="Length 13", type=input.integer, defval=3276) len14 = input(title="Length 14", type=input.integer, defval=4284) fill_color = input(title="Fill Color", type=input.color, defval=color.rgb(0, 191, 255, 95)) mult = input(title="Multiple", type=input.float, defval=1, step=0.2, options=[0.6, 0.8, 1, 1.2, 1.4]) src = input(title="Source", type=input.source, defval=close) // Upper band calculation function upperBand(length) => linreg = linreg(src, length, 0) stddev = mult * stdev(src, length) upperband = linreg + stddev upperband // Lower band calculation function lowerBand(length) => linreg = linreg(src, length, 0) stddev = mult * stdev(src, length) lowerband = linreg - stddev lowerband // Calculate upper and lower bands for each length upperband_1 = upperBand(len1) upperband_2 = upperBand(len2) upperband_3 = upperBand(len3) upperband_4 = upperBand(len4) upperband_5 = upperBand(len5) upperband_6 = upperBand(len6) upperband_7 = upperBand(len7) upperband_8 = upperBand(len8) upperband_9 = upperBand(len9) upperband_10 = upperBand(len10) upperband_11 = upperBand(len11) upperband_12 = upperBand(len12) upperband_13 = upperBand(len13) upperband_14 = upperBand(len14) lowerband_1 = lowerBand(len1) lowerband_2 = lowerBand(len2) lowerband_3 = lowerBand(len3) lowerband_4 = lowerBand(len4) lowerband_5 = lowerBand(len5) lowerband_6 = lowerBand(len6) lowerband_7 = lowerBand(len7) lowerband_8 = lowerBand(len8) lowerband_9 = lowerBand(len9) lowerband_10 = lowerBand(len10) lowerband_11 = lowerBand(len11) lowerband_12 = lowerBand(len12) lowerband_13 = lowerBand(len13) lowerband_14 = lowerBand(len14) // Plot envelope bands for each length upperband_1_plot = plot(upperband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 1") lowerband_1_plot = plot(lowerband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 1") upperband_2_plot = plot(upperband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 2") lowerband_2_plot = plot(lowerband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 2") upperband_3_plot = plot(upperband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 3") lowerband_3_plot = plot(lowerband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 3") upperband_4_plot = plot(upperband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 4") lowerband_4_plot = plot(lowerband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 4") upperband_5_plot = plot(upperband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 5") lowerband_5_plot = plot(lowerband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 5") upperband_6_plot = plot(upperband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 6") lowerband_6_plot = plot(lowerband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 6") upperband_7_plot = plot(upperband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 7") lowerband_7_plot = plot(lowerband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 7") upperband_8_plot = plot(upperband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 8") lowerband_8_plot = plot(lowerband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 8") upperband_9_plot = plot(upperband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 9") lowerband_9_plot = plot(lowerband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 9") upperband_10_plot = plot(upperband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 10") lowerband_10_plot = plot(lowerband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 10") upperband_11_plot = plot(upperband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 11") lowerband_11_plot = plot(lowerband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 11") upperband_12_plot = plot(upperband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 12") lowerband_12_plot = plot(lowerband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 12") upperband_13_plot = plot(upperband_13, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 13") lowerband_13_plot = plot(lowerband_13, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 13") upperband_14_plot = plot(upperband_14, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 14") lowerband_14_plot = plot(lowerband_14, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 14") // Plot fills for each length fill(upperband_1_plot, lowerband_1_plot, color=fill_color, title="Fill 1") fill(upperband_2_plot, lowerband_2_plot, color=fill_color, title="Fill 2") fill(upperband_3_plot, lowerband_3_plot, color=fill_color, title="Fill 3") fill(upperband_4_plot, lowerband_4_plot, color=fill_color, title="Fill 4") fill(upperband_5_plot, lowerband_5_plot, color=fill_color, title="Fill 5") fill(upperband_6_plot, lowerband_6_plot, color=fill_color, title="Fill 6") fill(upperband_7_plot, lowerband_7_plot, color=fill_color, title="Fill 7") fill(upperband_8_plot, lowerband_8_plot, color=fill_color, title="Fill 8") fill(upperband_9_plot, lowerband_9_plot, color=fill_color, title="Fill 9") fill(upperband_10_plot, lowerband_10_plot, color=fill_color, title="Fill 10") fill(upperband_11_plot, lowerband_11_plot, color=fill_color, title="Fill 11") fill(upperband_12_plot, lowerband_12_plot, color=fill_color, title="Fill 12") fill(upperband_13_plot, lowerband_13_plot, color=fill_color, title="Fill 13") fill(upperband_14_plot, lowerband_14_plot, color=fill_color, title="Fill 14") // Add variables to store the highest upper band and lowest lower band values var float highestUpperBand = na var float lowestLowerBand = na // Calculate the trueLevelUpperBand and trueLevelLowerBand trueLevelUpperBand = max(upperband_1, max(upperband_2, max(upperband_3, max(upperband_4, max(upperband_5, max(upperband_6, max(upperband_7, max(upperband_8, max(upperband_9, max(upperband_10, max(upperband_11, max(upperband_12, max(upperband_13, upperband_14))))))))))))) trueLevelLowerBand = min(lowerband_1, min(lowerband_2, min(lowerband_3, min(lowerband_4, min(lowerband_5, min(lowerband_6, min(lowerband_7, min(lowerband_8, min(lowerband_9, min(lowerband_10, min(lowerband_11, min(lowerband_12, min(lowerband_13, lowerband_14))))))))))))) // Update the highest upper band and lowest lower band highestUpperBand := highest(trueLevelUpperBand, 1) lowestLowerBand := lowest(trueLevelLowerBand, 1) // Store the upper and lower bands in an array for easy access upperbands = array.new_float(14) lowerbands = array.new_float(14) array.set(upperbands, 0, upperband_1) array.set(upperbands, 1, upperband_2) array.set(upperbands, 2, upperband_3) array.set(upperbands, 3, upperband_4) array.set(upperbands, 4, upperband_5) array.set(upperbands, 5, upperband_6) array.set(upperbands, 6, upperband_7) array.set(upperbands, 7, upperband_8) array.set(upperbands, 8, upperband_9) array.set(upperbands, 9, upperband_10) array.set(upperbands, 10, upperband_11) array.set(upperbands, 11, upperband_12) array.set(upperbands, 12, upperband_13) array.set(upperbands, 13, upperband_14) array.set(lowerbands, 0, lowerband_1) array.set(lowerbands, 1, lowerband_2) array.set(lowerbands, 2, lowerband_3) array.set(lowerbands, 3, lowerband_4) array.set(lowerbands, 4, lowerband_5) array.set(lowerbands, 5, lowerband_6) array.set(lowerbands, 6, lowerband_7) array.set(lowerbands, 7, lowerband_8) array.set(lowerbands, 8, lowerband_9) array.set(lowerbands, 9, lowerband_10) array.set(lowerbands, 10, lowerband_11) array.set(lowerbands, 11, lowerband_12) array.set(lowerbands, 12, lowerband_13) array.set(lowerbands, 13, lowerband_14) // Get the selected bands for entry and exit selected_entry_lowerband = array.get(lowerbands, entry_band - 1) selected_exit_upperband = array.get(upperbands, exit_band - 1) // Entry conditions longCondition = crossover(rsi, rsiOversold) or crossover(close, selected_entry_lowerband) shortCondition = crossunder(rsi, rsiOverbought) or crossunder(close, selected_exit_upperband) if (longCondition) strategy.entry("Long", strategy.long) if (long_and_short and shortCondition) strategy.entry("Short", strategy.short) // Exit conditions exitLongCondition = crossunder(rsi, rsiOverbought) or crossunder(close, selected_exit_upperband) exitShortCondition = crossover(rsi, rsiOversold) or crossover(close, selected_entry_lowerband) strategy.close("Long", when=exitLongCondition) strategy.close("Short", when=long_and_short and exitShortCondition)