CGraphic'i test etme - sorular ve öneriler

 

Yeni işlevler için uygulamalar arıyorum - özellikle Grahic kitaplığı (bilimsel grafikler) için.

Örneğin, dikdörtgen nesnesini kullanarak grafikte bir alan seçin ve komut dosyasını çalıştırın:

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

Sonuç olarak, Ask tarafından keneler tarafından oluşturulmuş bir grafik görüyoruz:

1

Dosyalar:
 

CGraphic'i kullanmaya çalışırken. Yarat Malevich karesini alıyorum:

Malevich&#39;in meydanı

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

"Uzmanlar" veya "Günlük" de hata yok.

Dosyalar:
 
Vladimir Karputov :

Yeni işlevler için uygulamalar arıyorum - özellikle Grahic kitaplığı (bilimsel grafikler) için.

Örneğin, dikdörtgen nesnesini kullanarak grafikte bir alan seçin ve komut dosyasını çalıştırın:

Programcı olmayanlar için ekleyeceğim, bu dikdörtgene DİKDÖRTGEN adı verilmeli.

Soru - x ekseninde ne gösteriliyor? 2 M1 çubuk seçtim, tik sayısını saydım, uymuyor, saniyeler de uymuyor.

 
Vladimir Karputov :

CGraphic'i kullanmaya çalışırken. Oluşturun Malevich karesini alıyorum:


Update()'ten önce () yeniden çizmediniz
 
o_O :
Update()'ten önce () yeniden çizmediniz

Yapılır, eksenler bir grafik çerçevesi çizer. Kendi grafiği yok.

O da ekledi, o yüzden çiziyor.

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

Yapılır, eksenler bir grafik çerçevesi çizer. Kendi grafiği yok.

O da ekledi, o yüzden çiziyor.

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

***

Teşekkür ederim!

Çalışan sürüm ("1.003" sürümü):

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


sürüm 1.003

Dosyalar:
 

CGraphic sınıfı, kendi tuvali ile çok başarısız (veya kötü düşünülmüş) bir tasarıma sahiptir.

Mevcut haliyle, tamamen göstericidir. Diğer amaçlar için uygun değildir. Nesneniz üzerinde çizimin konumu ve boyutu ile çalışmak imkansız olduğundan, m_canvas tüm grafik nesnesini utanmadan işgal eder.
Ve m_canvas'ın özel olması nedeniyle, kendi yönteminizle bir şeyi devralmak ve değiştirmek imkansızdır.

Genel olarak - geliştirildi, lütfen bitirin.
böylece tuval miras alınırken kullanılabilir veya grafikte gerçek bir nesne olmadan bu m_canvas ile çalışmak mümkündür, ardından tamamlanan yapıyı kendi takdirinize göre alarak.

 

Ve ikinci nokta - CGraphic'te tüm işlevler sanal değildir.

Geliştiriciler, yeniden tanımlanmalarını hangi amaçla yasakladınız?

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

Bir hata bulundu - küçük bir m_history.name_width ile sonsuz bir while döngüsü


Sağdaki bu Geçmişi nasıl devre dışı bırakabilirim?

 

Anladığım kadarıyla:

GetX

Tüm eğri noktaları için X koordinatlarını bir diziye yazar


Diziye "x" koordinatlarını girmem gerekiyor - grafikte çizilen tüm noktaların piksel cinsinden koordinatları?

Kontrol ediyoruz:

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


Grafik çizilir:

Ceğri

Ve işte dizinin çıktısı - grafiğin oluşturulduğu verileri içeriyordu, ancak piksel cinsinden "x" koordinatlarını içermiyordu:

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
Dosyalar:
GetX.mq5  4 kb
 
Vladimir Karputov :

Diziye "x" koordinatlarını girmem gerekiyor - grafikte çizilen tüm noktaların piksel cinsinden koordinatları?

"pikseller" gibi konuşma gitmedi.

Yalnızca Y dizisini gönderdiniz. Yani X basit bir sıra sayısıdır. GetX'i doğru şekilde yayınladı.

Neden: