Diskussion zum Artikel "Erstellung eines Dashboards zur Anzeige von Daten in Indikatoren und EAs" - Seite 3

 
Denis Kirichenko #:
Bisher habe ich herausgefunden, dass dies die Art und Weise ist, wie das Ereignis CHARTEVENT_CHART_CHANGE(9) behandelt wird.

Es ist also ganz natürlich, dass sich die Größe des Diagrammfensters ändert, wenn der Fokus weggenommen wird.

Hier ist die Verarbeitung:

//--- Wenn der Zeitplan geändert wird
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Ermitteln der Nummer des Teilfensters des Diagramms (sie kann sich beim Löschen des Fensters eines beliebigen Indikators ändern)
      this.m_wnd=this.GetSubWindow();
      //--- Abrufen der neuen Diagrammabmessungen
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Feststellen, ob die Größe des Feldes außerhalb des Diagrammfensters liegt
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Wenn sich die Höhe der Karte geändert hat - passen Sie die vertikale Position des Bedienfelds an
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Wenn sich die Breite des Diagramms geändert hat - passen Sie die horizontale Position des Panels an
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }

Sie sollten versuchen, den Fokus des Diagramms zu kontrollieren und nicht auf Änderungen zu reagieren, wenn das Diagrammfenster nicht mehr im Fokus ist. Oder etwas anderes in dieser Richtung. Leider kann ich das Programm noch nicht ausführen und testen, um die genauen Ursachen und die Methode zur Behebung des Problems herauszufinden.

 

Ich habe das Forum durchsucht. Das Problem wurde bereits diskutiert. Zum Beispiel. Ich habe eine solche Prüfung in den Code eingefügt:

//--- Wenn der Zeitplan geändert wird
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Ermitteln der Nummer des Teilfensters des Diagramms (sie kann sich beim Löschen des Fensters eines beliebigen Indikators ändern)
      this.m_wnd=this.GetSubWindow();
      l ong value;
      //--- den Fehlerwert zurücksetzen
      ::ResetLastError();
      //--- den Wert der Eigenschaft ermitteln
      if(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
         {
         //--- Ausgabe der Fehlermeldung in das "Experten"-Protokoll.
         Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
         return;
         }
      // wenn das Diagramm nicht über allen anderen angezeigt wird - beenden
      if(value == 0)
         return;
      //--- Abrufen der neuen Diagrammabmessungen
      int w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
      int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
      //--- Feststellen, ob die Größe des Feldes außerhalb des Diagrammfensters liegt
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Wenn sich die Höhe der Karte geändert hat - passen Sie die vertikale Position des Bedienfelds an
      if(this.m_chart_h!=h)
        {
         this.m_chart_h=h;
         int y=this.m_y;
         if(this.m_y+this.m_h>h-1)
            y=h-this.m_h-1;
         if(y<1)
            y=1;
         this.Move(this.m_x,y);
        }
      //--- Wenn sich die Breite des Diagramms geändert hat - passen Sie die horizontale Position des Panels an
      if(this.m_chart_w!=w)
        {
         this.m_chart_w=w;
         int x=this.m_x;
         if(this.m_x+this.m_w>w-1)
            x=w-this.m_w-1;
         if(x<1)
            x=1;
         this.Move(x,this.m_y);
        }
     }


Der Fehler scheint verschwunden zu sein.


Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
  • 2021.12.25
  • satorifx
  • www.mql5.com
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
 

Ein weiteres Problem. Das Ausklappen des Panel-Fensters wird nicht verarbeitet, nachdem der Indikator zuerst aus dem Chart entfernt und das Panel minimiert wurde und dann wieder im Chart gestartet wurde.




Morgen werde ich versuchen, herauszufinden, was der Fehler ist....

 

Artem, ein weiteres Beispiel aus dem nachfolgenden Artikel über Oszillatoren stört ebenfalls, wenn das Fenster minimiert und das Programm dann aus dem Chart gelöscht wird. Es handelt sich nicht um einen Indikator, sondern um einen Expert Advisor. Hier:



 
Denis Kirichenko #:

Ein weiteres Problem. Das Ausklappen des Panel-Fensters wird nicht gehandhabt, nachdem der Indikator zunächst aus dem Chart entfernt, das Panel minimiert und dann wieder im Chart gestartet wurde.

Morgen werde ich versuchen herauszufinden, was der Fehler ist....

Hier können Sie die Ursache der Deinitialisierung überprüfen und den Status des Panels nicht in globalen Terminalvariablen speichern, wenn Sie einen Expert Advisor (oder Indikator) aus dem Chart entfernen. Dies ist keine Lösung für das Problem, sondern seine Verschleierung. Das ist natürlich nicht gut. Aber für eine schnelle Lösung ist es ausreichend.

Oder Sie müssen sich mit diesem Verhalten auseinandersetzen. Leider habe ich im Moment nur wenig Zeit.

 
Denis Kirichenko #:

Ich habe das Forum durchsucht. Das Problem wurde bereits diskutiert. Zum Beispiel. Ich habe eine solche Prüfung in den Code eingefügt:

Der Fehler scheint verschwunden zu sein.

Ich danke Ihnen. Ich werde diese Panel-Klasse später zu meinem Code hinzufügen. Übrigens, von Artikel zu Artikel, in dem dieses Panel verwendet wurde, gab es alle möglichen Verbesserungen. Ich glaube, hier ist der letzte Artikel, in dem das Panel verwendet wurde. Ich weiß aber nicht mehr, ob ich es noch verfeinert habe.
Ich habe den Code der Panel-Klasse hier angehängt.

Цветные буферы в мультисимвольных мультипериодных индикаторах
Цветные буферы в мультисимвольных мультипериодных индикаторах
  • www.mql5.com
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
Dateien:
Dashboard.mqh  219 kb
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion über den Artikel "Erstellung eines Informationspanels zur Anzeige von Daten in Indikatoren und Expert Advisors"

Denis Kirichenko, 2024.09.23 22:26

Ein weiteres Problem. Es funktioniert nicht, wenn das Panel-Fenster aufgeklappt wird, nachdem der Indikator aus dem Chart entfernt und das Panel minimiert wurde, und dann wieder im Chart gestartet wird....


Ja, in der neuesten Version von Dashboard.mqh gibt es diesen Fehler nicht. Sie funktioniert.

 
Denis Kirichenko #:

Ja, in der neuesten Version von Dashboard.mqh gibt es keinen solchen Fehler. Es funktioniert.

Gut.
 

Die neue Lätzchen hat auch einen Fehler. Wenn Sie das Panel auf einem Diagramm starten und dann mit der Größe des Diagrammfensters spielen, klebt das Panel am unteren Teil, wenn das Fenster wiederhergestellt wird. Und es will nicht mehr raus ((


 

Artem, ich habe eine Frage. In der Methode void CDashboard::Move(int x, int y) gibt es so etwas:

if(!m_higher_wnd)
     {
      if(y + h > m_chart_h - 2)
         y = m_chart_h - h - 2;
      if(y < 1)
         y = 1;
     }
   else
     {
      if(y > 1)
         y = 1;
      if(y < m_chart_h - h - 2)
         y = m_chart_h - h - 2;
     }


Insbesondere bin ich an diesem Block interessiert. D.h. wenn die Höhe des Panels kleiner ist als die des Diagrammfensters, und wenn sein Y-Punkt (obere linke Ecke) niedriger ist als die Differenz zwischen der Fensterhöhe und der Panelhöhe, korrigiert um 2 Pixel, dann wird dem oberen Punkt des Panels der Wert dieser Differenz zugewiesen. Warum ist das so, was ist der Grund dafür?

Kurz gesagt, es liegt an der Methode CDashboard::Move(int x, int y), dass es zum Hängenbleiben kommt. Wenn Sie versuchen, das Panel zu verschieben, nachdem Sie die Größe des Diagramms geändert haben, werden die Koordinaten ständig korrigiert und Sie können das Panel-Fenster nicht frei verschieben...