Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 22): Panel de correlación
Contenido
Introducción
La correlación es una medida estadística de cómo dos variables se relacionan entre sí. Los mercados financieros reflejan el grado en que dos instrumentos suben y bajan juntos (correlación positiva) o en direcciones opuestas (correlación negativa). Es importante destacar que la correlación describe relaciones, no causalidad.En mi artículo anterior, mostré cómo representar gráficamente la correlación entre el EURUSD y el GBPUSD utilizando bibliotecas de Python. Ahora, te guiaré en la creación de un Asesor Experto personalizado que ofrece análisis de correlación directamente en MetaTrader 5 con visualizaciones prácticas en el gráfico. Esta herramienta crea un panel en tiempo real que muestra los valores de correlación entre diversos instrumentos: divisas, materias primas y más, en un marco temporal seleccionado.
Mediante el uso de este panel de control, los operadores obtienen una comprensión más profunda de cómo interactúan los movimientos de precios en los diferentes mercados. Tanto si los instrumentos evolucionan en tándem, divergen notablemente o se comportan de forma independiente, esta perspectiva resulta útil para:
- Gestión del riesgo de la cartera (evitando la sobreexposición a operaciones correlacionadas).
- Identificar posibles coberturas u operaciones de pares.
- Fomentar la diversificación.
- Detectar cambios en la dinámica del mercado cuando cambian las correlaciones.

Figura 1. Relaciones de pares
El primer gráfico muestra cómo el EURUSD y el GBPUSD tienden a evolucionar de forma paralela: cuando el EURUSD sube, el GBPUSD también sube. Esto se denomina correlación positiva fuerte o proporción directa. El segundo gráfico muestra que el EURUSD y el USDCHF evolucionan en direcciones opuestas: cuando el EURUSD sube, el USDCHF baja. Se trata de una fuerte correlación negativa (una relación inversa). Cuando dos pares no se mueven ni en la misma dirección ni en sentido contrario, decimos que no están correlacionados o que son independientes.
Resumen de la estrategia
El EA «Correlation Dashboard» recopila continuamente los últimos N cierres de cada par de su lista y los convierte en rendimientos simples. A continuación, calcula el coeficiente de correlación de Pearson (r) para cada par de instrumentos único y representa estos valores como una matriz de mapa de calor en el gráfico, con celdas coloreadas que muestran la intensidad y el signo. El EA superpone cada valor de r y lo clasifica como positivo fuerte, moderado, sin correlación, negativo moderado o negativo fuerte. Imprime una interpretación con consejos personalizados (cubrirse, confirmar, diversificar o plantear spreads) y activa alertas cuando cualquier correlación supera el umbral establecido.
De un vistazo se puede ver qué mercados se mueven al unísono, cuáles se oponen y cuáles permanecen independientes, lo que permite ajustar las posiciones con confianza. A continuación se muestra el código MQL5 que realiza el cálculo del coeficiente de correlación de Pearson (r):
//+------------------------------------------------------------------+ //| Pearson correlation | //+------------------------------------------------------------------+ double CalcCorrelation(const string s1, const string s2) { double a1[], a2[]; // Fetch closing prices if(CopyClose(s1, TimeFrame, 0, LookbackBars, a1) < LookbackBars || CopyClose(s2, TimeFrame, 0, LookbackBars, a2) < LookbackBars) return(0); int n = LookbackBars - 1; double r1[], r2[]; ArrayResize(r1, n); ArrayResize(r2, n); // Compute simple returns for(int k = 1; k < LookbackBars; k++) { r1[k-1] = (a1[k] - a1[k-1]) / a1[k-1]; r2[k-1] = (a2[k] - a2[k-1]) / a2[k-1]; } // Calculate means double m1 = AverageArray(r1); double m2 = AverageArray(r2); // Build covariance numerator and variances double num = 0, d1 = 0, d2 = 0; for(int i = 0; i < n; i++) { double da = r1[i] - m1; double db = r2[i] - m2; num += da * db; // covariance sum d1 += da * da; // variance of series 1 d2 += db * db; // variance of series 2 } // Return r (or 0 if division by zero) return (d1 > 0 && d2 > 0) ? num / MathSqrt(d1 * d2) : 0; }
- Correlación positiva fuerte (r ≥ 0,8)
Interpretación: Cuando el EURUSD sube un 1%, el GBPUSD tiende a subir un 0,85% de media. Una señal de compra en EURUSD se ve reforzada efectivamente por GBPUSD, por lo que conviene tratarlos como un único grupo, evitar posiciones compensatorias y considerar el uso de uno como cobertura para el otro.
- Correlación negativa fuerte (r ≤ –0,8)
Interpretación: Un aumento del 1% en el EURUSD coincide con una caída del 0,92% en el USDCHF. Puedes utilizar estrategias de spreads entre mercados (compra de EURUSD, venta de USDCHF) para capturar movimientos relativos neutralizando al mismo tiempo la exposición direccional directa, o estar atento a las divergencias como una señal de alerta ante una posible pérdida de convicción.
- Sin correlación (valor absoluto de r < 0,5)
Interpretación: Los cambios en el AUDUSD prácticamente no tienen poder predictivo para el USDJPY y viceversa. Estos pares "independientes" son candidatos ideales para la diversificación: añadirlos a tu cartera suaviza la volatilidad sin introducir sesgos direccionales ocultos.

Figura 2. Panel
La figura 2 anterior ilustra la interfaz que pretendemos construir: una tabla que muestra valores de correlación, denotados por “x”, que van desde –1 hasta +1.
Análisis del código MQL5
Como es habitual en el desarrollo con MQL5, comenzamos definiendo las características fundamentales de nuestro programa mediante directivas iniciales e incluyendo las bibliotecas necesarias. Estas líneas establecen directivas estándar #property para la identificación y el control de versiones, y proporcionan metadatos esenciales que se pueden consultar en el terminal MetaTrader 5.//+------------------------------------------------------------------+ //| Correlation Dashboard.mq5| //| Copyright 2025, MetaQuotes Ltd.| //| https://www.mql5.com/en/users/lynnchris| //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com/en/users/lynnchris" #property version "1.0" #property strictUn elemento fundamental en este caso es #property strict, que se incluye para imponer normas de compilación rigurosas. Esta práctica es muy recomendable, ya que ayuda a detectar posibles errores de codificación en las primeras etapas del proceso de desarrollo, lo que da como resultado un código más robusto y fiable. Siguiendo estas instrucciones, incluimos la biblioteca <Trade\Trade.mqh>:
#include <Trade\Trade.mqh>
Si bien este Asesor Experto (EA) en particular se centra en el análisis y no en el trading automatizado, la incorporación de esta biblioteca otorga acceso a un conjunto completo de funciones y clases relevantes para la gestión de operaciones, lo que mantiene abiertas las opciones para futuras mejoras o la integración en un sistema de negociación más amplio.
Antes de poder calcular e interpretar eficazmente las correlaciones, necesitamos algunos elementos básicos fundamentales. Aquí es donde entran en juego nuestras funciones de utilidad. La función AverageArray proporciona una herramienta indispensable para calcular la media de un conjunto de datos, un paso necesario en nuestra fórmula de correlación.
//+------------------------------------------------------------------+ //| Utility: average of an array | //+------------------------------------------------------------------+ double AverageArray(const double &arr[]) { int sz = ArraySize(arr); if(sz == 0) return(0); double sum = 0; for(int i = 0; i < sz; i++) sum += arr[i]; return(sum / sz); }
Más allá de las cifras brutas, la función InterpretCorrelation toma el coeficiente de correlación calculado y lo transforma en una descripción más intuitiva, clasificando la intensidad y la dirección de la relación con términos como «fuerte y positiva» o «débil o sin correlación», basándose en umbrales predefinidos.
//+------------------------------------------------------------------+ //| Interpret raw correlation | //+------------------------------------------------------------------+ string InterpretCorrelation(double r) { if(r >= 0.8) return("strong positive correlation"); if(r >= 0.5) return("moderate positive correlation"); if(r > -0.5) return("weak or no correlation"); if(r > -0.8) return("moderate negative correlation"); return("strong negative correlation"); }
Partiendo de esta interpretación, la función RecommendAction ofrece comentarios prácticos y posibles implicaciones para la negociación basadas en la correlación observada entre dos instrumentos concretos, proporcionando información útil derivada del análisis estadístico.
//+------------------------------------------------------------------+ //| Recommend trading action based on r | //+------------------------------------------------------------------+ string RecommendAction(double r, const string s1, const string s2) { if(r >= 0.8) return("They move almost in lock-step. Avoid opposite positions; use one as hedge."); if(r >= 0.5) return("Tendency to move together. Be cautious opening offset trades—seek confirmation."); if(r > -0.5) return("Little to no relation: ideal for diversification."); if(r > -0.8) return("Often move in opposition. Consider small inter-market spreads."); return("Very strong inverse relationship—candidate for statistical arbitrage."); }
Para que el panel de control de correlaciones se adapte a las distintas preferencias de negociación y necesidades analíticas, ofrecemos un conjunto de parámetros de entrada que el usuario puede configurar a través de la ventana de propiedades del EA.
//+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ input string InstrumentsList = "EURUSD,GBPUSD,USDJPY,USDCHF,AUDUSD,NZDUSD,XAUUSD"; input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1; input int LookbackBars = 100; // bars for correlation input double AlertThreshold = 0.8; // threshold for alerts input int UpdateSeconds = 5; // timer interval // Notifications input bool UsePushNotifications = true; input bool UseEmailAlerts = false;
En primer lugar, el usuario define el conjunto de activos que se van a analizar mediante el elemento InstrumentsList, proporcionando una sencilla cadena de símbolos separados por comas. A continuación, selecciona el TimeFrame para el análisis, determinando así el nivel de detalle de los datos históricos utilizados. El campo de entrada LookbackBars permite al usuario controlar la duración del periodo histórico que se tiene en cuenta para el cálculo de la correlación. El parámetro AlertThreshold permite al usuario definir el nivel de significación de la correlación que debe activar una notificación. Por último, UpdateSeconds establece la frecuencia con la que el EA vuelve a calcular y actualiza el panel de control, mientras que UsePushNotifications y UseEmailAlerts permiten controlar los métodos preferidos para recibir alertas.
Para garantizar que se pueda acceder a los datos críticos desde diferentes partes de la EA, declaramos algunas variables globales.
//+------------------------------------------------------------------+ //| Globals | //+------------------------------------------------------------------+ string Instruments[]; double CorrArray[]; int InstrumentCount;
La matriz «Instruments» almacenará los nombres de los símbolos individuales una vez que se hayan extraído de la lista introducida por el usuario. El CorrArray es una matriz específica destinada a almacenar los coeficientes de correlación por pares calculados, organizada de tal forma que permite acceder fácilmente a la correlación entre dos instrumentos cualesquiera. Una simple variable entera, InstrumentCount, lleva la cuenta del número de símbolos que se están analizando.
Cuando se aplica el asesor experto a un gráfico, la función OnInit es la primera en ejecutarse, y se encarga de configurar los componentes necesarios para su funcionamiento. En primer lugar, analiza el elemento InstrumentsList para rellenar la matriz Instruments y comprueba que se hayan proporcionado al menos dos símbolos, ya que la correlación requiere un par.
//+------------------------------------------------------------------+ //| Expert initialization | //+------------------------------------------------------------------+ int OnInit() { // parse & select instruments InstrumentCount = StringSplit(InstrumentsList, ',', Instruments); if(InstrumentCount < 2) { Print("Error: need at least two symbols."); return(INIT_FAILED); } for(int i = 0; i < InstrumentCount; i++) SymbolSelect(Instruments[i], true);
A continuación, se asegura de que MetaTrader disponga de datos listos para todos los símbolos especificados mediante SymbolSelect. A continuación, se ajusta el tamaño del CorrArray para que pueda almacenar todas las correlaciones por pares.
// allocate storage ArrayResize(CorrArray, InstrumentCount * InstrumentCount);
Un paso clave en este caso es llamar a DrawDashboard(), lo que genera la representación visual inicial de la matriz de correlación en el gráfico.
// draw dashboard & start timer
DrawDashboard(); Para garantizar que el panel de control se mantenga dinámico, se utiliza EventSetTimer para programar llamadas periódicas a la función OnTimer, lo que inicia el ciclo de actualización.
EventSetTimer(UpdateSeconds); return(INIT_SUCCEEDED); }
Si falla alguno de los pasos de inicialización (por ejemplo, si se proporcionan menos de dos símbolos), OnInit devuelve INIT_FAILED, lo que impide que se ejecute el EA.
Cuando el EA ya no es necesario y se elimina del gráfico o se cierra la terminal, se ejecuta la función OnDeinit para llevar a cabo las tareas de limpieza necesarias.
//+------------------------------------------------------------------+ //| Expert deinitialization | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); ClearObjects(); }
Sus tareas principales consisten en detener el temporizador periódico mediante EventKillTimer(), impidiendo así que continúe la ejecución de la lógica de actualización, y en eliminar del gráfico todos los objetos gráficos creados por el EA mediante ClearObjects(), dejando el gráfico en un estado limpio.
La función OnTimer constituye el motor del comportamiento dinámico del EA, ya que se activa automáticamente en el intervalo especificado por el usuario. Al ejecutarse, primero llama a UpdateCorrelations() para actualizar todos los cálculos de correlación con los datos más recientes.
//+------------------------------------------------------------------+ //| Timer: update, interpret, display, alert | //+------------------------------------------------------------------+ void OnTimer() { UpdateCorrelations();
A continuación, recorre cada par único de instrumentos, obtiene su correlación y utiliza las funciones de utilidad para generar un texto interpretativo y recomendaciones de negociación, que posteriormente se registran en la pestaña «Expertos».
// interpret & advise for each unique pair for(int i = 0; i < InstrumentCount; i++) for(int j = i + 1; j < InstrumentCount; j++) { double r = CorrArray[i * InstrumentCount + j]; string cat = InterpretCorrelation(r); string tip = RecommendAction(r, Instruments[i], Instruments[j]); PrintFormat( "%s vs %s \xBB r=%.2f: %s; Advice: %s", Instruments[i], Instruments[j], r, cat, tip ); }
Tras procesar los datos, llama a RefreshValues() para actualizar el panel visual del gráfico, mostrando los nuevos coeficientes de correlación y ajustando la codificación por colores.
RefreshValues();
Por último, comprueba si alguna correlación ha superado el umbral de alerta AlertThreshold predefinido mediante la llamada a CheckAlerts(), y, de ser así, inicia el proceso de notificación.
CheckAlerts(); }
La tarea analítica principal se realiza dentro de las funciones de cálculo de correlación. La función UpdateCorrelations() actúa como gestora, recorriendo todos los pares posibles de instrumentos e invocando CalcCorrelation para cada par con el fin de obtener el coeficiente de correlación, que posteriormente se almacena en CorrArray.
//+------------------------------------------------------------------+ //| Compute pairwise correlations | //+------------------------------------------------------------------+ void UpdateCorrelations() { for(int i = 0; i < InstrumentCount; i++) for(int j = 0; j < InstrumentCount; j++) CorrArray[i * InstrumentCount + j] = CalcCorrelation(Instruments[i], Instruments[j]); }
La función CalcCorrelation (const string s1, const string s2) es donde se lleva a cabo el cálculo estadístico. Recupera los datos históricos de los precios de cierre correspondientes a los LookbackBars especificados para ambos instrumentos mediante CopyClose.
//+------------------------------------------------------------------+ //| Pearson correlation | //+------------------------------------------------------------------+ double CalcCorrelation(const string s1, const string s2) { double a1[], a2[]; if(CopyClose(s1, TimeFrame, 0, LookbackBars, a1) < LookbackBars || CopyClose(s2, TimeFrame, 0, LookbackBars, a2) < LookbackBars) return(0);Para garantizar una medida relevante de los datos financieros, calcula el porcentaje de variación del precio entre barras consecutivas.
int n = LookbackBars - 1; double r1[], r2[]; ArrayResize(r1, n); ArrayResize(r2, n); for(int k = 1; k < LookbackBars; k++) { r1[k-1] = (a1[k] - a1[k-1]) / a1[k-1]; r2[k-1] = (a2[k] - a2[k-1]) / a2[k-1]; }A partir de estas variaciones de precios normalizadas, calcula el coeficiente de correlación de Pearson, cuantificando así la relación lineal entre las dos series temporales.
double m1 = AverageArray(r1), m2 = AverageArray(r2); double num = 0, d1 = 0, d2 = 0; for(int k = 0; k < n; k++) { double da = r1[k] - m1; double db = r2[k] - m2; num += da * db; d1 += da * da; d2 += db * db; } return (d1 > 0 && d2 > 0) ? num / MathSqrt(d1 * d2) : 0; }
Incluye una comprobación para gestionar los casos en los que no hay variación de precio, con el fin de evitar la división por cero.
El panel visual del gráfico se gestiona mediante un conjunto de funciones. DrawDashboard() se encarga de construir inicialmente el diseño gráfico durante la inicialización, creando la estructura matricial con etiquetas para los símbolos y áreas de marcador de posición para los valores de correlación.//+------------------------------------------------------------------+ //| Draw static dashboard | //+------------------------------------------------------------------+ void DrawDashboard() { ClearObjects(); const int x0 = 20, y0 = 40, dx = 100, dy = 25; CreateLabel("hdr", x0, y0-30, "Correlation Dashboard", clrWhite, 14); // column headers for(int j = 0; j < InstrumentCount; j++) CreateLabel( StringFormat("col_%d", j), x0 + (j+1)*dx, y0, Instruments[j], clrYellow, 10 ); // row headers & cells for(int i = 0; i < InstrumentCount; i++) { CreateLabel( StringFormat("row_%d", i), x0, y0 + (i+1)*dy, Instruments[i], clrYellow, 10 ); for(int j = 0; j < InstrumentCount; j++) { string rect = StringFormat("r_%d_%d", i, j); ObjectCreate(0, rect, OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, rect, OBJPROP_XDISTANCE, x0 + (j+1)*dx - 5); ObjectSetInteger(0, rect, OBJPROP_YDISTANCE, y0 + (i+1)*dy - 12); ObjectSetInteger(0, rect, OBJPROP_XSIZE, dx); ObjectSetInteger(0, rect, OBJPROP_YSIZE, dy); CreateLabel( StringFormat("val_%d_%d", i, j), x0 + (j+1)*dx, y0 + (i+1)*dy, "--", clrWhite, 9 ); } } }ClearObjects() es una función de utilidad que elimina de forma eficaz todos los objetos creados por el EA del gráfico; se utiliza durante la desinicialización y, posiblemente, antes de volver a dibujar el gráfico.
//+------------------------------------------------------------------+ //| Clear all chart objects | //+------------------------------------------------------------------+ void ClearObjects() { for(int i = ObjectsTotal(0)-1; i >= 0; i--) ObjectDelete(0, ObjectName(0, i)); }
ClearObjects() es una función de utilidad que elimina de forma eficaz todos los objetos creados por el EA del gráfico; se utiliza durante la desinicialización y, posiblemente, antes de volver a dibujar el gráfico. Recupera los valores de correlación más recientes y ajusta dinámicamente los colores de fondo y del texto de las celdas del panel, creando una visualización en forma de mapa de calor que permite identificar rápidamente las correlaciones positivas y negativas más marcadas.
//+------------------------------------------------------------------+ //| Refresh heat-map values & colors | //+------------------------------------------------------------------+ void RefreshValues() { for(int i = 0; i < InstrumentCount; i++) for(int j = 0; j < InstrumentCount; j++) { double v = CorrArray[i * InstrumentCount + j]; color bg = (v > 0.8 ? clrGreen : v > 0.5 ? clrLightGreen : v < -0.5 ? clrRed : clrLightCoral); color fg = (v >= 0 ? clrLime : clrRed); string rect = StringFormat("r_%d_%d", i, j); if(ObjectFind(0, rect) != -1) ObjectSetInteger(0, rect, OBJPROP_COLOR, bg); string lbl = StringFormat("val_%d_%d", i, j); if(ObjectFind(0, lbl) != -1) { ObjectSetString(0, lbl, OBJPROP_TEXT, DoubleToString(v, 2)); ObjectSetInteger(0, lbl, OBJPROP_COLOR, fg); } } }
Para mantener al usuario informado de los cambios significativos en las relaciones de mercado, se ha implementado un mecanismo de alertas en la función CheckAlerts.
//+------------------------------------------------------------------+ //| Alert on threshold & notify | //+------------------------------------------------------------------+ void CheckAlerts() { for(int i = 1; i < InstrumentCount; i++) { double v = CorrArray[i]; // Potential issue here, likely intended CorrArray[0 * InstrumentCount + i] if(v >= AlertThreshold) // Only checks for positive correlation >= threshold { string msg = StringFormat( "High correlation: %s vs %s = %.2f", Instruments[0], Instruments[i], v ); Alert(msg); Print(msg); if(UsePushNotifications) SendNotification(msg); if(UseEmailAlerts) SendMail("Correlation Alert", msg); } } }
Esta función supervisa específicamente la correlación entre el primer símbolo de la lista del usuario y el resto de instrumentos. Si la correlación (por encima del umbral positivo en esta implementación, aunque fácilmente adaptable para incluir correlaciones negativas fuertes comprobando el valor absoluto) alcanza o supera el AlertThreshold, se activa una notificación. Esto implica generar un mensaje claro en el que se detallen el par y su correlación, mostrar una alerta estándar de MetaTrader 5, mostrar el mensaje en la pestaña «Expertos» y, opcionalmente, enviar notificaciones push o correos electrónicos según la configuración del usuario.
Nota: Tal y como se destaca en el comentario del código, parece haber un posible problema de indexación en CorrArray[i] dentro de esta función, que probablemente pretende acceder a la correlación entre Instruments[0] e Instruments[i]. Además, actualmente solo emite alertas cuando las correlaciones positivas superan el umbral; para emitir alertas en caso de correlaciones negativas fuertes, sería necesario comprobar el valor absoluto.
Resultados
Al implementarse con datos reales, el EA generó inmediatamente el panel de control. Comenzó a mostrar lecturas de correlación actualizadas al minuto, en verde para las relaciones positivas y en rojo para las inversas. La pantalla se actualizaba cada cierto tiempo. La pestaña «Expertos» registró todos los coeficientes. Ofrecía una interpretación concisa de cada valor. Esta configuración te permite examinar tanto las cifras brutas como su significado práctico sin perder detalle.2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs USDJPY → r=-0.79: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs USDCHF → r=-0.80: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs AUDUSD → r=0.48: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs NZDUSD → r=0.57: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs XAUUSD → r=0.11: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs USDJPY → r=-0.71: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs USDCHF → r=-0.63: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs AUDUSD → r=0.54: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs NZDUSD → r=0.63: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs XAUUSD → r=0.11: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs USDCHF → r=0.75: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs AUDUSD → r=-0.33: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs NZDUSD → r=-0.47: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs XAUUSD → r=-0.04: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDCHF vs AUDUSD → r=-0.24: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDCHF vs NZDUSD → r=-0.32: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDCHF vs XAUUSD → r=0.05: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) AUDUSD vs NZDUSD → r=0.87: strong positive correlation; Advice: They move almost in lock-step. Avoid opposite positions; use one as hedge. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) AUDUSD vs XAUUSD → r=0.08: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) NZDUSD vs XAUUSD → r=0.11: weak or no correlation; Advice: Little to no relation: ideal for diversification.
La información anterior proviene del registro de la pestaña Expertos, donde se registra cada correlación recién detectada. He destacado las relaciones más sólidas, aquellas con r ≤ –0,8 (fuertemente negativa) y r ≥ +0,8 (fuertemente positiva). A continuación se muestra el diagrama del panel de control integrado en el gráfico, a modo de referencia visual.

Figura 3. Tablero de correlaciones
Los pares NZDUSD y AUDUSD muestran una fuerte correlación positiva, lo que significa que evolucionan al unísono con una evolución de los precios prácticamente idéntica. A continuación, comparamos sus fluctuaciones de precios en tiempo real en paralelo para confirmar que el indicador de correlación del panel de control refleja con precisión lo que está sucediendo en el mercado.

Figura 4. Fuerte correlación positiva
El diagrama anterior ilustra una fuerte correlación positiva entre estos pares: ambos tienden a moverse casi al mismo tiempo y en la misma dirección. Entre el 6 y el 7 de mayo, ambos pares mostraron inicialmente una tendencia bajista antes de revertirla y entrar en una tendencia alcista. A continuación, he mostrado una correlación negativa moderada: se pueden observar estructuras inversas que se forman, donde un par vende mientras el otro compra, y viceversa, la mayoría de las veces.

Figura 5. Correlación negativa moderada
Conclusión
El EA «Correlation Dashboard» ofrece información valiosa sobre la evolución de los precios entre pares sin que tenga que cambiar de gráfico. Al mostrar las relaciones en tiempo real, le ayuda a anticipar los cambios del mercado en los distintos instrumentos y a tomar decisiones operativas mejor fundamentadas. Aunque el panel del gráfico y los registros de la pestaña Expertos tengan un aspecto básico, presentan claramente la funcionalidad principal: un panel de control que se actualiza automáticamente con coeficientes codificados por colores y mensajes interpretativos. Puedes rediseñar o ampliar fácilmente la interfaz de usuario, pero las funciones analíticas esenciales ya están implementadas. ¡No dudes en ponerte en contacto con nosotros si tienes alguna pregunta o sugerencia!
| Fecha | Nombre de la herramienta | Descripción | Versión | Actualizaciones | Notas |
|---|---|---|---|---|---|
| 01/10/24 | Chart Projector | Script para superponer un efecto fantasma a la evolución del precio del día anterior. | 1.0 | Versión inicial | Herramienta número 1 |
| 18/11/24 | Analytical Comment | Proporciona la información del día anterior en formato tabular, además de anticipar la dirección futura del mercado. | 1.0 | Versión inicial | Herramienta número 2 |
| 27/11/24 | Analytics Master | Actualización periódica de las métricas del mercado cada dos horas. | 1.01 | Segundo lanzamiento | Herramienta número 3 |
| 02/12/24 | Analytics Forecaster | Actualización periódica de las métricas del mercado cada dos horas con integración de Telegram. | 1.1 | Tercera edición | Herramienta número 4 |
| 09/12/24 | Volatility Navigator | El EA analiza las condiciones del mercado utilizando los indicadores Bandas de Bollinger, RSI y ATR. | 1.0 | Versión inicial | Herramienta número 5 |
| 19/12/24 | Mean Reversion Signal Reaper | Analiza el mercado utilizando una estrategia de reversión a la media y proporciona una señal. | 1.0 | Versión inicial | Herramienta número 6 |
| 09/01/25 | Signal Pulse | Analizador de múltiples marcos temporales. | 1.0 | Versión inicial | Herramienta número 7 |
| 17/01/25 | Metrics Board | Panel con botón para análisis. | 1.0 | Versión inicial | Herramienta número 8 |
| 21/01/25 | External Flow | Análisis a través de bibliotecas externas. | 1.0 | Versión inicial | Herramienta número 9 |
| 27/01/25 | VWAP | Volume Weighted Average Price. | 1.3 | Versión inicial | Herramienta número 10 |
| 02/02/25 | Heikin Ashi | Suavizado de tendencias e identificación de señales de reversión. | 1.0 | Versión inicial | Herramienta número 11 |
| 04/02/25 | FibVWAP | Generación de señales mediante análisis con Python. | 1.0 | Versión inicial | Herramienta número 12 |
| 14/02/25 | RSI DIVERGENCE | Divergencias entre la acción del precio y el RSI. | 1.0 | Versión inicial | Herramienta número 13 |
| 17/02/25 | Parabolic Stop and Reverse (PSAR) | Automatización de la estrategia PSAR. | 1.0 | Versión inicial | Herramienta número 14 |
| 20/02/25 | Quarters Drawer Script | Trazar los niveles de los cuartos en el gráfico. | 1.0 | Versión inicial | Herramienta número 15 |
| 27/02/25 | Intrusion Detector | Detecta y alerta cuando el precio alcanza niveles de cuartos. | 1.0 | Versión inicial | Herramienta número 16 |
| 27/02/25 | TrendLoom Tool | Panel de análisis de múltiples marcos temporales. | 1.0 | Versión inicial | Herramienta número 17 |
| 11/03/25 | Quarters Board | Panel con botones para activar o desactivar los niveles de cuartos. | 1.0 | Versión inicial | Herramienta número 18 |
| 26/03/25 | ZigZag Analyzer | Trazado de líneas de tendencia con el indicador ZigZag. | 1.0 | Versión inicial | Herramienta número 19 |
| 10/04/25 | Correlation Pathfinder | Representación gráfica de correlaciones monetarias mediante bibliotecas de Python. | 1.0 | Versión inicial | Herramienta número 20 |
| 23/04/25 | Market Structure Flip Detector Tool | Detección de cambios en la estructura del mercado. | 1.0 | Versión inicial | Herramienta número 21 |
| 08/05/25 | Correlation Dashboard | Relación entre diferentes pares. | 1.0 | Versión inicial | Herramienta número 22 |
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/18052
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Utilizando redes neuronales en MetaTrader
Del básico al intermedio: SandBox y MetaTrader
Particularidades del trabajo con números del tipo double en MQL4
Simulación de mercado: Position View (II)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Echa un vistazo al nuevo artículo: Price Action Analysis Toolkit Development (Part 22): Correlation Dashboard.
Autor: Christian Benjamin
Esto es bonito cuánto