Bibliotheken: MT4Orders - Seite 83

 
fxsaber #:

Die Bibliothek (MT4Orders.mqh) verbraucht nicht diese Menge an Speicher. Sie können zum Beispiel diesen EA ausführen, um sich davon zu überzeugen.

Wahrscheinlich arbeiten Sie falsch mit Indikatoren: Sie erstellen neue Indikator-Handles, löschen aber nicht die alten.

Ich verwende keine Indikatoren.

Sie haben zwar recht, die Bibliothek verbraucht nicht so viel Speicher, aber sie verbraucht ihn doch:

HistorySelect(0,INT_MAX);

Laut dieser Seite:

https://www.mql5.com/de/articles/211

"Der Versuch, die gesamte Handelshistorie zu verarbeiten, ist in den meisten Fällen falsch. Wenn die Anzahl der verarbeiteten Geschäfte/Aufträge in die Tausende und Zehntausende geht, verlangsamt sich die Arbeit des Programms drastisch."

Für den Fall, dass es 1M+ Geschäfte gibt, speichert Ihre Bibliothek alle in einem Array.

Ich schätze es sehr, dass Sie diese Bibliothek als Brücke zwischen mt4 und mt5 erstellt haben und sie mit allen teilen, ohne sie zu verwerfen. Ich finde es nur schade, dass es nur einen Ort online, die beschreibt, wie man Swap und Kommission Werte richtig zu bekommen (vorausgesetzt, dass der Makler tatsächlich bietet sie), und es ist in einer solchen verworrenen Weise geschrieben.

Orders, Positions and Deals in MetaTrader 5
Orders, Positions and Deals in MetaTrader 5
  • www.mql5.com
Creating a robust trading robot cannot be done without an understanding of the mechanisms of the MetaTrader 5 trading system. The client terminal receives the information about the positions, orders, and deals from the trading server. To handle this data properly using the MQL5, it's necessary to have a good understanding of the interaction between the MQL5-program and the client terminal.
 
pcdeni #:

Sie haben zwar recht, die Bibliothek verbraucht nicht so viel Speicherplatz, aber sie verwendet diesen:

Laut dieser Seite:

https://www.mql5.com/de/articles/211

"Der Versuch, die gesamte Handelsgeschichte zu verarbeiten, ist in den meisten Fällen falsch. Wenn die Anzahl der verarbeiteten Geschäfte/Aufträge in die Tausende und Zehntausende geht, verlangsamt sich die Arbeit des Programms drastisch."

Wenn es mehr als 1 Million Geschäfte gibt, speichert Ihre Bibliothek alle in einem Array.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

double GetSummaryCommissionMQL5()
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (uint i = HistoryDealsTotal(); (bool)i--; )
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_COMMISSION);

  return(NormalizeDouble(Res, 2));
}

double GetSummaryCommissionMQL4()
{
  double Res = 0;
  
  for (uint i = OrdersHistoryTotal(); (bool)i--; )
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCommission();

  return(NormalizeDouble(Res, 2));
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL5());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL4());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(HistoryDealsTotal());
  PRINT(HistoryOrdersTotal());
  PRINT(PositionsTotal());
}


Ergebnis.

MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1203

GetSummaryCommissionMQL5() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1404

GetSummaryCommissionMQL4() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 45
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1424

HistoryDealsTotal() = 130330
HistoryOrdersTotal() = 190241
PositionsTotal() = 0


130K Geschäfte + 190K Aufträge, der Terminalspeicherverbrauch steigt um 20 MB (+10%).

Sie können die Leistung selbst messen. Die Dokumentation ist längst veraltet.

 
Die Verwendung der Bibliothek kann den Speicherverbrauch um bis zu 10 % erhöhen.
 
fxsaber #:
Die Verwendung der Bibliothek kann den Speicherverbrauch um bis zu 10 % erhöhen.

Was ist der Grund dafür?

 
Vitaly Muzichenko #:

Was hat das damit zu tun?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2023.07.07 13:12

  • OrderSelect errechnet absolut alle Daten der ausgewählten Order aus der Historie (OrderPrint ist kostenlos). Dies ist eine großartige Kombination der Funktionen HistoryOrderGet* und HistoryDealGet*, die jede Komplexität von Marktsituationen und eine große Anzahl von Fallstricken bewältigt. Sehen Sie sich MT4ORDERS::GetHistoryPositionData() an. Dies ist eine einzige Funktion für das Terminal und für den Tester, aber sie ist speziell für den Tester beschleunigt, weil viele Terminal-Fallen im Tester nicht vorhanden sind. Beispiele für Konfigurationen: eins, zwei, drei.
 
fxsaber #:
Die Verwendung der Bibliothek kann den Speicherverbrauch um bis zu 10 % erhöhen.

Ich dachte, es gäbe gestern ein Bibliotheksupdate, aber ich habe es ein Jahr lang nicht mitbekommen :)

Ich werde mich darauf freuen, danke für die Unterstützung!

 

sub, inwieweit ist es von Vorteil, const bei der Funktionsübertragung zu verwenden?

und zur gleichen Zeit, ist es sinnvoll, ein Klassenmitglied innerhalb einer Funktion zu erstellen, oder können wir mit globalen, 7 Zeichen in einem Roboter Handel tun?

Verarbeitung bei jedem Tick, durch den Spy-Indikator.

Verarbeitung auf jeder Zecke, in der leeren in der Regel nicht fangen Anomalien, es ist eine Frage der Optimierung Ihrer Funktionen Fragen...
 
// Liste ändern:
// 21.07.2023
// Fix: OrderLotsOpen() für gelöschte schwebende Aufträge korrigiert.
// Hinzufügen: Behandelt den Fall, dass für einen MT5-Handel kein MT5-Auftrag vorliegt.
// Korrektur: Korrekte Definition von OrderClosePriceRequest(), wenn SL/TP-Order keinen Preis hat.
// Hinzufügen: Das Makro MT4ORDERS_AUTO_VALIDATION ermöglicht die automatische Validierung von Marktprodukten.
// Hinzufügen: Das Makro MT4ORDERS_ORDERS_SORT generiert die MT4-Orderhistorie sortiert nach Schließungs-/Löschungszeit.
 

fxsaber #:

/ Hinzufügen: Das Makro MT4ORDERS_ORDERS_SORT generiert die MT4-Order-Historie sortiert nach Schließungs-/Löschungszeit.

Ich habe das Update heruntergeladen und überprüft, alles funktioniert jetzt einwandfrei mit Limit-Orders, bisher keine Verzögerungen festgestellt.

Danke!

 
Vitaly Muzichenko #:

noch keine Verzögerungen.

Jetzt wird die frontale Variante verwendet.

Hier ist der Code, der die Ausführungszeit einer solchen Lösung zeigen kann, wenn die Handelsgeschichte zwischen benachbarten Aufrufen von OrdersHistoryTotal() aktualisiert wurde.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/de/code/31279

ulong OrdersMQL5()
{
  ulong Res = 0;

  if (HistorySelect(0, INT_MAX))
  {
    const int Total = HistoryOrdersTotal();
    ulong Array[][2];
    
    ArrayResize(Array, Total);
    
    for (int i = 0; i < Total; i++)
    {
      const ulong Ticket = HistoryOrderGetTicket(i);

      Array[i][0] = HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC);
      Array[i][1] = Ticket;
    }
          
    ArraySort(Array);      
    
    Res = Array[Total - 1][1];
  }
  
  return(Res);
}

void OnStart()
{
  OrdersMQL5(); // Aufwärmen.
  
  for (int i = 0; i < 3; i++)
    _B(OrdersMQL5(), 1);
    
  Print(HistoryOrdersTotal());
}


Führen Sie die Ergebnisse auf einigen Handelskontenaus. Auf der Abszisse von HistoryOrdersTotal().

X - HistoryOrdersTotal()

Sie können deutlich sehen, dass bei 100K MT5-Aufträgen die Verzögerung 10 ms beträgt (die Ausführungszeit von OrdersHistoryTotal, wenn die Handelshistorie nach dem vorherigen Lauf aktualisiert wurde).

Im Tester gibt es überhaupt keine Verzögerung. Nur im Terminal. Offensichtlich ist es möglich, die Ausführung zu beschleunigen, aber nicht in diesem Ausmaß.