
La estrategia de tendencia EMA de la barra de Madrid es un sistema de comercio cuantitativo integral que combina hábilmente la barra de media móvil (Madrid Ribbon) con un filtro de indicadores relativamente débiles (RSI) para proporcionar un mecanismo de doble confirmación para la identificación de tendencias y la ejecución de operaciones. El núcleo de la estrategia es la estructura de la barra formada por el monitoreo de las medias móviles (EMA) del índice de varias líneas de diferentes períodos (de 5 a 90), mientras que la introducción del indicador RSI como condición de filtración reduce efectivamente las señales falsas. La estrategia incluye la función de negociación automática, que incluye un mecanismo de parada de pérdidas predeterminado, para determinar la dirección y la intensidad de la tendencia del mercado mediante el cálculo de la cantidad de líneas de media móvil verde y roja, y luego generar señales de compra y venta.
El principio central de la estrategia se basa en el análisis de clusters de medias móviles de múltiples marcos de tiempo y en el filtro del indicador RSI:
Sistemas de bandas de media móvil de múltiples marcos de tiempo: La estrategia construye 18 medias móviles de 5 a 90 periodos y las compara con una línea de referencia de 100 periodos. A cada media móvil se le asigna un color de identificación según su dirección de cambio y su posición con respecto a la línea de referencia:
Cuantificación de la intensidad de las tendencias: estrategia para cuantificar la intensidad de la tendencia mediante el cálculo de la cantidad de medias móviles en verde (subir) y en rojo (caer):
Mecanismo de filtrado de RSIPara reducir las señales falsas, la estrategia introduce el indicador RSI como condición de filtración:
Mecanismo de gestión de riesgosLa estrategia establece un parámetro de stop-loss basado en porcentajes:
Administración de fondos: La estrategia permite al usuario establecer el monto inicial y calcular automáticamente el tamaño de la posición en función del precio actual.
Mecanismo de confirmación múltipleLa estrategia proporciona un mecanismo de confirmación múltiple, reduciendo significativamente la posibilidad de señales erróneas mediante la combinación de un sistema de bandas de promedio móvil y un indicador RSI. La fiabilidad de la señal aumenta considerablemente cuando el grupo de promedios móviles y el RSI cumplen al mismo tiempo.
Cuantificación de la intensidad de las tendenciasA diferencia de la estrategia de cruce simple, esta estrategia cuantifica la intensidad de la tendencia mediante el cálculo de la cantidad de diferentes medias móviles de colores, lo que hace que las decisiones de negociación sean más objetivas y basadas en datos.
Señales de negociación visualesLa estrategia es mostrar las señales claramente en el gráfico mediante cambios de color de fondo y marcas de forma, lo que permite a los operadores identificar intuitivamente las oportunidades de comercio potenciales.
Gestión de riesgos integradaLa estrategia tiene un mecanismo de stop loss integrado por defecto, con una configuración predefinida de las ganancias y pérdidas máximas de cada operación y un control efectivo de la brecha de riesgo.
Altamente adaptable: La estrategia permite a los usuarios elegir entre usar EMA o SMA, que se pueden ajustar con flexibilidad según las diferentes condiciones del mercado. El EMA es más sensible a los cambios recientes en los precios, mientras que el SMA es más suave, con diferentes configuraciones para diferentes condiciones del mercado.
Monitoreo completo del estado del mercadoMediante la monitorización de las medias móviles de 18 períodos diferentes, la estrategia capta la dinámica del mercado en su totalidad, reduciendo los puntos ciegos que el análisis de un solo marco de tiempo puede causar.
El retraso en el cambio de tendenciaDebido a que la estrategia depende de múltiples medias móviles, puede haber un retraso en la reacción cuando la tendencia se invierte rápidamente, lo que hace que el momento de entrada o salida no sea lo suficientemente ideal. Para responder a este riesgo, se puede considerar agregar indicadores de períodos más cortos o ajustar los parámetros del RSI para aumentar la sensibilidad de la estrategia a los cambios en el mercado.
Las condiciones de filtración rigurosas hacen que se pierdan oportunidadesEl filtro RSI se establece de manera más estricta (<30 y >70), lo que puede hacer que se pierdan algunas oportunidades de negociación potenciales. El usuario puede ajustar el umbral RSI de acuerdo con las características específicas del mercado, como la flexibilización de las condiciones de compra a RSI <40, y la flexibilización de las condiciones de venta a RSI >60 .
Limitación del porcentaje de pérdida de frenado fijoLa estrategia utiliza un parámetro de stop loss de porcentaje fijo (de 0.5% y 1%), que puede no ser lo suficientemente flexible en mercados con diferentes tipos de volatilidad. Se recomienda ajustar el nivel de stop loss en función de la fluctuación media real (ATR) de los activos.
Riesgo de la oscilación del mercadoEn la fase de ordenamiento horizontal de los mercados, las medias móviles pueden intercalarse con frecuencia, lo que genera confusión de la señal. Se puede evitar el exceso de comercio en entornos de baja volatilidad mediante la adición de mecanismos adicionales de detección horizontal (como el indicador ADX).
Sensibilidad de los parámetrosEl rendimiento de la estrategia es sensible a la selección de parámetros (como el ciclo de las medias móviles y la longitud del RSI), y la selección incorrecta de los parámetros puede causar un mal rendimiento de la estrategia. Se recomienda una adecuada optimización de los parámetros y la retroalimentación antes de su uso en el entorno real.
Mecanismo de frenado dinámico: La sustitución de la fijación del porcentaje de stop loss por el indicador ATR permite una mejor adaptación a los cambios en la volatilidad del mercado. Por ejemplo, el stop loss puede fijarse en 1.5*ATR, el tope está en 1.*ATR, para una gestión de riesgos más flexible y adaptada al mercado.
Añadir un filtro de intensidad de tendenciaIntroducir el indicador ADX para medir la intensidad de la tendencia, operar solo en un entorno de tendencia fuerte con ADX>25 y evitar la generación de demasiadas señales falsas en mercados de tendencia débil o horizontal.
Optimización de los parámetros RSILa estrategia actual utiliza el RSI estándar de 14 ciclos, se puede considerar ajustar el ciclo RSI según las características y el marco de tiempo de un activo específico, o usar un sistema de doble RSI (por ejemplo, comprobar al mismo tiempo el RSI de corto y largo plazo) para reducir las señales falsas.
Introducción de la confirmación de las entregas: Añadir una dimensión de análisis de volumen de transacciones para garantizar que haya suficiente apoyo de participación en el mercado cuando se produzca una señal y aumentar la fiabilidad de la señal de negociación. Por ejemplo, se puede requerir que el volumen de transacciones sea superior al promedio de N días cuando se produzca una señal de compra.
Realizar un ajuste dinámico de la posición: Ajuste dinámico el tamaño de la posición según la intensidad de la tendencia (número de medias móviles verdes o rojas), aumente la posición en una tendencia más fuerte, reduzca la posición en una tendencia más débil y optimice la eficiencia de la utilización de los fondos.
Unirse al filtro del entorno del mercado: Detectar el entorno de mercado actual a través de indicadores de volatilidad (como VIX o ATR), ajustar los parámetros de la estrategia o suspender la negociación en un entorno de alta volatilidad, y reducir el riesgo en condiciones de mercado extremas.
La estrategia de tendencias de EMA de multímetro de RSI de Madrid es un sistema de comercio cuantitativo completo que ofrece a los comerciantes herramientas de identificación de tendencias y ejecución de operaciones potentes mediante la combinación de la estructura de bandas de promedio móvil con el mecanismo de filtración de RSI. La ventaja central de la estrategia reside en su mecanismo de confirmación múltiple y su capacidad para cuantificar la intensidad de las tendencias, lo que hace que las decisiones de negociación sean más objetivas y basadas en datos.
A pesar de su buen desempeño en mercados de tendencia, las estrategias pueden enfrentarse a desafíos en mercados horizontales y en entornos de rápida reversión. La solidez y adaptabilidad de las estrategias se pueden mejorar aún más mediante la introducción de medidas de optimización como el stop loss dinámico, el filtro de la intensidad de la tendencia y la confirmación de la transacción.
Esta estrategia es especialmente adecuada para los operadores de tendencias a medio y largo plazo, que pueden encontrar oportunidades de negociación de alta probabilidad en todo tipo de entornos de mercado a través de un ajuste razonable de parámetros y gestión de riesgos. Sin embargo, cualquier estrategia de negociación debe coincidir con las preferencias de riesgo y los objetivos de inversión de los operadores.
/*backtest
start: 2024-03-24 00:00:00
end: 2025-03-23 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT"}]
*/
//@version=5
strategy("Madrid Ribbon Strategy with Backtesting", shorttitle="Madrid Ribbon Strat", overlay=true, default_qty_type=strategy.cash, default_qty_value=100000)
// Inputs
i_exp = input.bool(true, title="Use Exponential MA")
wallet_balance = input.float(100000, title="Starting Wallet Balance", minval=1000)
// RSI Settings
rsi_length = input.int(14, title="RSI Length")
rsi = ta.rsi(close, rsi_length)
// Profit Target & Stop Loss (%)
long_take_profit_perc = input.float(0.5, title="Long Take Profit (%)") / 100 // 0.5%
long_stop_loss_perc = input.float(1.0, title="Long Stop Loss (%)") / 100 // 1%
short_take_profit_perc = input.float(0.5, title="Short Take Profit (%)") / 100 // 0.5%
short_stop_loss_perc = input.float(1.0, title="Short Stop Loss (%)") / 100 // 1%
// Source
src = close
// Compute Moving Averages
ma05 = i_exp ? ta.ema(src, 5) : ta.sma(src, 5)
ma10 = i_exp ? ta.ema(src, 10) : ta.sma(src, 10)
ma15 = i_exp ? ta.ema(src, 15) : ta.sma(src, 15)
ma20 = i_exp ? ta.ema(src, 20) : ta.sma(src, 20)
ma25 = i_exp ? ta.ema(src, 25) : ta.sma(src, 25)
ma30 = i_exp ? ta.ema(src, 30) : ta.sma(src, 30)
ma35 = i_exp ? ta.ema(src, 35) : ta.sma(src, 35)
ma40 = i_exp ? ta.ema(src, 40) : ta.sma(src, 40)
ma45 = i_exp ? ta.ema(src, 45) : ta.sma(src, 45)
ma50 = i_exp ? ta.ema(src, 50) : ta.sma(src, 50)
ma55 = i_exp ? ta.ema(src, 55) : ta.sma(src, 55)
ma60 = i_exp ? ta.ema(src, 60) : ta.sma(src, 60)
ma65 = i_exp ? ta.ema(src, 65) : ta.sma(src, 65)
ma70 = i_exp ? ta.ema(src, 70) : ta.sma(src, 70)
ma75 = i_exp ? ta.ema(src, 75) : ta.sma(src, 75)
ma80 = i_exp ? ta.ema(src, 80) : ta.sma(src, 80)
ma85 = i_exp ? ta.ema(src, 85) : ta.sma(src, 85)
ma90 = i_exp ? ta.ema(src, 90) : ta.sma(src, 90)
ma100 = i_exp ? ta.ema(src, 100) : ta.sma(src, 100)
// Function for ribbon color
maColor(_ma, _maRef) =>
diffMA = ta.change(_ma)
resultColor = diffMA >= 0 and _ma > _maRef ? color.lime :
diffMA < 0 and _ma > _maRef ? color.maroon :
diffMA <= 0 and _ma < _maRef ? color.red :
diffMA >= 0 and _ma < _maRef ? color.green : color.gray
resultColor
// Count Green and Red Ribbons
count_green = 0
count_red = 0
mas = array.new_float(18)
array.set(mas, 0, ma05)
array.set(mas, 1, ma10)
array.set(mas, 2, ma15)
array.set(mas, 3, ma20)
array.set(mas, 4, ma25)
array.set(mas, 5, ma30)
array.set(mas, 6, ma35)
array.set(mas, 7, ma40)
array.set(mas, 8, ma45)
array.set(mas, 9, ma50)
array.set(mas, 10, ma55)
array.set(mas, 11, ma60)
array.set(mas, 12, ma65)
array.set(mas, 13, ma70)
array.set(mas, 14, ma75)
array.set(mas, 15, ma80)
array.set(mas, 16, ma85)
array.set(mas, 17, ma90)
for i = 0 to array.size(mas) - 1
ma = array.get(mas, i)
col = maColor(ma, ma100)
count_green += col == color.lime or col == color.green ? 1 : 0
count_red += col == color.red or col == color.maroon ? 1 : 0
// Buy/Sell Conditions
buy_signal = count_green >= 13
sell_signal = count_red >= 9
// RSI Filtering
rsi_buy = buy_signal and rsi < 30
rsi_sell = sell_signal and rsi > 70
// Calculate Entry, Take Profit & Stop Loss for Long and Short
entry_price = close
long_take_profit = entry_price * (1 + long_take_profit_perc) // +0.5%
long_stop_loss = entry_price * (1 - long_stop_loss_perc) // -1%
short_take_profit = entry_price * (1 - short_take_profit_perc) // -0.5%
short_stop_loss = entry_price * (1 + short_stop_loss_perc) // +1%
// Backtesting Orders
if rsi_buy
strategy.entry("Buy", strategy.long, qty=wallet_balance / close)
strategy.exit("Long Exit", from_entry="Buy", limit=long_take_profit, stop=long_stop_loss)
alert("📈 Buy Signal! Entering long trade at " + str.tostring(entry_price), alert.freq_once_per_bar_close)
if rsi_sell
strategy.entry("Sell", strategy.short, qty=wallet_balance / close)
strategy.exit("Short Exit", from_entry="Sell", limit=short_take_profit, stop=short_stop_loss)
alert("📉 Sell Signal! Entering short trade at " + str.tostring(entry_price), alert.freq_once_per_bar_close)
// Highlight Chart Background Based on Ribbon Counts
bgcolor(count_green >= 13 ? color.new(color.green, 90) : count_red >= 9 ? color.new(color.red, 90) : na, title="Ribbon Trend Highlight")
// Plot "B" when Buy Signal is active
plotshape(rsi_buy, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="B")
// Plot "S" when Sell Signal is active
plotshape(rsi_sell, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="S")
// Plot the Madrid Ribbon (all MAs)
plot(ma05, color=maColor(ma05, ma100), title="MA05", linewidth=1)
plot(ma10, color=maColor(ma10, ma100), title="MA10", linewidth=1)
plot(ma15, color=maColor(ma15, ma100), title="MA15", linewidth=1)
plot(ma20, color=maColor(ma20, ma100), title="MA20", linewidth=1)
plot(ma25, color=maColor(ma25, ma100), title="MA25", linewidth=1)
plot(ma30, color=maColor(ma30, ma100), title="MA30", linewidth=1)
plot(ma35, color=maColor(ma35, ma100), title="MA35", linewidth=1)
plot(ma40, color=maColor(ma40, ma100), title="MA40", linewidth=1)
plot(ma45, color=maColor(ma45, ma100), title="MA45", linewidth=1)
plot(ma50, color=maColor(ma50, ma100), title="MA50", linewidth=1)
plot(ma55, color=maColor(ma55, ma100), title="MA55", linewidth=1)
plot(ma60, color=maColor(ma60, ma100), title="MA60", linewidth=1)
plot(ma65, color=maColor(ma65, ma100), title="MA65", linewidth=1)
plot(ma70, color=maColor(ma70, ma100), title="MA70", linewidth=1)
plot(ma75, color=maColor(ma75, ma100), title="MA75", linewidth=1)
plot(ma80, color=maColor(ma80, ma100), title="MA80", linewidth=1)
plot(ma85, color=maColor(ma85, ma100), title="MA85", linewidth=1)
plot(ma90, color=maColor(ma90, ma100), title="MA90", linewidth=1)
plot(ma100, color=maColor(ma100, ma100), title="MA100", linewidth=2)