"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.
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.
"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/16006double 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))
voidOnStart()
{
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());
}
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.
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.
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/31279ulong OrdersMQL5()
{
ulong Res = 0;
if (HistorySelect(0, INT_MAX))
{
constint Total = HistoryOrdersTotal();
ulong Array[][2];
ArrayResize(Array, Total);
for (int i = 0; i < Total; i++)
{
constulong 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);
}
voidOnStart()
{
OrdersMQL5(); // Aufwärmen.for (int i = 0; i < 3; i++)
_B(OrdersMQL5(), 1);
Print(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ß.
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.
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.
Ergebnis.
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.
Was ist der Grund dafür?
Was hat das damit zu tun?
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Bibliotheken: MT4Orders
fxsaber, 2023.07.07 13:12
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...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!
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.
Führen Sie die Ergebnisse auf einigen Handelskontenaus. Auf der Abszisse von 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ß.