Тестируем CGraphic - вопросы и предложения

 

Ищу применения для новый функций - в частности для библиотеки Grahic (научные графики).

Для примера, выделяем область на графике при помощи объекта прямоугольник и запускаем скрипт:

//+------------------------------------------------------------------+
//|                                             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();
     }
  }
//+------------------------------------------------------------------+

В итоге видим график построенный по тикам, по Ask:

1

Файлы:
 

При попытке использовать метод CGraphic.Create получаю квадрат Малевича:

Квадрат Малевича 

//+------------------------------------------------------------------+
//|                                             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-3120M  @ 2.50GHz, 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

Ни в "Экспертах", ни в "Журнале" ошибок нет. 

Файлы:
 
Vladimir Karputov:

Ищу применения для новый функций - в частности для библиотеки Grahic (научные графики).

Для примера, выделяем область на графике при помощи объекта прямоугольник и запускаем скрипт:

Дополню для непрограммистов, надо этот прямоугольник назвать RECTANGLE.

Вопрос - а что показывается по оси X? Выделил 2 бара М1, посчитал кол-во тиков, не подходит, секунды тоже не совпадают.

 
Vladimir Karputov:

При попытке использовать метод CGraphic.Create получаю квадрат Малевича:


Вы не сделали Redraw() перед Update()
 
o_O:
Вы не сделали Redraw() перед Update()

Сделал, рисует рамку графика, оси. Самого графика нет.

Еще дополнил, так рисует.

....
      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:

Сделал, рисует рамку графика, оси. Самого графика нет.

Еще дополнил, так рисует.

....
      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();
....

***
 

Спасибо!

Работающий вариант (version   "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();                         // удаляет с чарта график и уничтожает графический ресурс
  }
//+------------------------------------------------------------------+


version 1.003

Файлы:
 

у CGraphic класса очень неудачная (или непродуманная) проектировка со своим канвасом.

В текущем виде он чисто демонстрационный. Для других целей малонеприменим. Так как невозможно работать с позицией и размером отрисовки на своём объекте - m_canvas беспардонно занимает весь граф.объект.
А из-за того, что m_canvas приват - то отнаследовать и изменить что-то по своему невозможно.

Вобщем - разрабы, доделайте его пожалуйста.
чтоб канвас был либо доступен при наследовании, либо была возможность работать с этим m_canvas без реального объекта на чарте с последующим забиранием сделанного построения на своё усмотрение.

 

И второй момент - в CGraphic все функции не virtual.

Разработчики, с какой целью вы запретили их переопределять?

 
      //--- 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+="...";
        }

Обнаружил багу - бесконечный цикл while при небольшой m_history.name_width


Как вообще отключить эту History справа?

 

Насколько я понимаю:

GetX

Записывает координаты X для всех точек кривой в массив


я должен получить в массив координаты "x" - координаты в пикселях, всех отрисованных точек на графике?

Проверяем:

//+------------------------------------------------------------------+
//|                                             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();                         // удаляет с чарта график и уничтожает графический ресурс
  }
//+------------------------------------------------------------------+


График нарисован:

CCurve

 

А вот распечатка массива - в ней оказались данные по которым был построен график, но не координаты "x" в пикселях:

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
Файлы:
GetX.mq5  4 kb
 
Vladimir Karputov:

я должен получить в массив координаты "x" - координаты в пикселях, всех отрисованных точек на графике?

речи вроде про "пиксели" не шла.

Вы подали только массив Y. Значит по Х - это простой порядковый номер. Выдал GetX верно.

Причина обращения: