CGraphic'i test etme - sorular ve öneriler
CGraphic'i kullanmaya çalışırken. Yarat Malevich karesini alıyorum:
//| 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.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.
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.
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();
....
***
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(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
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?
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:
Ve işte dizinin çıktısı - grafiğin oluşturulduğu verileri içeriyordu, ancak piksel cinsinden "x" koordinatlarını içermiyordu:
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ı.

- Ücretsiz ticaret uygulamaları
- Ticaret kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Web sitesi politikasını ve kullanım şartlarını kabul edersiniz
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: