Evento de cambio de gráfico

Al cambiar el tamaño del gráfico, los modos de visualización de precios, la escala u otros parámetros, el terminal envía el evento CHARTEVENT_CHART_CHANGE, que no tiene parámetros. El programa MQL debe averiguar los cambios por sí mismo utilizando llamadas a la función ChartGet.

Ya hemos utilizado este evento en el ejemplo de ChartModeMonitor.mq5 en la sección sobre Modos de visualización de gráficos. Veamos ahora otro ejemplo:

Como sabe, MetaTrader 5 permite guardar la captura de pantalla del gráfico actual en un archivo de un tamaño especificado (el comando Guardar como imagen del menú contextual). No obstante, este método de obtener una captura de pantalla no es adecuado para todos los casos. En concreto, si necesita una imagen con una información sobre herramientas, o cuando un objeto del tipo campo de entrada está activo (cuando el texto está seleccionado dentro del campo y el cursor de texto está visible), el comando estándar no le ayudará, ya que vuelve a formar la imagen del gráfico sin tener en cuenta estos y algunos otros matices del estado actual de la ventana.

La única alternativa para obtener una copia exacta de la ventana es utilizar medios externos al terminal (por ejemplo, la tecla PrtSc a través del portapapeles de Windows), pero este método no garantiza el tamaño de ventana requerido. Para no tener que seleccionar el tamaño por el método de ensayo y error o con algunos programas adicionales, crearemos un indicador EventWindowSizer.mq5, que seguirá la configuración de tamaño del usuario sobre la marcha y mostrará el valor actual en un comentario.

Todo el trabajo se realiza en el manejador OnChartEvent, comenzando con la comprobación del ID del evento para CHARTEVENT_CHART_CHANGE. Las dimensiones de la ventana en píxeles pueden obtenerse utilizando las propiedades CHART_WIDTH_IN_PIXELS y CHART_HEIGHT_IN_PIXELS. Sin embargo, éstas devuelven las dimensiones sin tener en cuenta los bordes, y normalmente se desean bordes para una captura de pantalla. Por lo tanto, mostraremos en el comentario no sólo los valores de la propiedad (marcados con la palabra «Pantalla»), sino también los valores corregidos (marcados con la palabra «Imagen»): deben añadirse 2 píxeles en anchura y 1 píxel en vertical (estas son las características de la renderización de ventanas en el terminal).

void OnChartEvent(const int idconst long &lparamconst double &dparamconst string &sparam)
{
   if(id == CHARTEVENT_CHART_CHANGE)
   {
      const int w = (int)ChartGetInteger(0CHART_WIDTH_IN_PIXELS);
      const int h = (int)ChartGetInteger(0CHART_HEIGHT_IN_PIXELS);
      // "Raw" sizes "as is" are displayed with the "Screen" mark,
      // correction for (-2,-1) is needed to include frames - it is displayed with the "Picture" mark,
      // correction for (-54,-22) is needed to include scales - it is displayed with "Including scales" flag.
      Comment(StringFormat("Screen: %d x %d\nPicture: %d x %d\nIncluding scales: %d x %d",
         whw + 2h + 1w + 2 + 54h + 1 + 22));
   }
}

Además, los valores obtenidos no tienen en cuenta las escalas de hora y precio. Si éstas también deben tenerse en cuenta en el tamaño de la captura de pantalla, entonces también debe hacerse un ajuste para su tamaño. Por desgracia, la API de MQL5 no proporciona ninguna forma de averiguar estos tamaños, por lo que sólo podemos determinarlos empíricamente: para la configuración estándar de fuentes de Windows, la anchura de la escala de precios es de 54 píxeles, y la altura de la escala de tiempo es de 22 píxeles. Estas constantes pueden diferir para su versión de Windows, por lo que debe editarlas, o establecerlas utilizando parámetros de entrada.

Después de ejecutar el indicador en un gráfico, pruebe a cambiar el tamaño de la ventana y vea cómo cambian los números en el comentario.

Captura de pantalla de la ventana con información sobre herramientas y dimensiones actuales en el comentario
Ventana s

Captura de pantalla de la ventana con información sobre herramientas y tamaños actuales en el comentario