Tuval harika! - sayfa 28

 
Evgeny Potapov :

Teşekkür ederim! Bu oldukça gerçekçi görünüyor!

Sorunuz için teşekkür ederim, çünkü onu cevaplarken bilmediğim çok önemli bir şeyin farkına vardım.
Bunu bilen biri çıkarsa şaşırırım.

Tuvali veya konumunu ObjectSetInteger kullanarak yeniden boyutlandırırsanız, yeniden çizilmesi gerekmez.

  • Oluşturulan tuvalin boyutunu küçültüp bu boyutu döndürsek bile, tuval verileri orijinal çizildiği gibi korunur.
  • Oluşturulan tuvalin boyutu artırılırsa, veriler kaybolur, ancak orijinal boyutu döndürdüğümüzde yeniden görünür.
  • Tuvalin yeniden boyutlandırılması veya konumunun değiştirilmesi sırasında Update() veya ChartRedraw() yapılmasına bile gerek yoktur, yeni bir tik veya pencere değişikliğinin gelmesiyle güncellenecektir.

Bu gösterge bunu göstermektedir. Tuval sadece bir kez oluşturulur. Ancak aynı zamanda, değerler dizisi korunurken boyutu ve konumu değiştirilebilir. Sadece farenizi ekran boyunca hareket ettirin

 #property indicator_chart_window

#define protected public    // увы, это необходимо, чтобы расширить наши возможности 
#include <Canvas\Canvas.mqh> 
#undef protected
CCanvas C;
int OnInit ()
  {
   if (!C.CreateBitmapLabel( 0 , 0 , "_Canvas" , 100 , 100 , 600 , 400 , COLOR_FORMAT_ARGB_NORMALIZE ))
       Print ( "Error creating canvas: " , GetLastError ());
   DrawCanvas( 600 , 400 );
   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , true );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   C.Destroy();
  }
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double & price[])       
  {
     return prev_calculated;               
  }

void OnChartEvent ( const int id,          
                   const long & lparam,   
                   const double & dparam, 
                   const string & sparam) 
  {
   if (id== CHARTEVENT_MOUSE_MOVE )  DrawCanvas(( int )lparam,( int )dparam);
  }
//+------------------------------------------------------------------+
void DrawCanvas( int x, int y)
{
 static bool first= true ;
 //Comment(string(x)+"   " +string(y));
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_XDISTANCE ,x/ 5 );
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_YDISTANCE ,y/ 5 );
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_XSIZE ,x);
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_YSIZE ,y);  
 if (first) // канвас формируется только один раз
 {
   C.Erase();
   C.FillCircle( 100 , 100 , 70 , ColorToARGB ( clrViolet , 200 ));
   C.FillCircle( 300 , 200 , 100 , ColorToARGB ( clrLightBlue , 100 ));
   C.Rectangle( 140 , 50 , 250 , 150 , ColorToARGB ( clrAqua ));
   C.Update(); 
   first= false ;
 }
 ChartRedraw (); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Dosyalar:
 
video olarak kaydedebilirmisin
 
Andrey Dik :
video olarak kaydedebilirmisin
olabilmek
 
Nikolai Semko :
olabilmek

serin! Umarım bir milyon resim oluşturup bunları bir tür video düzenleyicide bir videoya birleştirerek değil mi?))

sakıncası yoksa lütfen detaylandırın

 
Andrey Dik :

serin! Umarım bir milyon resim oluşturup bunları bir tür video düzenleyicide bir videoda bir araya getirerek değil mi?))

sakıncası yoksa lütfen detaylandırın

hayır tabii değil.
Zorlaştır.

 
Nikolai Semko :

hayır tabii değil.
Zorlaştır.

kod gerekmez, nasıl yapılacağına dair ipucu

 
Nikolai Semko :
  • Tuvalin konumunu yeniden boyutlandırırken veya değiştirirken Update() veya ChartRedraw() yapmak bile gerekli değildir , yeni bir onay işareti veya pencere değişikliği gelmesiyle güncellenecektir.

Eh, bu olaylara göre, terminalin kendisi ChartRedraw();) çağırır.

 
Andrey Dik :

kod gerekmez, nasıl yapılacağına dair ipucu

Ne tür bir video çekmek istediğinize bağlı olarak birçok seçenek var. Fare işaretçisi, göstergeler, nesneler, GUI içeren bir pencerede gerçek zamanlı bir pencerede tam olarak ne olur? Yoksa farklı bir şey mi?

 
Ve bu çipin gerçek faydası nedir? Fiyat tablosunda ticarete yardımcı olacak kalıpları bulmaya yardımcı olur mu?
 
Andrey Khatimlianskii :

Eh, bu olaylara göre, terminalin kendisi ChartRedraw();) çağırır.

Bu anlaşılabilir, sadece daha derine inmedi.
Buna odaklandım, çünkü tuval nesnesini ChartRedraw() sırasında yeniden çizmek için yeniden çizim gerçekleşmez, sadece Update() sırasında gerçekleşir. Ve tuval nesnesini yeniden çizmek için ObjectSetInteger kullanılması durumunda, ChartRedraw()'ı zorlamak veya chatr'nin değişmesini veya ChartRedraw()'ın gerçekleştiği yeni bir onay işaretinin gelmesini beklemek yeterlidir.