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가 진드기로 만든 차트를 볼 수 있습니다.

하나

파일:
 

CGraphic을 사용하려고 할 때. 말레비치 제곱을 얻습니다.

말레비치 광장

//+------------------------------------------------------------------+
//|                                             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

"전문가" 또는 "저널"에는 오류가 없습니다.

파일:
 
Vladimir Karputov :

새로운 기능, 특히 Grahic 라이브러리(과학적 그래프) 에 대한 응용 프로그램을 찾고 있습니다.

예를 들어, 사각형 개체를 사용하여 차트에서 영역을 선택하고 스크립트를 실행합니다.

프로그래머가 아닌 경우 이 사각형을 RECTANGLE이라고 추가해야 합니다.

질문 - x축에 무엇이 표시됩니까? 나는 2 개의 M1 막대를 선택하고 틱 수를 세었고 맞지 않으며 초도 일치하지 않습니다.

 
Vladimir Karputov :

CGraphic을 사용하려고 할 때. 말레비치 제곱을 얻습니다.


Update() 전에 Redraw()를 하지 않았습니다.
 
o_O :
Update() 전에 Redraw()를 하지 않았습니다.

만든, 그래프 프레임, 축을 그립니다. 차트 자체가 없습니다.

그는 또한 추가하여 그림을 그립니다.

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

***

고맙습니다!

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


버전 1.003

파일:
 

CGraphic 클래스는 자체 캔버스를 사용하여 매우 성공적이지 못한(또는 잘못 생각한) 디자인을 가지고 있습니다.

현재 형태로는 순전히 실증적입니다. 다른 용도로는 적합하지 않습니다. 개체에 그리는 위치와 크기로 작업하는 것이 불가능하기 때문에 m_canvas는 뻔뻔스럽게도 전체 그래프 개체를 차지합니다.
그리고 m_canvas는 private이기 때문에 자신만의 방식으로 무언가를 상속하고 변경하는 것은 불가능합니다.

일반적으로 개발 완료하십시오.
캔버스를 상속할 때 사용할 수 있도록 하거나 차트에 실제 개체 없이 이 m_canvas로 작업한 다음 재량에 따라 완성된 구성을 가져갈 수 있도록 합니다.

 

그리고 두 번째 요점 - CGraphic 의 모든 기능은 가상이 아닙니다.

개발자 여러분, 어떤 목적으로 재정의를 금지하셨습니까?

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

버그 발견 - 작은 m_history.name_width가 있는 무한 while 루프


오른쪽에서 이 기록을 비활성화하려면 어떻게 해야 합니까?

 

내가 이해하는 한도에서는:

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


차트가 그려집니다.

씨커브

그리고 다음은 배열의 출력입니다. 여기에는 그래프가 작성된 데이터가 포함되지만 픽셀 단위의 "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만 제출했습니다. 따라서 X는 단순 서수입니다. GetX를 올바르게 발행했습니다.