Guardar la imagen de un gráfico

En los programas MQL, a menudo se hace necesario documentar el estado actual del propio programa y del entorno de trading. Por regla general, para ello se utiliza la salida de diversos indicadores analíticos o financieros al diario, pero algunas cosas se representan más claramente con la imagen del gráfico; por ejemplo, en el momento de la transacción. La API de MQL5 incluye una función que permite guardar la imagen de un gráfico en un archivo.

bool ChartScreenShot(long chartId, string filename, int width, int height,
ENUM_ALIGN_MODE alignment = ALIGN_RIGHT)

La función toma una instantánea del gráfico especificado en formato GIF, PNG o BMP dependiendo de la extensión en la línea con el nombre del archivo filename (máximo 63 caracteres). La captura de pantalla se coloca en el directorio MQL5/Files.

Los parámetros width y height establecen la anchura y la altura de la imagen en píxeles.

El parámetro alignment influye en qué parte del gráfico se incluirá en el archivo. El valor ALIGN_RIGHT (por defecto) significa que la instantánea se toma para los precios más recientes (esto puede concebirse como que el terminal hace una transición silenciosamente al pulsar End antes de la instantánea). El valor ALIGN_LEFT garantiza que las barras aparezcan en la imagen, empezando por la primera barra visible a la izquierda en ese momento. Por lo tanto, si necesita hacer una captura de pantalla de un gráfico desde una posición determinada, primero debe posicionar el gráfico manualmente o con ayuda de la función ChartNavigate.

La función ChartScreenShot devuelve true en caso de éxito.

Vamos a probar la función en el script ChartPanorama.mq5. Su tarea es guardar una copia del gráfico desde la barra visible a la izquierda hasta la hora actual. Desplazando primero el inicio del gráfico hasta la profundidad deseada del historial se puede obtener un panorama bastante extenso. En este caso, no es necesario pensar qué ancho de imagen elegir. No obstante, tenga en cuenta que un historial demasiado largo requerirá una imagen enorme, que podría superar las capacidades del formato gráfico o del software.

La altura de la imagen se determinará automáticamente igual a la altura actual del gráfico.

void OnStart()
{
   // the exact width of the price scale is not known, we take it empirically
   const int scale = 60;
   
   // calculating the total height, including gaps between windows
   const int w = (int)ChartGetInteger(0CHART_WINDOWS_TOTAL);
   int height = 0;
   int gutter = 0;
   for(int i = 0i < w; ++i)
   {
      if(i == 1)
      {
         gutter = (int)ChartGetInteger(0CHART_WINDOW_YDISTANCEi) - height;
      }
      height += (int)ChartGetInteger(0CHART_HEIGHT_IN_PIXELSi);
   }
   
   Print("Gutter="gutter", total="gutter * (w - 1));
   height += gutter * (w - 1);
   Print("Height="height);
   
   // calculate the total width based on the number of pixels in one bar,
   // and also including chart offset from the right edge and scale width
   const int shift = (int)(ChartGetInteger(0CHART_SHIFT) ?
      ChartGetDouble(0CHART_SHIFT_SIZE) * ChartGetInteger(0CHART_WIDTH_IN_PIXELS) / 100 : 0);
   Print("Shift="shift);
   const int pixelPerBar = (int)MathRound(1.0 * ChartGetInteger(0CHART_WIDTH_IN_PIXELS)
      / ChartGetInteger(0CHART_WIDTH_IN_BARS));
   const int width = (int)ChartGetInteger(0CHART_FIRST_VISIBLE_BAR) * pixelPerBar + scale + shift;
   Print("Width="width);
   
   // write a file with a picture in PNG format
   const string filename = _Symbol + "-" + PeriodToString() + "-panorama.png";
   if(ChartScreenShot(0filenamewidthheightALIGN_LEFT))
   {
      Print("File saved: "filename);
   }
}

También podríamos utilizar el modo ALIGN_RIGHT, pero entonces tendríamos que forzar la desactivación del desplazamiento desde el borde derecho, ya que se recalcula para la imagen, dependiendo de su tamaño, y el resultado será completamente diferente a como se ve en la pantalla (la sangría a la derecha se hará demasiado grande, ya que se especifica como un porcentaje de la anchura).

A continuación se muestra un ejemplo del registro después de ejecutar el script en el gráfico XAUUSD,H1.

Gutter=2, total=2
Height=440
Shift=74
Width=2086
File saved: XAUUSD-H1-panorama.png

Teniendo en cuenta la navegación a un historial no muy lejano, se obtuvo la siguiente captura de pantalla (representada como una copia reducida 4 veces):

Panorama del gráfico

Panorama del gráfico