English Русский 中文 Deutsch 日本語
preview
De novato a experto: Noticias animadas utilizando MQL5 (III) — Información sobre indicadores

De novato a experto: Noticias animadas utilizando MQL5 (III) — Información sobre indicadores

MetaTrader 5Ejemplos |
29 0
Clemence Benjamin
Clemence Benjamin

Contenido:

  1. Introducción
  2. Concepto
  3. Implementación
  4. Pruebas
  5. Conclusión
  6. Conclusiones clave
  7. Archivos adjuntos


Introducción

Hoy presentamos una nueva línea de información sobre indicadores: una función basada en reglas y diseñada para complementar las herramientas que hemos explorado en episodios anteriores (I y II). Si aún no lo ha notado, el objetivo principal es claro: optimizar la interfaz de la terminal MetaTrader 5 para un acceso compacto y eficiente a los recursos comerciales esenciales, directamente desde el gráfico.

La mayoría de los osciladores tradicionalmente se muestran en subventanas separadas debajo del gráfico principal, lo que fragmenta el espacio de trabajo y consume valioso espacio de píxeles. Cuantos más indicadores utilice, más se comprimirá su gráfico, lo que limitará su capacidad de ver la acción del precio con claridad.

Para abordar esto, simplificaremos estos retos integrando un carril de información con indicadores en el gráfico utilizando la clase CCanvas. Esto nos permite obtener y procesar valores indicadores a través de la API MQL5 y mostrar señales significativas sin saturar la interfaz. He preparado un ejemplo visual que ilustra cómo las múltiples subventanas de indicadores reducen la vista principal del gráfico.

Múltiples ventanas de indicadores reducen el espacio del gráfico.

Esta ilustración muestra cómo las ventanas indicadoras afectan al gráfico.

En el siguiente segmento, analizaremos el concepto que subyace a este enfoque antes de profundizar en su implementación.


Concepto

Nuestro plan es introducir una única línea de desplazamiento de forma predeterminada que muestre información de cuatro osciladores clave: indicadores que brindan a los operadores señales críticas para guiar sus decisiones. Este diseño compacto reduce el desorden de los gráficos y garantiza una vista más limpia y enfocada. Sin embargo, los usuarios que prefieran más detalles pueden ampliar opcionalmente la información en carriles separados, cada uno dedicado a un indicador específico.

Comprender estos indicadores en profundidad es esencial para apreciar cómo respaldan estrategias comerciales sólidas. Al finalizar esta configuración, tendrá titulares de noticias, el calendario económico y información de indicadores en tiempo real, todo consolidado en una interfaz inteligente directamente en el gráfico de MetaTrader 5.

De cara a futuras actualizaciones, también estoy considerando agregar un Analyst Insights Lane, un espacio dedicado que podría mostrar información seleccionada de publicaciones de analistas profesionales. Al acceder a sus API, esta función podría incorporar comentarios de expertos y perspectivas estratégicas directamente en el gráfico, creando una potente pantalla lista para la toma de decisiones para los operadores.

Ahora, tanto para los principiantes como para el enriquecimiento de los operadores experimentados, dediquemos un momento a explorar cómo se utiliza habitualmente en el trading cada uno de los cuatro osciladores que vamos a integrar, y cómo la combinación de sus conocimientos puede mejorar significativamente su toma de decisiones en tiempo real.

Comprender el RSI, el CCI, el estocástico y el MACD en el trading:

Relative Strength Index (RSI)

El RSI, desarrollado por J. Welles Wilder en 1978, es un oscilador de impulso que mide la velocidad y el cambio de los movimientos de precios. Se utiliza principalmente para identificar condiciones de sobrecompra y sobreventa, así como posibles reversiones de tendencia. El RSI es especialmente eficaz en mercados con rangos limitados, en los que los precios oscilan entre los niveles de soporte y resistencia.

Cálculo:

El RSI se calcula normalmente sobre un periodo de 14 días, aunque los operadores pueden ajustarlo para periodos más cortos o más largos. La fórmula es:

Donde RSI (fuerza relativa) es la relación entre la ganancia media y la pérdida media durante el periodo especificado. Las ganancias y pérdidas medias se calculan en función de las variaciones de precios durante el periodo de referencia.

Niveles clave e interpretación:  

El RSI oscila entre 0 y 100, con un punto medio en 50.

  • Los valores superiores a 70 se consideran sobrecomprados, lo que sugiere que el activo puede estar sobrevalorado y que es probable que se produzca una corrección a la baja.
  • Los valores inferiores a 30 se consideran sobrevendidos, lo que indica que el activo puede estar infravalorado y que es probable que se produzca un repunte al alza.
  • Los valores superiores a 50 suelen indicar un impulso alcista, mientras que los inferiores a 50 sugieren un impulso bajista.

Relative Strength Index (RSI)

Relative Strength Index

Estrategias de trading basadas en el RSI:  

  • Señales de sobrecompra/sobreventa: Los operadores suelen buscar un cruce del RSI por encima de 30 como una posible señal de compra, lo que indica que el activo está saliendo del territorio de sobreventa. Por el contrario, cruzar por debajo de 70 puede indicar una venta, lo que indica condiciones de sobrecompra.
  • Divergencia: El RSI puede indicar posibles reversiones a través de la divergencia. Por ejemplo, una divergencia bajista se produce cuando el precio alcanza un nuevo máximo, pero el RSI alcanza un máximo más bajo, lo que sugiere un debilitamiento del impulso. Una divergencia alcista se produce cuando el precio alcanza un nuevo mínimo, pero el RSI alcanza un mínimo más alto.
  • Confirmación de la tendencia: En una tendencia alcista, el RSI debería mantenerse generalmente por encima de 50, mientras que en una tendencia bajista, debería mantenerse por debajo de 50, lo que ayuda a los operadores a confirmar la dirección de la tendencia.
  • Oscilaciones fallidas: Wilder identificó las «oscilaciones fallidas» como fuertes indicios de reversiones del mercado, como por ejemplo, que el RSI no lograra superar los 70 puntos tras alcanzar los 76 y luego cayera por debajo de los 72, lo que indicaba una posible reversión.

Ejemplo de aplicación:

Si el RSI cruza por encima de 30 después de estar en territorio de sobreventa (por debajo de 30), podría indicar una oportunidad de compra, especialmente si va acompañado de otros indicadores alcistas, como un cruce de medias móviles. Por el contrario, si el RSI cruza por debajo de 70 después de estar sobrecomprado, podría indicar una oportunidad de venta.

Commodity Channel Index (CCI)

El CCI es un oscilador de impulso diseñado originalmente para identificar cambios cíclicos en las materias primas, pero que ahora se utiliza en diversas clases de activos, incluidas las acciones y las divisas. Mide el nivel de precios actual en relación con el nivel de precios medio durante un periodo determinado, lo que ayuda a los operadores a identificar condiciones de sobrecompra/sobreventa y la fuerza de la tendencia. Fue introducido por Donald Lambert en 1980.

Cálculo:

El CCI se calcula normalmente sobre un periodo de 20 días, aunque esto puede ajustarse. La fórmula es:

Donde:

Precio típico = (Máximo + Mínimo + Cierre) / 3.
SMA (Simple Moving Average) = Media móvil simple del precio típico durante el período especificado.
Desviación media = Promedio de las desviaciones absolutas del precio típico con respecto a la SMA.

El factor 0,015 se utiliza para escalar los resultados y facilitar su lectura.

Niveles clave e interpretación:  

  • El CCI oscila alrededor de cero, sin límites superiores ni inferiores.
  • Los valores superiores a +100 indican condiciones de sobrecompra, lo que sugiere posibles oportunidades de venta.
  • Los valores inferiores a -100 indican condiciones de sobreventa, lo que sugiere posibles oportunidades de compra.
  • En tendencias fuertes, el CCI puede superar los +200 o los -200, lo que indica un impulso extremo.

Commodity Channel Index (CCI)

Commodity Channel Index

Cabe señalar que cuando el Commodity Channel Index (CCI) cruza por debajo de -100 o por encima de +100, no significa necesariamente que se presente una oportunidad inmediata para entrar en una operación. A menudo, es esencial obtener la confirmación de otros indicadores o del análisis de la evolución de los precios antes de ejecutar una orden. Por ejemplo, en el ejemplo anterior, incluso después de que el CCI cruzara por debajo de -100, el precio siguió bajando varios pips más antes de invertir su dirección.

Este comportamiento no es exclusivo del CCI; se observan patrones similares con otros osciladores, como el oscilador estocástico, especialmente en torno a sus niveles umbral predefinidos. Aunque estas señales cruzadas pueden ser valiosas, confiar en ellas de forma aislada puede llevar a entradas prematuras. Un enfoque más sólido consiste en combinar las señales del oscilador con una confirmación técnica adicional para reforzar la toma de decisiones.

Estrategias de trading basadas en el CCI:  

  • Señales de sobrecompra/sobreventa: Una lectura del CCI superior a +100 puede indicar una posible venta, mientras que una lectura inferior a -100 puede indicar una compra. Los traders suelen esperar a que el CCI vuelva a cruzar por debajo de +100 o por encima de -100 para confirmar la señal.
  • Fortaleza de la tendencia: Un movimiento sostenido por encima de +100 sugiere una fuerte tendencia alcista, mientras que por debajo de -100 sugiere una fuerte tendencia bajista. Esto puede ayudar a los operadores a mantenerse en las tendencias durante más tiempo.
  • Divergencia: Al igual que el RSI, el CCI puede señalar posibles reversiones a través de la divergencia, como cuando el precio alcanza nuevos máximos mientras que el CCI alcanza máximos más bajos, lo que indica un debilitamiento del impulso.
  • Cruces: Algunos operadores utilizan los cruces del CCI con la línea cero como señales de tendencia, donde los cruces al alza indican un impulso alcista y los cruces a la baja indican un impulso bajista.

Ejemplo de aplicación:

Si el CCI supera los +100, podría indicar una fuerte tendencia alcista, pero los operadores deben estar atentos a un posible cambio de tendencia si el CCI comienza a descender y vuelve a situarse por debajo de +100. Del mismo modo, un CCI por debajo de -100 podría indicar una oportunidad de compra si comienza a subir y cruza por encima de -100.

Oscilador estocástico

El oscilador estocástico es un indicador basado en el impulso diseñado para resaltar posibles puntos de inflexión en el comportamiento del mercado mediante la comparación del precio de cierre de un valor con su rango de cotización reciente. A menudo se establece en una ventana de 14 períodos, y es especialmente eficaz para detectar condiciones de sobrecompra y sobreventa. Al centrarse en la tasa de variación de los precios, su objetivo es señalar los cambios de tendencia antes de que se produzcan.

Esta potente herramienta fue introducida por George Lane en la década de 1950, y sus principios siguen guiando a los operadores que buscan indicios tempranos de cambios en el impulso del mercado.

Cálculo:

El oscilador estocástico consta de dos líneas: %K (línea rápida) y %D (línea lenta). La línea %K se calcula como:

Donde:

Cierre = Precio de cierre actual.
Mínimo más bajo = Mínimo más bajo durante el período especificado.
Máximo más alto = Máximo más alto durante el período especificado.

La línea %D es una media móvil de %K, normalmente una media móvil simple de 3 períodos, para suavizar las fluctuaciones.

Niveles clave e interpretación:  

  • El oscilador estocástico oscila entre 0 y 100.
  • Los valores superiores a 80 se consideran sobrecomprados, lo que sugiere posibles oportunidades de venta.
  • Los valores inferiores a 20 se consideran sobrevendidos, lo que sugiere posibles oportunidades de compra.
  • La línea %D actúa como una línea de señal, y los cruces de %K y %D proporcionan señales de trading.

Oscilador estocástico

Oscilador estocástico

Estrategias de trading basadas en el estocástico:  

  • Señales de sobrecompra/sobreventa: Los operadores buscan que el %K supere el 20 como una posible señal de compra, lo que indica que el activo está saliendo del territorio de sobreventa. Por el contrario, cruzar por debajo de 80 puede indicar una venta, lo que indica condiciones de sobrecompra.
  • Cruces: Una señal alcista ocurre cuando %K cruza por encima de %D, especialmente en territorio de sobreventa (por debajo de 20). Una señal bajista ocurre cuando %K cruza por debajo de %D, especialmente en territorio de sobrecompra (por encima de 80).
  • Divergencia: El estocástico puede señalar posibles reversiones a través de la divergencia, como una divergencia alcista cuando el precio hace mínimos más bajos, pero %K hace mínimos más altos, lo que indica un debilitamiento del impulso bajista.
  • Confirmación de tendencia: En una tendencia alcista, el estocástico generalmente debería mantenerse por encima de 50, mientras que en una tendencia bajista, debería mantenerse por debajo de 50, lo que ayuda a confirmar la dirección de la tendencia.

Ejemplo de aplicación:

Si %K cruza por encima de %D mientras ambos están por debajo de 20, podría indicar una compra fuerte, especialmente si está acompañado de otras señales alcistas como una ruptura por encima de un nivel de resistencia. Por el contrario, si %K cruza por debajo de %D mientras está por encima de 80, podría indicar una venta, lo que indica una posible reversión de las condiciones de sobrecompra.

Moving Average Convergence/Divergence (MACD)

El MACD es un indicador de impulso que sigue la tendencia y se utiliza ampliamente para comparar las tendencias de precios a corto y largo plazo mediante el análisis de la diferencia entre dos medias móviles exponenciales (EMA). Ayuda a detectar cambios en el impulso del mercado, la dirección de las tendencias y los posibles puntos de entrada o salida, lo que lo convierte en un componente valioso de muchos sistemas técnicos de negociación.

Desarrollado por Gerald Appel a finales de la década de 1970, el MACD sigue siendo una de las herramientas más fiables entre los operadores para identificar la fuerza de las tendencias y los posibles cambios de tendencia.

Cálculo:

El MACD se calcula restando la EMA de 26 períodos de la EMA de 12 períodos:

A continuación, se traza una EMA de 9 períodos de la línea MACD como «línea de señal». La diferencia entre la línea MACD y la línea de señal se muestra a menudo como un histograma, que representa visualmente la fuerza del impulso.

Niveles clave e interpretación:  

  • El MACD oscila alrededor de cero, sin límites superiores ni inferiores.
  • Un valor MACD positivo indica un impulso alcista, mientras que un valor negativo indica un impulso bajista.
  • Los cruces de la línea MACD y la línea de señal proporcionan señales de trading: alcistas cuando la MACD cruza por encima de la línea de señal, bajistas cuando lo hace por debajo.
  • Los cruces por encima del cero también son significativos: un cruce por encima del cero indica una posible tendencia alcista, mientras que un cruce por debajo indica una posible tendencia bajista.

Moving Average Convergence/Divergence (MACD)

Moving Average Convergence/Divergence (MACD)

Estrategias de trading basadas en MACD:  

  • Cruces: Los traders compran cuando la línea MACD cruza por encima de la línea de señal, lo que indica un impulso alcista, y venden cuando cruza por debajo, lo que indica un impulso bajista.
  • Cruce de línea cero: Un cruce de MACD por encima de cero sugiere una posible tendencia alcista, mientras que un cruce por debajo sugiere una tendencia bajista, lo cual es útil para confirmar la tendencia.
  • Análisis del histograma: La altura del histograma refleja la fuerza del impulso. Un histograma que se ensancha indica un impulso creciente, mientras que un histograma que se estrecha sugiere una desaceleración del impulso, lo que podría indicar una reversión.
  • Divergencia: El MACD puede señalar posibles reversiones a través de la divergencia, como una divergencia alcista cuando el precio hace mínimos más bajos, pero el MACD hace mínimos más altos, lo que indica un debilitamiento del impulso bajista.

Ejemplo de aplicación:

Si la línea MACD cruza por encima de la línea de señal y el histograma se ensancha, podría indicar una compra, especialmente si va acompañado de una ruptura por encima de un nivel de resistencia clave. Por el contrario, si la línea MACD cruza por debajo de la línea de señal y el histograma se estrecha, podría indicar una venta, lo que indica una posible reversión.

Indicador Objetivo Niveles clave Señales principales Mejor aplicación
RSI Mide el impulso e identifica condiciones de sobrecompra/sobreventa >70 (sobrecompra), <30 (sobreventa), 50 (punto medio) Cruce por encima de 30 (compra), cruce por debajo de 70 (venta), divergencias, oscilaciones fallidas Mercados con rangos de precios limitados
CCI Identifica giros cíclicos y fuerza de tendencias >+100 (sobrecompra), <-100 (sobreventa), línea cero Cruce por encima de +100 (venta), cruce por debajo de -100 (compra), divergencias, cruces de línea cero Mercados en tendencia
Estocástico Mide el impulso e identifica posibles reversiones >80 (sobrecompra), <20 (sobreventa) Cruces %K/%D (comprar cuando %K cruza por encima de %D por debajo de 20, vender cuando está por debajo de %D por encima de 80), divergencias Mercados laterales y con tendencia
MACD Indicador de seguimiento de tendencias y de impulso Línea cero, cruces de líneas de señal La línea MACD cruza por encima de la línea de señal (compra), por debajo de la línea de señal (venta), cruces de línea cero, cambios en el histograma Mercados en tendencia
Hemos explorado información más profunda sobre algunos de los indicadores más utilizados y, en el siguiente paso, profundizaremos en el código para comprender cómo se implementan estos conceptos en detalle.



Implementación

Los valores indicadores incorporados para el símbolo y el período de tiempo que se muestran en el gráfico activo se pueden obtener a través de una secuencia de tres pasos: “manejar → búfer → liberar”. En primer lugar, se crea un controlador de indicador llamando a la función MQL5 relevante (como iRSI o iMACD), omitiendo los parámetros explícitos de símbolo y marco de tiempo para que se utilice el contexto del gráfico. A continuación, se invoca CopyBuffer en ese controlador para extraer los últimos valores de uno o más de los buffers de salida del indicador. Finalmente, se llama a IndicatorRelease para liberar el identificador y los recursos asociados. Encapsular estos pasos dentro de una rutina auxiliar garantiza una recuperación eficiente y a pedido de RSI, MACD, estocástico, CCI o cualquier otro indicador estándar sin generar ventanas de gráficos adicionales.

Los siguientes pasos describen el proceso de integración de la función Indicator Insights en News Headline EA y brindan una demostración práctica de cómo trabajar con indicadores integrados utilizando MQL5.

Integración de información sobre indicadores en el EA

1. Declaración de entradas de usuario

Al mostrar InpSeparateLanes e InpInsightSpeed junto con el resto de entradas, permite al operador elegir si desea ver una sola línea desplazable con indicadores combinados.

input bool   InpSeparateLanes    = false; // combined vs separate insights
input int    InpInsightSpeed     = 3;     // scroll speed for insight text

2. Globales y manejadores de lienzo

Declaramos por adelantado tanto los lienzos combinados como los individuales. Sus desplazamientos impulsan la animación. En MQL5, los controladores de lienzo deben persistir globalmente para que sobrevivan a las devoluciones de llamadas del temporizador. Al organizar estos controladores junto con otras variables de estado (como el ancho del gráfico y las marcas de tiempo de recarga), mantenemos todos los estados de las marcas cruzadas en un solo lugar.

//--- Globals ---------------------------------------------
CCanvas   combinedCanvas;        // holds all four insights in one lane
CCanvas   rsiCanvas, stochCanvas, macdCanvas, cciCanvas;  // separate lanes
int       offCombined, offRSI, offStoch, offMACD, offCCI;

3. Ayudantes para el cálculo de indicadores

Cada función auxiliar sigue un patrón «manejo → búfer → liberación», lo que garantiza que creamos cada indicador solo una vez por tick, leemos el último valor y liberamos inmediatamente los recursos del sistema. Centralizar el formato aquí mantiene el ciclo de dibujo principal limpio y con buen rendimiento. La combinación de cuatro señales en una sola cadena para el modo de carril combinado simplifica aún más la lógica de renderizado.

//+------------------------------------------------------------------+
//| Compute indicator insights                                       |
//+------------------------------------------------------------------+
string ComputeRSIInsight()
{
  int h=iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE);
  if(h==INVALID_HANDLE) return "["+Symbol()+"] RSI err";
  double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h);
  double v=b[0]; string s=DoubleToString(v,1);
  string m=v<30?"Oversold("+s+")":v>70?"Overbought("+s+")":"Neutral("+s+")";
  return "["+Symbol()+"] RSI:"+m;
}

string ComputeStochInsight()
{
  int h=iStochastic(NULL,PERIOD_CURRENT,14,3,3,MODE_SMA,STO_LOWHIGH);
  if(h==INVALID_HANDLE) return "["+Symbol()+"] Stoch err";
  double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h);
  double v=b[0]; string s=DoubleToString(v,1);
  string m=v<20?"Oversold("+s+")":v>80?"Overbought("+s+")":"Neutral("+s+")";
  return "["+Symbol()+"] Stoch:"+m;
}

string ComputeMACDInsight()
{
  int h=iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE);
  if(h==INVALID_HANDLE) return "["+Symbol()+"] MACD err";
  double m[],g[]; CopyBuffer(h,0,1,1,m); CopyBuffer(h,1,1,1,g); IndicatorRelease(h);
  double d=m[0]-g[0]; string s=DoubleToString(d,2);
  string m2=d>0?"Bull("+s+")":d<0?"Bear("+s+")":"Neu(0)";
  return "["+Symbol()+"] MACD:"+m2;
}

string ComputeCCIInsight()
{
  int h=iCCI(NULL,PERIOD_CURRENT,14,PRICE_TYPICAL);
  if(h==INVALID_HANDLE) return "["+Symbol()+"] CCI err";
  double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h);
  double v=b[0]; string s=DoubleToString(v,1);
  string m=v<-100?"Oversold("+s+")":v>100?"Overbought("+s+")":"Neutral("+s+")";
  return "["+Symbol()+"] CCI:"+m;
}

string ComputeAllInsights()
{
  return ComputeRSIInsight() + "  |  " +
         ComputeStochInsight() + "  |  " +
         ComputeMACDInsight() + "  |  " +
         ComputeCCIInsight();
}

4. Creación de lienzo en OnInit

En OnInit, cableamos nuestros nuevos carriles. En el modo de carriles separados, inicializamos cuatro lienzos; en el modo de carriles combinados, solo uno, con una etiqueta estática «Indicador Insights:». Al llamar a una actualización inicial, se garantiza que, incluso antes del primer tic del temporizador, los operadores vean el contexto, un detalle importante para la usabilidad al cargar asesores expertos grandes.

int OnInit()
{
  // … existing canvases for events & news …

  if(InpSeparateLanes)
  {
    rsiCanvas.CreateBitmapLabel("RsiC",0,0,canvW,lineH);
    stochCanvas.CreateBitmapLabel("StoC",0,0,canvW,lineH);
    macdCanvas.CreateBitmapLabel("MacC",0,0,canvW,lineH);
    cciCanvas.CreateBitmapLabel("CciC",0,0,canvW,lineH);
    // set transparency…
  }
  else
  {
    combinedCanvas.CreateBitmapLabel("AllC",0,0,canvW,lineH);
    combinedCanvas.TransparentLevelSet(120);
    // static label at x=5: “Indicator Insights:”
    combinedCanvas.FontSizeSet(-120);
    combinedCanvas.TextOut(5, (lineH-combinedCanvas.TextHeight("Indicator Insights:"))/2,
                           "Indicator Insights:", XRGB(200,200,255), ALIGN_LEFT);
    combinedCanvas.Update(true);
  }

  // … remainder of OnInit …
}

5. Lógica de desplazamiento en OnTimer

Este es el ritmo cardíaco del EA: cada tic del temporizador reposiciona los lienzos, recarga datos, maneja cualquier cambio de tamaño de gráfico y luego ejecuta un ciclo de cálculo y dibujo para cada carril, ya sean eventos, noticias o indicadores. Al agrupar todas las llamadas de actualización al final, minimizamos el parpadeo y mantenemos el desplazamiento perfectamente sincronizado entre las capas. Una función auxiliar para encapsular los desplazamientos mantiene el código limpio y evita repeticiones innecesarias.

//+------------------------------------------------------------------+
//| OnTimer: redraw                                                  |
//+------------------------------------------------------------------+
void OnTimer()
{
  // reposition canvases
  SetCanvas("EvC",InpPositionTop,InpTopOffset);
  SetCanvas("NwC",InpPositionTop,InpTopOffset+3*lineH);

  if(InpSeparateLanes)
  {
    SetCanvas("RsiC",InpPositionTop,InpTopOffset+4*lineH);
    SetCanvas("StoC",InpPositionTop,InpTopOffset+5*lineH);
    SetCanvas("MacC",InpPositionTop,InpTopOffset+6*lineH);
    SetCanvas("CciC",InpPositionTop,InpTopOffset+7*lineH);
  }
  else
  {
    SetCanvas("AllC",InpPositionTop,InpTopOffset+4*lineH);
  }

  // refresh data
  ReloadEvents();
  FetchAlphaVantageNews();

  // resize if needed
  int wNew=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
  if(wNew!=canvW)
  {
    canvW=wNew;
    ObjectSetInteger(0,"EvC",OBJPROP_WIDTH,canvW);
    ObjectSetInteger(0,"NwC",OBJPROP_WIDTH,canvW);
    if(InpSeparateLanes)
    {
      ObjectSetInteger(0,"RsiC",OBJPROP_WIDTH,canvW);
      ObjectSetInteger(0,"StoC",OBJPROP_WIDTH,canvW);
      ObjectSetInteger(0,"MacC",OBJPROP_WIDTH,canvW);
      ObjectSetInteger(0,"CciC",OBJPROP_WIDTH,canvW);
    }
    else
    {
      ObjectSetInteger(0,"AllC",OBJPROP_WIDTH,canvW);
    }
  }

  // draw events
  DrawAll();

  // draw news
  newsCanvas.Erase(ARGB(170,0,0,0));
  string nt = totalNews>0?newsHeadlines[0]:placeholder;
  newsCanvas.TextOut(offNews,(lineH-newsCanvas.TextHeight(nt))/2,
                     nt,XRGB(255,255,255),ALIGN_LEFT);
  offNews-=InpNewsSpeed;
  if(offNews+newsCanvas.TextWidth(nt)<-20) offNews=canvW;

  // draw insights
  if(InpSeparateLanes)
  {
    string t;
    t=ComputeRSIInsight();
    rsiCanvas.Erase(ARGB(120,0,0,0));
    rsiCanvas.TextOut(offRSI,(lineH-rsiCanvas.TextHeight(t))/2,
                      t,XRGB(180,220,255),ALIGN_LEFT);
    offRSI-=InpInsightSpeed;
    if(offRSI+rsiCanvas.TextWidth(t)<-20) offRSI=canvW;

    t=ComputeStochInsight();
    stochCanvas.Erase(ARGB(120,0,0,0));
    stochCanvas.TextOut(offStoch,(lineH-stochCanvas.TextHeight(t))/2,
                        t,XRGB(180,220,255),ALIGN_LEFT);
    offStoch-=InpInsightSpeed;
    if(offStoch+stochCanvas.TextWidth(t)<-20) offStoch=canvW;

    t=ComputeMACDInsight();
    macdCanvas.Erase(ARGB(120,0,0,0));
    macdCanvas.TextOut(offMACD,(lineH-macdCanvas.TextHeight(t))/2,
                       t,XRGB(180,220,255),ALIGN_LEFT);
    offMACD-=InpInsightSpeed;
    if(offMACD+macdCanvas.TextWidth(t)<-20) offMACD=canvW;

    t=ComputeCCIInsight();
    cciCanvas.Erase(ARGB(120,0,0,0));
    cciCanvas.TextOut(offCCI,(lineH-cciCanvas.TextHeight(t))/2,
                      t,XRGB(180,220,255),ALIGN_LEFT);
    offCCI-=InpInsightSpeed;
    if(offCCI+cciCanvas.TextWidth(t)<-20) offCCI=canvW;
  }
  else
  {
    combinedCanvas.Erase(ARGB(120,0,0,0));
    string txt=ComputeAllInsights();
    combinedCanvas.TextOut(offCombined,(lineH-combinedCanvas.TextHeight(txt))/2,
                           txt,XRGB(180,220,255),ALIGN_LEFT);
    offCombined-=InpInsightSpeed;
    if(offCombined+combinedCanvas.TextWidth(txt)<100) offCombined=canvW;
  }

  // batch update
  eventsCanvas.Update(true);
  newsCanvas.  Update(true);
  if(InpSeparateLanes)
  {
    rsiCanvas.  Update(true);
    stochCanvas.Update(true);
    macdCanvas. Update(true);
    cciCanvas.  Update(true);
  }
  else
  {
    combinedCanvas.Update(true);
  }
}

6. Limpieza en OnDeinit

Un desmontaje adecuado evita mapas de bits huérfanos y temporizadores persistentes. Cada CreateBitmapLabel en OnInit se corresponde con un Destroy más ObjectDelete en OnDeinit, y el temporizador se cancela para evitar devoluciones de llamadas perdidas. La eliminación explícita de cualquier objeto dinámico (como instancias de eventos) completa una fase de limpieza sólida.

//+------------------------------------------------------------------+
//| OnDeinit: cleanup                                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  EventKillTimer();
  eventsCanvas.Destroy(); ObjectDelete(0,"EvC");
  newsCanvas.Destroy();   ObjectDelete(0,"NwC");
  if(InpSeparateLanes)
  {
    rsiCanvas.Destroy();  ObjectDelete(0,"RsiC");
    stochCanvas.Destroy();ObjectDelete(0,"StoC");
    macdCanvas.Destroy(); ObjectDelete(0,"MacC");
    cciCanvas.Destroy();  ObjectDelete(0,"CciC");
  }
  else
  {
    combinedCanvas.Destroy();ObjectDelete(0,"AllC");
  }
  for(int i=0;i<ArraySize(highArr);i++) delete highArr[i];
  for(int i=0;i<ArraySize(medArr);i++)   delete medArr[i];
  for(int i=0;i <ArraySize(lowArr);i++)   delete lowArr[i];
  ArrayResize(newsHeadlines,0);
}

 Al integrar adecuadamente los nuevos componentes con el código existente del artículo anterior, ahora tenemos una versión mejorada de nuestro programa que incluye información de indicadores en tiempo real. En la siguiente sección, presentaremos los resultados de las pruebas de estas características recientemente agregadas, seguidos de un resumen de las conclusiones y puntos clave del proceso de desarrollo.


Pruebas

En MetaTrader 5, puede probar el EA arrastrándolo a un gráfico desde la sección Asesores Expertos en el panel Navegador. A partir de la versión 1.04, News Headline EA ahora incluye información de indicadores integrados. La imagen a continuación ilustra cómo cambiar entre la vista de carril único predeterminada y la vista de carril separado a través de la configuración de entrada del EA. Tenga en cuenta que la clave API se dejó en blanco intencionalmente por razones de seguridad y debe ingresarse manualmente antes de su uso.

Pon a prueba los indicadores de conocimientos combinados y carriles separados.

Probando las nuevas funciones

Una vez que se agrega la clave API de Alpha Vantage, los titulares de las noticias se mostrarán junto con nuestros indicadores recientemente integrados, como se muestra a continuación.

News Headline EA con información sobre los indicadores.

News Headline EA con información sobre los indicadores

Probé el EA utilizando el Probador de estrategias y, aunque se mostraban los carriles del lienzo, aparecían sin datos. Probablemente esto se deba a que la información necesaria, como las noticias y los valores de los indicadores, debe consultarse en tiempo real, algo que el evaluador no admite por completo.


Conclusión

Para resumir, hemos logrado hacer realidad nuestra idea. Demostramos la viabilidad de crear una herramienta integrada en gráficos que ofrece información comercial esencial (eventos del calendario económico, titulares de noticias financieras y conocimientos de indicadores basados en reglas), todo dentro de una interfaz compacta y visualmente accesible.

La inclusión de información sobre indicadores es particularmente valiosa para los traders, ya que proporciona un contexto inmediato de las condiciones del mercado, ayudando a los usuarios a tomar decisiones informadas sin tener que cambiar entre múltiples ventanas de indicadores o gráficos. Esto mejora la eficiencia y conserva valioso espacio en la pantalla.

Desde una perspectiva de desarrollo, profundizamos nuestra comprensión de cómo recuperar y manipular datos de los indicadores integrados de MetaTrader 5 utilizando la API MQL5. Al aprovechar la flexibilidad de la clase CCanvas, pudimos presentar esos datos en un formato visualmente distinto y optimizado, mejorando la experiencia del usuario. Este proyecto demostró el poder de la personalización de la interfaz programática en MQL5 y también allanó el camino para futuras mejoras (como información de analistas o integraciones de indicadores definidos por el usuario) que podrían elevar aún más la utilidad de la herramienta.

A continuación he preparado una tabla resumen que destaca las lecciones clave aprendidas de este debate. También encontrará el código fuente completo adjunto al final del artículo. Le invitamos a unirse a la conversación compartiendo sus ideas y opiniones en los comentarios: ¡su aporte es muy valioso!



Conclusiones clave

Lección Descripción
Separación de preocupaciones El uso de lienzos diferenciados para eventos, noticias e indicadores mejora la modularidad del código y permite un diseño y estilo flexibles.
Uso de CCanvas Permite una representación fluida de texto y gráficos personalizados en el gráfico, lo que permite mejoras únicas en la interfaz más allá de los objetos predeterminados de MetaTrader 5.
Lógica de la animación de desplazamiento La gestión de variables de desplazamiento ayuda a crear elementos de texto con desplazamiento horizontal fluido, ideales para pantallas dinámicas como fuentes de noticias y resúmenes de indicadores.
Evitar la duplicación de código Crear funciones auxiliares como SetCanvas mantiene el código limpio, reutilizable y más fácil de mantener, ya que evita la repetición.
Integración de API El uso de WebRequest para obtener datos externos muestra cómo MetaTrader 5 puede ampliarse con servicios de terceros, como proveedores de noticias financieras.
Restricciones de datos en tiempo real Los datos en tiempo real, como los acontecimientos económicos y las noticias del mercado, suelen requerir un acceso en tiempo real, lo que puede no funcionar en el entorno del Strategy Tester.
Uso de indicadores integrados El acceso y la interpretación de los buffers a partir de indicadores estándar como RSI, MACD y CCI permiten generar información automatizada directamente dentro del código.
Diseño de interfaz de usuario compacta La consolidación de múltiples flujos de datos en una sola línea desplazable ayuda a reducir el desorden en los gráficos y, al mismo tiempo, proporciona toda la información esencial en un solo lugar.
Posicionamiento dinámico del lienzo El reposicionamiento de los objetos del lienzo en función de las preferencias del usuario y las dimensiones del gráfico garantiza un diseño adaptable y con capacidad de respuesta.
Control de versiones y seguimiento de características Mantener números de versión claros ayuda a realizar un seguimiento de los cambios, documentar el progreso y comunicar las actualizaciones de manera eficaz a los usuarios y desarrolladores.


Archivos adjuntos

Archivo Versión Descripción 
News Headline EA.mq5 1.04 Asesor experto que muestra los eventos del calendario económico y los titulares de noticias del mercado en tiempo real directamente en el gráfico utilizando el lienzo MQL5 integrado y la API Alpha Vantage, además de información técnica sobre los indicadores.

Volver al índice

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/18528

Archivos adjuntos |
Utilizando redes neuronales en MetaTrader Utilizando redes neuronales en MetaTrader
En el artículo se muestra la aplicación de las redes neuronales en los programas de MQL, usando la biblioteca de libre difusión FANN. Usando como ejemplo una estrategia que utiliza el indicador MACD se ha construido un experto que usa el filtrado con red neuronal de las operaciones. Dicho filtrado ha mejorado las características del sistema comercial.
Envío de mensajes desde MQL5 a Discord: creación de un bot Discord–MetaTrader 5 Envío de mensajes desde MQL5 a Discord: creación de un bot Discord–MetaTrader 5
Al igual que Telegram, Discord es capaz de recibir información y mensajes en formato JSON utilizando sus API de comunicación. En este artículo, vamos a explorar cómo se pueden utilizar las API de Discord para enviar señales de trading y actualizaciones desde MetaTrader 5 a su comunidad de trading en Discord.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
De novato a experto: Noticias animadas utilizando MQL5 (II) De novato a experto: Noticias animadas utilizando MQL5 (II)
Hoy damos un paso más adelante al integrar una API de noticias externa como fuente de titulares para nuestro EA News Headline. En esta fase, exploraremos diversas fuentes de noticias, tanto consolidadas como emergentes, y aprenderemos a acceder a sus API de forma eficaz. También abordaremos métodos para analizar los datos recuperados en un formato optimizado para su visualización en nuestro Asesor Experto. Únase al debate mientras exploramos las ventajas de acceder a los titulares de noticias y al calendario económico directamente en el gráfico, todo ello dentro de una interfaz compacta y no intrusiva.