Discusión sobre el artículo "Estudiamos la clase CCanvas. Implementación de la transparencia de los objetos gráficos" - página 4

 
Artyom Trishkin:
MQL4 ;)

No doy la bienvenida a MQL4. Todos los ejemplos son sólo en MQL5.

//+------------------------------------------------------------------+
//|Prueba.mq5
//|Derechos de autor © 2016, Vladimir Karputov ||
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
CCanvas     m_canvas;           // el objeto canvas
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime arr_time[];
   double   arr_open[];
   double   arr_close[];
   if(CopyTime(Symbol(),Period(),0,2,arr_time)==-1)
      return;
   if(CopyClose(Symbol(),Period(),0,2,arr_close)==-1)
      return;
   if(CopyOpen(Symbol(),Period(),0,2,arr_open)==-1)
      return;
   int x1,y1,x2,y2;
   if(!ChartTimePriceToXY(0,0,arr_time[0],arr_open[0],x1,y1))
      Print("Error ",GetLastError());
   if(!ChartTimePriceToXY(0,0,arr_time[1],arr_close[0],x2,y2))
      Print("Error ",GetLastError());
//x1 = Tiempo[1];
//y1 = Abierto[1];
//x2 = Tiempo[0];
//y2 = Cerrar[1];
   Print("arr_time[0]=",arr_time[0],", arr_open[0]=",arr_open[0]);
   m_canvas.CreateBitmapLabel("COLOR_FORMAT_ARGB_NORMALIZE",x1,y1,MathAbs(x2-x1),MathAbs(y2-y1),COLOR_FORMAT_ARGB_NORMALIZE);
   m_canvas.Erase(ColorToARGB(clrBlue,200));
   m_canvas.Update();
   Sleep(10000);
   m_canvas.Destroy();
  }
//+------------------------------------------------------------------+
//| Obtiene la anchura del gráfico (en píxeles)|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- prepara la variable para obtener el valor de la propiedad
   long result=-1;
//--- restablecer el valor de error
   ResetLastError();
//--- recibir el valor de la propiedad
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- mostrar el mensaje de error en el diario Experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- devuelve el valor de la propiedad del gráfico
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Obtiene la altura del gráfico (en píxeles) |||
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- prepara la variable para obtener el valor de la propiedad
   long result=-1;
//--- restablecer el valor de error
   ResetLastError();
//--- recibir el valor de la propiedad
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- mostrar el mensaje de error en el diario Experts
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- devuelve el valor de la propiedad del gráfico
   return((int)result);
  }
//+------------------------------------------------------------------+

Y el resultado de la secuencia de comandos:

resultado

 

Vladimir, una pregunta para ti como experto.

Hay un panel en forma de lienzo. Y luego las líneas de tendencia se dibujan en el gráfico. ¿Cómo ocultarlas detrás del lienzo?

Capturas de pantalla de la plataforma de negociación MetaTrader

RTS Splice, H1, 2016.10.16

JSC &#39;&#39;Otkritie Broker&#39;&#39;, MetaTrader 5, Demo

RTS Splice, H1, 2016.10.16, JSC ''Otkritie Broker'', MetaTrader 5, Demo


 
Dennis Kirichenko:

Vladimir, una pregunta para ti como experto.

Hay un panel en forma de lienzo. Y luego las líneas de tendencia se dibujan en el gráfico. ¿Cómo ocultarlas detrás del lienzo?


Por ejemplo, destruir el panel y dibujar de nuevo....
 
Sí, gracias. Hasta ahora se me ha ocurrido la idea de poner objetos en el fondo....
[Eliminado]  
Vladimir Karputov:
Gracias por el artículo. Lamentablemente, todos los enlaces a la documentación que contiene están rotos.
 
Alexey Kozitsyn:
Gracias por el artículo. Lamentablemente, todos los enlaces a la documentación que contiene están rotos.

Gracias por el mensaje - la ayuda ha sido reconstruida, de ahí los errores. Corregiremos los enlaces.

 
Vladimir Karputov:

Mediante la clase CCanvas?

P.D. Utiliza CCanvas.CreateBitmap:

Crea un recurso gráfico ligado a un objeto gráfico.

1. Crea un recurso gráfico en la ventana principal del gráfico actual.

bool CreateBitmap(
const string name, // nombre
const datetimetime, // hora
const doubleprecio, // precio
constintanchura, // anchura
const int altura, // altura
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// formato
);

De este modo podrás enlazar una esquina de un Canvas. Pero la anchura y la altura, de todos modos, se establecerán en píxeles.


¿Puedo escribir en ruso aquí?

Porque das instrucciones a uno, pero en realidad profesas un doble rasero.

 
Alexey Kozitsyn:
Gracias por el artículo. Lamentablemente, todos los enlaces a la documentación que contiene están rotos.
Los enlaces han sido corregidos. Gracias por el mensaje.
 
Alexey Petrov:
Los enlaces han sido corregidos. Gracias por el mensaje.

Sigue habiendo errores.

Párrafo de introducción:

...

Antes de empezar a dibujar directamente con la clase CCanvas, necesitas aprender algunas definiciones relacionadas con el manejo del color. Por ejemplo, qué es la transparencia y qué es un canal alfa.

...


Item "5.1 Crear un script "Illusion.mq5""

...

Dibuja un círculo pintado. El círculo se dibujará sobre el color con el que hemos rellenado el lienzo (canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));).

canvas_XRGB_NOALPHA.CreateBitmapLabel - Aquí hemos creado un recurso gráfico ligado al objeto gráfico.

Rellena todo el lienzo con color en formato ARGB con transparencia alpha

Texto de salida - tipo de procesamiento de imagen para este lienzo. Color del texto en formato ARGB con canal alfa igual a 255, es decir, el color del texto de salida.

Si queremos que todo lo dibujado se muestre en pantalla, necesitamos refrescar la pantalla.

Como hemos creado el recurso gráfico con un enlace al objeto gráfico ( método CreateBitmapLabel), borraremos el recurso utilizando el método Destroy().

...

 

Saludos chicos, me podeis decir como hacer el panel de información para que los iconos de las ofertas no se superpongan encima.

Parece que está en primer plano, todo se dibuja detrás, pero las ofertas están superpuestas encima.

void CreateEdit(long             chart_id,         // id del gráfico
                int              sub_window,       // número de ventana (subventana)
                string           name,             // nombre del objeto
                color            font_color,       // color de fuente
                int              x_size,           // anchura
                int              y_size,           // altura
                int              x_distance,       // Coordenada del eje X
                int              y_distance,       // Coordenada del eje Y
                long             z_order,          // prioridad
                color            background_color) // color de fondo 
  {
// Si el objeto fue creado con éxito, entonces...
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ...establecer sus propiedades
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // establecer el ángulo del gráfico
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // color de fuente
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // color de fondo
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // anchura
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // altura
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // fijar coordenada X
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // fijar la coordenada Y
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         // el objeto no puede seleccionarse si FALSE
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // prioridad del objeto
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // sólo lectura
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // alineación a la izquierda
      //--- mostrar en primer plano (false) o en segundo plano (true) 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // no tooltip if "\n".
     }
  }