"Görselleştirin! R dilinin plot fonksiyonuna benzer MQL5 grafik kütüphanesi" makalesi için tartışma

 

Yeni makale Görselleştirin! R dilinin plot fonksiyonuna benzer MQL5 grafik kütüphanesi yayınlandı:

Ticaret modellerini incelerken grafikler şeklinde görselleştirme büyük önem taşımaktadır. R ve Python gibi bilim topluluğu arasında popüler olan programlama dilleri görselleştirme için özel plot fonksiyonuna sahiptir. Bu fonksiyon, ticaret modellerinin çizgiler, nokta dağılımları ve histogramlar şeklinde görselleştirilmesine olanak sağlar. MQL5’te de aynısı CGraphics sınıfı kullanılarak yapılabilir.

Fonksiyonlarla ilişkili grafikler - birkaç satırda hızlı şekilde oluşturma

Kütüphanenin bir diğer kolaylığı da CurveFunction fonksiyonlarına yönelik işaretçilerle çalışmaktır. MQL5'te, fonksiyon işaretçileri yalnızca global veya statik fonksiyonları kabul eder ve fonksiyon sözdizimi de işaretçi sözdizimine tam olarak uymalıdır. Bizim durumumuzda, CurveFunction işaretçisi, double tipi parametre alan ve ayrıca double geri döndüren fonksiyonlar için yapılandırılmıştır.

Bir fonksiyon işaretçisiyle bir eğri oluşturmak için ayrıca ilk (from), son (to) ve artış adımı (step) parametrelerinin de doğru bir şekilde ayarlanması gerekir. Artış adımı ne kadar küçük olursa, eğriyi oluşturmak için o kadar fazla fonksiyon noktası olacaktır. Bir veri serisi oluşturmak için CurveAdd(), bir fonksiyon çizmek için de CurvePlot() veya CurvePlotAll() kullanın.


Grafik kütüphanesinin avantajları

MQL5 dili, geliştiricilerin yalnızca ticaret robotları ve teknik göstergeler oluşturmasına değil, aynı zamanda ALGLIB, Fuzzy ve istatistik kütüphanelerini kullanarak karmaşık matematiksel hesaplamalar yapmasına da olanak sağlar. Elde edilen veriler daha sonra grafik kütüphanesi kullanılarak kolayca görselleştirilebilir. İşlemlerin çoğu otomatikleştirilmiştir ve kütüphane kapsamlı işlevsellik sunar:

  • 5 grafik görüntüleme türü
  • 10 grafik işaret türü
  • X ve Y eksenlerine göre grafikleri otomatik ölçeklendirme yeteneği
  • Grafik birkaç yapıya sahip olsa bile otomatik renk seçme yeteneği
  • Klasik kenar yumuşatma veya daha gelişmiş Bresenham’ın çizgi algoritmasını kullanarak çizgileri yumuşatma yeteneği
  • Çizgiler için spline yaklaşımı parametrelerini ayarlama yeteneği
  • x[] ve y[] dizilerine dayalı tek bir kod satırıyla grafik oluşturma yeteneği
  • Fonksiyon işaretçilerini kullanarak grafik oluşturma yeteneği

Yazar: MetaQuotes

 
İyi iş çıkardınız! Teşekkürler. CircleAA algoritmasını zaten düzeltecektim
Bu arada, CircleWu işlevi basitleştirilebilir ve hızlandırılabilir:

void CCanvas::CircleWu(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX)
  {
   if(r<=0)
      return;
//--- ön hesaplamalar
   double r2=r*r;
   double quarter=round(r*M_SQRT1_2);
//--- çizgi stilini ayarla
   uint prev_style=m_style;
   if(style!=UINT_MAX)
      LineStyleSet(style);
   uint mask=1<<m_style_idx;
//--- çiz
   for(int dx=0; dx<=quarter; dx++)
     {
      double dy=sqrt(r2-dx*dx);
      double alpha1=dy-floor(dy);
      double alpha2=1-alpha1;
      if((m_style&mask)==mask)
        {
         PixelTransform4(x,y,dx,(int)(dy)+1,clr,alpha1);
         PixelTransform4(x,y,dx,(int)(dy),clr,alpha2);
         PixelTransform4(x,y,(int)dy+1,dx,clr,alpha1);
         PixelTransform4(x,y,(int)dy,dx,clr,alpha2);
        }
      mask<<=1;
      if(mask==0x1000000)
         mask=1;
     }
  
//--- önceki satır stilini ayarla
   if(style!=UINT_MAX)
      m_style=prev_style;
  }
 
Nikolai Semko:
İyi iş çıkardınız! Teşekkürler. CircleAA algoritmasını zaten düzeltecektim
Bu arada, CircleWu işlevi basitleştirilebilir ve hızlandırılabilir:
Fikir için teşekkürler, düzenlemeler yapılacaktır!
 

Grafiğin ve her bir fonksiyonunun özelliklerini istediğiniz zaman değiştirebilirsiniz. Örneğin, grafik eksenlerine başlıklar ekleyelim, eğri adını değiştirelim ve bunun için spline yaklaştırma modunu etkinleştirelim:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
  {
   CGraphic graphic;
   graphic.Create(0,"Graphic",0,30,30,780,380);
   double x[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y[]={-5,4,-10,23,17,18,-9,13,17,4};
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.Name("Example");                 
   curve.LinesIsSmooth(true);             
   graphic.XAxis().Name("X - axis");      
   graphic.XAxis().NameSize(12);          
   graphic.YAxis().Name("Y - axis");      
   graphic.YAxis().NameSize(12);
   graphic.YAxis().ValuesWidth(15);
   graphic.CurvePlotAll();
   graphic.Update();
   DebugBreak();
  }

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

 
Orangetree:

Grafiğin ve her bir fonksiyonunun özelliklerini istediğiniz zaman değiştirebilirsiniz. Örneğin, grafik eksenlerine başlıklar ekleyelim, eğri adını değiştirelim ve bunun için spline yaklaştırma modunu etkinleştirelim:

  {
   curve.LinesIsSmooth(true);             

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

Yöntemin adı daha sonra değiştirildi. Teşekkürler, makalede düzeltildi
[Silindi]  

Grafikte bir eğri yeniden çizildiğinde ölçeğin de güncellenmesini nasıl sağlayabilirim?

curve5.Update(resultPrices);
    
graphicfirst.Redraw(); и Update()


eğrinin kendisi güncellenir, ancak eski fiyatların bulunduğu ölçek kalır ve grafik tuval sınırlarının dışına çıkar

Buldum, CalculateMaxMinValues() yapmam gerekiyor :)

 
Maxim Dmitrievsky:
Örneğin, dizilerdeki değerleri değiştirirken önceden oluşturulmuş bir grafiği nasıl doğru şekilde yeniden çizeceğimi söyleyebilir misiniz? Redraw() ve Update() işlevlerinin hiçbir etkisi yok

İyi günler, grafiği tam olarak nasıl yeniden çizmeye çalıştınız?

Sadece belirli bir eğri için verileri değiştirmeniz gerekiyorsa, burada çalışan bir örnek var:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- veri 1
   double x1[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y1[]={-5,4,-10,23,17,18,-9,13,17,4};
//--- veri 2
   double x2[]={-10,-10,10,10};
   double y2[]={-10,10,-10,10};
//--- grafik
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);
//--- Puanlar
   CCurve *curve=graph.CurveAdd(x1,y1,CURVE_LINES);
   graph.CurvePlot(0);
   graph.Update();
   Sleep(1000);
   curve.Update(x2,y2);
   graph.Redraw(true);
   graph.Update();
   Sleep(1000);
  }
Not: Forumda Grafik kütüphanesi ile ilgili bu sorunun daha önce gündeme getirildiği bir başlık var.
[Silindi]  
Roman Konopelko:

İyi günler, grafiği tam olarak nasıl yeniden çizmeye çalışıyordunuz?

Sadece belirli bir eğri için verileri değiştirmeniz gerekiyorsa, burada çalışan bir örnek var:

Not: Forumda Grafik kütüphanesi ile ilgili bir başlık var, orada bu soru zaten sorulmuş.
teşekkürler, zaten çözdüm, tam olarak aynı şeyi yapıyordum, sadece bir dizi üzerinde... sadecegrafik için graph.CalculateMaxMinValues() işlevini yeniden hesaplamanız gerekiyor, ardından ölçek güncelleniyor.
 
Maxim Dmitrievsky:
Teşekkürler, zaten çözdüm, tam olarak aynı şeyi yaptım, sadece bir dizi üzerinde. graph.CalculateMaxMinValues() işlevini grafik için de yeniden hesaplamanız gerekir, ardından ölçek güncellenir
CGraphic::Redraw(const bool rescale=false) yöntemini true parametresiyle çağırırsanız, ölçekler otomatik olarak yeniden hesaplanacaktır ( CalculateMaxMinValues öğesini ayrıca çağırmanıza gerek yoktur).
[Silindi]  
Roman Konopelko:
CGraphic::Redraw(const bool rescale=false) yöntemini true parametresiyle çağırırsanız, ölçekler otomatik olarak yeniden hesaplanacaktır ( CalculateMaxMinValues öğesini ayrıca çağırmanıza gerek yoktur).

Doğru, anladım. teşekkürler )
 

Grafik üzerinde iki veya daha fazla ölçek yapmak mümkün mü - bölümlerin santimetre ve inç olarak verildiği bir cetvele benzer şekilde, değerler yalnızca grafiği çizmek için nokta kullanılmışsa verilir mi?