Leinwand ist cool! - Seite 28

 
Evgeny Potapov:

Ich danke Ihnen! Diese Option sieht sehr realistisch aus!

Ich danke Ihnen für Ihre Frage, denn bei der Beantwortung ist mir eine sehr wichtige Sache klar geworden, die ich nicht kannte.
Ich wäre überrascht, wenn überhaupt jemand davon wüsste.

Wenn Sie die Größe einer Leinwand oder ihre Position mit ObjectSetInteger ändern, müssen Sie sie nicht neu zeichnen.

  • Selbst wenn wir die Größe des generierten Kanvas ändern und dann wieder zurücksetzen, bleiben die Kanvas-Daten in der ursprünglichen Zeichnung erhalten.
  • Wenn Sie die Größe der geformten Leinwand vergrößern, verschwinden die Daten, tauchen aber wieder auf, wenn Sie die ursprüngliche Größe wiederherstellen.
  • Wenn die Größe oder die Position des Kanvas geändert wird, ist es nicht einmal notwendig, Update() oder ChartRedraw() auszuführen, es wird mit einem neuen Tick oder Fensterwechsel aktualisiert.

Dieser Indikator zeigt dies an. Die Leinwand wird nur einmal erstellt. Seine Größe und Position kann jedoch geändert werden, und die Wertepalette bleibt erhalten. Bewegen Sie einfach die Maus über den Bildschirm

#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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Dateien:
 
Ist es möglich, auf Video zu speichern?
 
Andrey Dik:
können Sie ein Video speichern?
können Sie
 
Nikolai Semko:
können Sie

cool! Hoffentlich nicht, indem man eine Million Bilder erstellt und sie dann in einem Video-Editor zu einem Video zusammenfügt?))

Wenn es Ihnen nichts ausmacht, erläutern Sie das bitte

 
Andrey Dik:

cool! Hoffentlich nicht, indem man eine Million Bilder erstellt und sie dann in einem Video-Editor zu einem Video zusammenfügt?))

Wenn es Ihnen nichts ausmacht, erläutern Sie das bitte

Nein, natürlich nicht.
Das wird sie.

 
Nikolai Semko:

Nein, das ist natürlich nicht der Fall.
Es ist mühsam.

Sie brauchen den Code nicht, geben Sie mir einen Tipp, wie man es macht.

 
Nikolai Semko:
  • Wenn Sie die Größe oder die Position des Canvas ändern, brauchen Sie nicht einmal Update() oder ChartRedraw() auszuführen, es wird mit einem neuen Tick oder Fensterwechsel aktualisiert.

Nun, das Terminal ruft ChartRedraw() nach diesen Ereignissen von selbst auf ;)

 
Andrey Dik:

kein Code erforderlich, Hinweis, wie man es macht

Je nachdem, welche Art von Video Sie aufnehmen möchten, gibt es eine Vielzahl von Optionen. Was genau passiert im Fenster in Echtzeit mit Mauszeiger, Indikatoren, Objekten, GUI ? Oder etwas anderes?

 
Welchen Nutzen hat dieser Chip wirklich? Hilft es, Muster auf dem Preisdiagramm zu finden, die beim Handel hilfreich sind?
 
Andrey Khatimlianskii:

Nun, das Terminal selbst ruft bei diesen Ereignissen ChartRedraw() auf ;)

Ich verstehe es, ich wollte nur nicht ins Detail gehen.
Ich habe Sie darauf aufmerksam gemacht, weil die Funktion chartRedraw() das Canvas-Objekt nicht neu zeichnet, sondern nur währendUpdate(). Und wenn Sie ObjectSetIntegerverwenden, um das Canvas-Objekt neu zu zeichnen, reicht es aus, ChartRedraw() zu erzwingen oder auf die Änderung des Diagramms oder das Eintreffen eines neuen Ticks zu warten, wenn ChartRedraw() auftritt.