Prueba CGraphic - preguntas y sugerencias

 

Buscando aplicaciones para nuevas funciones - en particular para la biblioteca Grahic (gráficos científicos).

Por ejemplo, seleccionamos un área en un gráfico utilizando un objeto rectángulo y ejecutamos el script:

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string   rectangle_name="RECTANGLE";   // rectangle name
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int result_find=ObjectFind(0,rectangle_name);
   Print("result_find: ",result_find);
   if(result_find!=-1)
     {
      datetime from  = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
      datetime to    = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
      MqlTick tick_array_range[];   // массив для приема тиков
      ResetLastError();
      CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
      Print("Error: ",GetLastError());
      if(GetLastError()!=0)
         return;

      double   arr_ask[];
      int size=ArraySize(tick_array_range);
      ArrayResize(arr_ask,size);
      for(int i=0;i<size;i++)
         arr_ask[i]=tick_array_range[i].ask;

      GraphPlot(arr_ask,1);
      m_graphic.Destroy();
      Sleep(sleeping);
      ObjectsDeleteAll(0,"Graphic",0,OBJ_BITMAP_LABEL);
      ChartRedraw();
     }
  }
//+------------------------------------------------------------------+

Como resultado, vemos un gráfico trazado por ticks, por Ask:

1

Archivos adjuntos:
 

Cuando intento utilizar el CGraphic.Crea, me sale un cuadrado de Malevich:

El cuadrado de Malevich

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string   rectangle_name="RECTANGLE";   // rectangle name
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int result_find=ObjectFind(0,rectangle_name);
   Print("result_find: ",result_find);
   if(result_find!=-1)
     {
      datetime from  = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
      datetime to    = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
      MqlTick tick_array_range[];   // массив для приема тиков
      ResetLastError();
      CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
      Print("Error: ",GetLastError());
      if(GetLastError()!=0)
         return;

      double   arr_ask[];
      int size=ArraySize(tick_array_range);
      ArrayResize(arr_ask,size);
      for(int i=0;i<size;i++)
         arr_ask[i]=tick_array_range[i].ask;

      m_graphic.Create(0,"Deals",0,30,30,500,300);
      m_graphic.CurveAdd(arr_ask,1);
      Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
      m_graphic.Update();
      Print("Цвет фона после \"Update\": ",m_graphic.BackgroundColor());
      Sleep(sleeping);
      m_graphic.Destroy();
     }
  }
//+------------------------------------------------------------------+


2016.12.11 09:06:02.528 Terminal        MetaTrader 5 x64 build 1495 started (MetaQuotes Software Corp.)
2016.12.11 09:06:02.531 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 4882 / 8077 Mb, HDD: 357683 / 476372 Mb, GMT+02:00
2016.12.11 09:06:02.531 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

No hay errores ni en "Expertos" ni en "Diario".

Archivos adjuntos:
 
Vladimir Karputov:

Buscando aplicaciones para nuevas funciones - en particular para la biblioteca Grahic (gráficos científicos).

Por ejemplo, seleccione un área en un gráfico utilizando un objeto rectángulo y ejecute el script:

Para los no programadores, el rectángulo debería llamarse RECTÁNGULO.

Pregunta: ¿qué se muestra en el eje X? He marcado 2 barras M1, he contado el número de ticks, no encaja, los segundos tampoco coinciden.

 
Vladimir Karputov:

Cuando intento utilizar el CGraphic.Crea, me sale un cuadrado de Malevich:


No has hecho Redraw() antes de Update()
 
o_O:
No has hecho Redraw() antes de Update()

Hecho, dibuja un marco gráfico, ejes. No hay ningún gráfico en sí mismo.

También se ha añadido, así es como se dibuja.

....
      m_graphic.Create(0,"Deals",0,30,30,500,300);
      CCurve* curve = m_graphic.CurveAdd(arr_ask,CURVE_LINES);
      curve.Color(clrBlack);
      curve.Visible(true);
      Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
      m_graphic.Redraw();
      m_graphic.Update();
....

***

 
Alexey Volchanskiy:

Hecho, dibuja un marco gráfico, ejes. No hay ningún gráfico en sí mismo.

También complementado, se dibuja de esta manera.

....
      m_graphic.Create(0,"Deals",0,30,30,500,300);
      CCurve* curve = m_graphic.CurveAdd(arr_ask,CURVE_LINES);
      curve.Color(clrBlack);
      curve.Visible(true);
      Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
      m_graphic.Redraw();
      m_graphic.Update();
....

***

Gracias.

Versión de trabajo (versión "1.003"):

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.003"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string   rectangle_name="RECTANGLE";   // rectangle name
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   ResetLastError();
   int result_find=ObjectFind(0,rectangle_name);
   if(result_find<0)
     {
      Print("ObjectFind Error: ",GetLastError());
      return;
     }
   datetime from  = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
   datetime to    = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
   MqlTick tick_array_range[];                  // массив для приема тиков
   ResetLastError();
   CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
   if(GetLastError()!=0)
      return;

   double   arr_ask[];
   int size=ArraySize(tick_array_range);
   ArrayResize(arr_ask,size);
   for(int i=0;i<size;i++)
      arr_ask[i]=tick_array_range[i].ask;

   m_graphic.Create(0,"Deals",0,30,30,500,300); // создает графический ресурс, привязанный к объекту чарта

   CCurve *curve=m_graphic.CurveAdd(arr_ask,1); // создает и добавляет кривую (CCurve) на график
   curve.Visible(true);                         // отображает кривую

   m_graphic.Redraw();                          // redraw grahic
   m_graphic.Update();                          // отображает на экране сделанные изменения
   Sleep(sleeping);
   m_graphic.Destroy();                         // удаляет с чарта график и уничтожает графический ресурс
  }
//+------------------------------------------------------------------+


versión 1.003

Archivos adjuntos:
 

La clase CGraphic tiene un diseño muy desafortunado (o mal concebido) con su lienzo.

En su forma actual, es puramente para fines de demostración. Es poco útil para otros fines. Como es imposible trabajar con la posición y el tamaño del dibujo en su propio objeto - m_canvas ocupa sin escrúpulos todo el objeto gráfico.
Y debido a que m_canvas es privado, es imposible heredar y cambiar algo propio.

En general, por favor, modifíquelo.
para que el lienzo esté disponible al heredar o para que sea posible trabajar con este m_canvas sin objeto real en el gráfico y luego quitar la construcción hecha a discreción.

 

Y el segundo punto - en CGraphic todas las funciones no son virtuales.

Desarrolladores, ¿por qué prohibieron anularlos?

 
      //--- trim the name
      m_canvas.FontSizeSet(m_history.name_size);
      if(m_canvas.TextWidth(name)>m_history.name_width)
        {
         while(m_canvas.TextWidth(name+"...")>m_history.name_width)
            name=StringSubstr(name,0,StringLen(name)-1);
         name+="...";
        }

Encontrado un error - bucle while infinito cuando m_history.name_width es pequeño


¿Cómo puedo desactivar por completo este Historial en el lado derecho?

 

En lo que a mí respecta:

GetX

Escribe las coordenadas X de todos los puntos de la curva en un array


¿Debo obtener las coordenadas "x" -coordenadas en píxeles- de todos los puntos dibujados en el gráfico en una matriz?

Compruébalo:

//+------------------------------------------------------------------+
//|                                             RECTANGLE_to_csv.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input int      m_width=500;                  // ширина
input int      m_height=300;                 // высота
input int      sleeping=15000;               // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double   arr_example[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

   m_graphic.Create(0,"Example",0,30,30,m_width,m_height); // создает графический ресурс, привязанный к объекту чарта

   CCurve *curve=m_graphic.CurveAdd(arr_example,1); // создает и добавляет кривую (CCurve) на график
   curve.Visible(true);                         // отображает кривую
   m_graphic.Redraw();                          // redraw grahic

   double arr_get_x[];
   curve.GetX(arr_get_x);                       // записываем координаты X для всех точек кривой в массив

   ArrayPrint(arr_get_x);                       // распечатываем массив

   m_graphic.Update();                          // отображает на экране сделанные изменения
   Sleep(sleeping);
   m_graphic.Destroy();                         // удаляет с чарта график и уничтожает графический ресурс
  }
//+------------------------------------------------------------------+


El gráfico está dibujado:

CCurve

Y aquí está una impresión de la matriz - resultó contener los datos para los que se dibujó el gráfico, pero no las coordenadas "x" en píxeles:

2016.12.11 19:03:09.691 GetX (EURUSD,M1)             0.0  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000 11.00000 12.00000 13.00000 14.00000
Archivos adjuntos:
GetX.mq5  4 kb
 
Vladimir Karputov:

¿Tengo que obtener las coordenadas "x" -coordenadas en píxeles- de todos los puntos dibujados en el gráfico en una matriz?

No he dicho nada de "píxeles".

Sólo has presentado una matriz Y. Por tanto, x es un número ordinal simple. GetX es correcto.

Razón de la queja: