Diskussion zum Artikel "Grafische Interfaces X: Erweitertes Management von Listen und Tabellen Code Optimierung (build 7)" - Seite 11

 

Ich verstehe immer noch nicht, wie ich die Tabelle aktualisieren kann: ....

Es gibt dynamische Daten in der Tabelle, die wir per Timer aktualisieren müssen.

Ich versuche, sie zuerst mit der Clear()-Methode zu löschen, aber es erscheint ein Fehler:

 invalid pointer access in 'Element.mqh' (106,70)

Wie kann ich sie aktualisieren? Ich habe in den Artikeln nirgends ein Beispiel gefunden. In allen Artikeln ist die Tabelle mit statischen Daten gefüllt.

 
Juer:

Wie kann ich die Tabelle aktualisieren, die ich nicht verstanden habe....

Es gibt dynamische Daten in der Tabelle, wir müssen sie per Timer aktualisieren.

Ich versuche, sie zuerst mit der Clear()-Methode zu löschen, aber es erscheint ein Fehler:

Wie kann ich sie aktualisieren? Ich habe in den Artikeln nirgends ein Beispiel gefunden. In allen Artikeln ist die Tabelle mit statischen Daten gefüllt.

 
Anatoli Kazharski:

Ich danke Ihnen. Nur wird dabei die Sortierung nicht berücksichtigt.

Beim Sortieren können die Zeilen ihre Position ändern....

 
Juer:

Ich danke Ihnen. Nur wird dabei die Sortierung nicht berücksichtigt.

Beim Sortieren können die Zeilen ihre Position ändern...

Sie können die Sortierung selbst steuern. Zu diesem Zweck gibt es eine öffentliche Methode CTable::SortData().

Beispiel und die neueste Version der CTable-Klasse hier: EasyAndFast library updates

 
Anatoli Kazharski:

Sie können die Sortierung selbst steuern. Zu diesem Zweck gibt es eine öffentliche Methode CTable::SortData().

Beispiel und die neueste Version der CTable-Klasse hier: EasyAndFast library updates

Es ist immer noch unklar. Es gibt keine Methode, um festzustellen, wie viele Zeilen in der Tabelle nicht leer sind. Ich lade Informationen über offene Aufträge in die Tabelle. Aufträge können erscheinen oder geschlossen werden. Ich muss jedes Mal alle Werte in der Tabelle durchgehen und mit ticket.... vergleichen. Das ist lästig, aber möglich.

Könnten Sie mir auch bei der Sortierung helfen? Ich muss eine Zeile in der Tabelle analog zu der auf der Registerkarte Handel erstellen. Eine Zeile, die den Gewinn aus offenen Positionen, Provisionen usw. zusammenfasst. Das heißt, die Spalten dieser Zeile werden dieselben sein wie in der Tabelle, aber mit Gesamtwerten. Wie kann ich also diese Zeile an die erste Stelle der Liste setzen, so dass die Sortierung nicht auf sie angewendet wird?

 
Juer:

Das ist immer noch nicht klar. Es gibt keine Methode, um festzustellen, wie viele Zeilen in der Tabelle nicht leer sind. Ich lade Informationen über offene Aufträge in die Tabelle hoch. Aufträge können erscheinen oder geschlossen werden. Ich muss jedes Mal alle Werte in der Tabelle durchgehen und mit ticket.... vergleichen. Das ist nicht bequem, aber möglich.

...

Gehen Sie selbst durch die Zeilen und sehen Sie nach, ob sie leer sind oder nicht.

Der Artikel Trading Expert Advisor mit GUI: Füllen mit Funktionalität (Teil II) zeigt im Detail, wie dies umgesetzt werden kann.

Juer:

...

Können Sie mir auch etwas über die Sortierung sagen. Ich muss eine Zeile in der Tabelle analog zu der auf der Registerkarte Handel erstellen. Eine Zeile, die den Gewinn aus offenen Positionen, Provisionen usw. zusammenfasst. Das heißt, die Spalten dieser Zeile werden dieselben sein wie in der Tabelle, aber mit Gesamtwerten. Wie kann ich also diese Zeile an die erste Stelle der Liste setzen, ohne dass eine Sortierung vorgenommen wird?

In der Bibliothek gibt es keine solche Möglichkeit. Als Option können Sie eine zweite Tabelle ohne Überschriften mit einer Zeile über der ersten Tabelle erstellen und darin die Gesamtwerte ausgeben.

 
Anatoli Kazharski:

Gehen Sie selbst durch die Linien und sehen Sie nach, ob sie leer sind oder nicht.

Der Artikel Trading Expert Advisor mit GUI: Füllen mit Funktionalität (Teil II) zeigt im Detail, wie es umgesetzt werden kann.

Die Bibliothek verfügt nicht über diese Funktion. Optional können Sie eine zweite Tabelle ohne Überschriften mit einer Zeile oberhalb der ersten Tabelle erstellen und darin die Gesamtwerte ausgeben.

In dem Beispiel im Artikel ist die Anzahl der Zeilen konstant, aber meine ist dynamisch. Aber ich habe festgestellt, dass ich das von Hand machen muss.

Die zweite Tabelle von oben ist keine schlechte Lösung, aber wie geht man damit um, wenn sich die Breite der Spalten in der Haupttabelle ändert...? Wie synchronisiert man sie mit der zweiten Tabelle?

Eine andere Frage. Wenn ich die erste Spalte habe, gibt sie einfach die Seriennummer des Datensatzes an. Sie unterliegt nicht der Sortierung. Gibt es eine Möglichkeit, eine bestimmte Spalte unsortiert zu machen?

 
Juer:

In dem Beispiel in dem Artikel ist die Anzahl der Zeilen konstant, aber meine ist dynamisch. Aber ich verstehe es, es ist handgemacht, also was ist daran falsch.

Wo haben Sie eine konstante Anzahl von Zeilen gesehen? Die Anzahl der Positionen und die Anzahl der verwendeten Zeichen ändert sich, und diese Änderungen spiegeln sich in den Tabellen wider.


Juer:

Die zweite Tabelle von oben ist keine schlechte Lösung, aber was ist mit der Änderung der Spaltenbreite in der Haupttabelle...? Wie kann man das mit der zweiten Tabelle synchronisieren?

Eine andere Frage. Wenn ich die erste Spalte habe, gibt sie einfach die Seriennummer des Datensatzes an. Sie unterliegt nicht der Sortierung. Gibt es eine Möglichkeit, eine bestimmte Spalte unsortiert zu machen?

Nein, es gibt keine Möglichkeit.

 
Anatoli Kazharski:

Wo haben Sie eine konstante Anzahl von Zeilen gesehen? Die Anzahl der Positionen und die Anzahl der verwendeten Zeichen ändert sich, und diese Änderungen spiegeln sich in den Tabellen wider.

Ehrlich gesagt verstehe ich nicht wirklich, wie Sie die Positionen dort aktualisieren. Ich sehe, dass Sie zur Aktualisierung der Zeichentabelle einfach alle Zeilen löschen. Aber ich verstehe noch nicht, wie die Positionstabelle aktualisiert wird:

//+------------------------------------------------------------------+
Werte in der Positionstabelle setzen //|
//+------------------------------------------------------------------+
void CProgram::SetValuesToPositionsTable(string &symbols_name[])
  {
//--- Prüfung auf Bereichsüberschreitung
   uint symbols_total =::ArraySize(symbols_name);
   uint rows_total    =m_table_positions.RowsTotal();
   if(symbols_total<rows_total)
      return;
//--- Holen wir uns die Indikatoren in die Tabelle
   for(uint r=0; r<rows_total; r++)
     {
      int    positions_total =PositionsTotal(symbols_name[r]);
      double pos_volume      =PositionsVolumeTotal(symbols_name[r]);
      double buy_volume      =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_volume     =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_SELL);
      double pos_profit      =PositionsFloatingProfitTotal(symbols_name[r]);
      double buy_profit      =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_profit     =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_SELL);
      double average_price   =PositionAveragePrice(symbols_name[r]);
      string deposit_load    =::DoubleToString(DepositLoad(false,average_price,symbols_name[r],pos_volume),2)+"/"+
                              ::DoubleToString(DepositLoad(true,average_price,symbols_name[r],pos_volume),2)+"%";
      //--- Werte einstellen
      m_table_positions.SetValue(0,r,symbols_name[r]);
      m_table_positions.SetValue(1,r,(string)positions_total);
      m_table_positions.SetValue(2,r,::DoubleToString(pos_volume,2));
      m_table_positions.SetValue(3,r,::DoubleToString(buy_volume,2));
      m_table_positions.SetValue(4,r,::DoubleToString(sell_volume,2));
      m_table_positions.SetValue(5,r,::DoubleToString(pos_profit,2));
      m_table_positions.SetValue(6,r,::DoubleToString(buy_profit,2));
      m_table_positions.SetValue(7,r,::DoubleToString(sell_profit,2));
      m_table_positions.SetValue(8,r,deposit_load);
      m_table_positions.SetValue(9,r,::DoubleToString(average_price,(int)::SymbolInfoInteger(symbols_name[r],SYMBOL_DIGITS)));
      //--- Einstellen der Farbe
      m_table_positions.TextColor(3,r,(buy_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(4,r,(sell_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(5,r,(pos_profit!=0)? (pos_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(6,r,(buy_profit!=0)? (buy_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(7,r,(sell_profit!=0)?(sell_profit>0)? clrGreen : clrRed : clrLightGray);
     }
  }

Ich verstehe etwas nicht. Wenn es weniger Symbole als Zeilen in der Tabelle gibt, wird sie einfach nicht aktualisiert?

Ich muss die Werte eigentlich bei jedem Tick aktualisieren. Wie korrekt wäre es, alle Zeilen zu löschen und die Tabelle jedes Mal neu zu füllen?

 

Juer:

Ich muss die Werte tatsächlich bei jedem Tick aktualisieren. Wie korrekt wäre es, alle Zeilen zu löschen und die Tabelle jedes Mal neu zu füllen?

Wenn Sie nur die Werte aktualisieren müssen, brauchen Sie nichts zu löschen.

Wenn Sie die Anzahl der Zeilen in der Tabelle ändern müssen, können Sie dies wie folgt tun.

Die zweite Möglichkeit ist die Verwendung der Methode CTable::Rebuilding(). Allerdings müssen Sie dann einige Tabelleneigenschaften (Überschriften, Spaltenbreiten usw.) erneut einstellen.