Gráfica en MetaTrader 5: Canvas - dibujando dentro de un búfer con enlace a objetos

 

En el build 619 ha aparecido una nueva función, ResourceCreate para crear sobre la marcha recursos gráficos dinámicos.

Con su ayuda, ahora es posible crear cualquier imagen compleja en color de 32 bits, incluyendo el canal alfa, y fijarlos a los objetos en el gráfico.

Qué es lo que proporciona esto a los desarrolladores:

  • los programas pueden crear sobre la marcha interfaces vistosos sin necesidad de arrastrar consigo una gran cantidad de archivos

  • los archivos de recursos adicionales (no solo BMP y WAV) pueden ser añadidos directamente a los archivos EX5 con ayuda de la directiva #resource "nombre del archivo", pueden ser calculados durante su ejecución, modificados y puestos sobre los objetos

    en el próximo build estará disponible la función ResourceLoad(), que permitirá calcular los recursos fijados con anterioridad a un archivo EX5

  • controlando la transparencia con ayuda de los canales alfa, se puede colocar por encima del gráfico cualquier construcción analítica

    por ejemplo, es posible dibujar una nube transparente que prediga los caminos probables de los movimientos del mercado, gestionando el color y la saturación
  • dibujar todo lo que se quiera en la gráfica


Pronto añadiremos a la biblioteca estándar la clase CCanvas, que permite manejar fácilmente las imágenes, dibujándolas en su búfer y mostrándolas en el objeto enlazado.

Aquí tenemos un ejemplo sencillo de demostración del funcionamiento de esta clase (los archivos están adjuntos):

#include "Canvas.mqh"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   CCanvas can;
//---
   can.Create("MySpace",0,0,512,512,COLOR_FORMAT_ARGB_RAW);
   MathSrand(0);
//---
   for(int i=0;i<10000;i++)
     {
      can.FillRect(MathRand()&255,MathRand()&255,256+(MathRand()&255),256+(MathRand()&255),XRGB(MathRand(),MathRand(),MathRand()));
      can.Circle(MathRand()&511,MathRand()&511,MathRand()&127,XRGB(MathRand(),MathRand(),MathRand()));
      can.Triangle(MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,XRGB(MathRand(),MathRand(),MathRand()));
      //---
      can.Update();
     }
//---
  }




Razón de la queja: