Generische Klassenbibliothek - Bugs, Beschreibung, Fragen, Nutzungsmöglichkeiten und Vorschläge - Seite 12
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Verstehen Sie, was der Code tut, wenn es keine explizite Implementierung der FunktionGetHashCode für den Typ T gibt?
Antwort: Das ist schade, denn das Problem der fehlenden Umsetzung wird dadurch zum Schweigen gebracht. Alle Objekte der gleichen Klasse geben den gleichen Hash-Wert zurück.
Was hat die Umsetzung (Körper) damit zu tun?! Ich habe dies hinzugefügt.
Ich habe den Körper von der Kugel aus eingesetzt.
Was hat die Umsetzung (Körper) damit zu tun?! Ich habe dies hinzugefügt.
Ich habe die Karosserie von Grund auf neu aufgebaut.
Man erzählt dir von Fliegen (dass du das nicht tun solltest, der Code kann dich in Zukunft krank machen) und du erzählst von Schnitzeln.
OK, guten Appetit.
Ich beschloss, mir die Geschwindigkeitseigenschaften der vorgeschlagenen Lösung anzusehen. Expert Advisor für den Prüfer
Der Expert Advisor öffnet 100.000 Trades und sucht dann nach Gesamtgewinnen von zufälligen Trades mit verschiedenen Methoden (siehe Kommentare). Das Ergebnis ist
Hier vergleichen wir die beiden hervorgehobenen Werte. Es stellt sich heraus, dass der HashMap-Zugriff 4 Mal schneller ist als der der Entwickler. Aber bei den Entwicklern ist die Geschichte bereits enthalten...
Ist 4 mal schnell genug oder nicht schnell genug für diese Situation? Hier sind es 24 Millisekunden. Wenn Sie häufig auf den Verlauf zugreifen, können Sie wahrscheinlich eine Menge sparen. Aber ich bin mir nicht sicher.
Für einen realistischeren Testfall (2000 Abschlüsse und 1 000 000 einzelne Zugriffe auf die Historie) ergibt sich folgendes Bild
Fast 100 msec pro Durchgang eingespart! Wenn wir z. B. Optimize für 10.000 vollständige Durchläufe durchführen, ist die Hash-Variante am Ende 15 Minuten schneller.
Es ist noch zu früh, um den Entwicklern eine "Eins" für Geschichte zu geben. Es ist offensichtlich, dass sie es beschleunigen können, denn auch die MQL-Lösung wird immer schneller.
Ich beschloss, mir die Geschwindigkeitseigenschaften der vorgeschlagenen Lösung anzusehen. Expert Advisor für den Prüfer
Der Expert Advisor öffnet 100.000 Trades und sucht dann nach Gesamtgewinnen von zufälligen Trades mit verschiedenen Methoden (siehe Kommentare). Das Ergebnis ist
Hier vergleichen wir die beiden hervorgehobenen Werte. Es stellt sich heraus, dass der HashMap-Zugriff 4 Mal schneller ist als der der Entwickler. Aber bei den Entwicklern ist die Geschichte bereits enthalten...
Ist 4 mal schnell genug oder nicht schnell genug für diese Situation? Hier sind es 24 Millisekunden. Wenn Sie häufig auf den Verlauf zugreifen, können Sie wahrscheinlich eine Menge sparen. Aber ich bin mir nicht sicher.
Bei Aufrufen über die Plattform durchlaufen Sie die Synchronisationsobjekte zweimal in GetDealProfitFull und einmal in GetDealProfitClear sowie eine Menge obligatorischer Prüfungen bei jeder Iteration.
Die Geschwindigkeit ist also notorisch langsamer als bei einer sauberen und optimierten Version mit einer Reihe von Inlays, die auf einer vorbereiteten lokalen Hashmap arbeiten.
Beim Aufruf über die Plattform durchlaufen Sie Synchronisationsobjekte zweimal in GetDealProfitFull und einmal in GetDealProfitClear sowie eine Menge obligatorischer Prüfungen bei jeder Iteration.
Daher ist die Geschwindigkeit inhärent langsamer als bei einer sauberen und optimierten Arbeit auf der Grundlage eines vorbereiteten lokalen Hashmaps mit einer Reihe von Inlays.
Ich habe meinen vorherigen Beitrag korrigiert. Deshalb heißt die doppelte Kontrolle auch Full.
Ich verstehe nicht ganz, von welchen teuren Synchronisationsobjekten und vielen Prüfungen wir im Strategy Tester für HistoryDealGetDouble sprechen?Ich habe meinen vorherigen Beitrag korrigiert. Die doppelte Kontrolle ist der Grund, warum es Full heißt.
Ich bin mir nicht ganz sicher, von welchen teuren Synchronisationsobjekten und massenhaften Prüfungen der Tester bei HistoryDealGetDouble spricht?Worin besteht der Unterschied?
Ich habe mir unseren Code angesehen - es gibt eine Möglichkeit, die Aufrufe an die Handelsbasis zu optimieren. Wir werden versuchen, diese bis zur nächsten Woche zu implementieren.
Renat Fatkhullin:
Wenn Sie in der Plattform einen einzelnen Wert extrahieren, müssen Sie die Abfrage "wie beim ersten Mal" behandeln und die Korrektheit und das Vorhandensein aller Daten doppelt überprüfen
Aber wird TryGetValue nicht ohne Überprüfung der Korrektheit aufgerufen? Aus den Protokollen geht hervor, dass HistorySelect im Testgerät kostenlos ist.
Was ich nicht verstehe, ist, warum man, um alle Daten zu einem Geschäft zu erhalten, eine Reihe von teuren HistoryDealGet*-Funktionen aufrufen muss? Es gibt nur einen Aufruf, um die MqlDeal-Struktur zu füllen.
Wenn der Benutzer mit der Historie über die HashMap arbeiten will, wird er natürlich die CHashMap<ulong, MqlDeal> ausfüllen.
Vielleicht sollten wir MqlDealInteger, MqlDealDouble, MqlDealString oder etwas ähnliches machen, um teure Unit-Aufrufe nicht zu vervielfachen, da die gesamte Historientabelle sowieso im Tester ist? Und es reicht aus, die Korrektheit von DealTicket einmal zu überprüfen, nicht jedes Mal.
Wird der TryGetValue-Aufruf nicht zur Überprüfung der Korrektheit durchgeführt? Aus den Protokollen können Sie ersehen, dass HistorySelect im Testgerät frei ist.
Was ich nicht verstehe, ist, warum man, um alle Daten zu einem Geschäft zu erhalten, eine Reihe von teuren HistoryDealGet*-Funktionen aufrufen muss? Es gibt nur einen Aufruf, um die MqlDeal-Struktur zu füllen.
Wenn der Benutzer mit der Historie über die HashMap arbeiten will, muss er natürlich die CHashMap<ulong, MqlDeal> ausfüllen.
Wir haben keine MqlDeal-Struktur, weil die Handelsdatensatzformate fließend sind und regelmäßig erweitert werden. Ohne sie ist es unmöglich, die Funktionalität der Plattform zu erweitern.
Daher besteht die einzige Möglichkeit darin, über die Funktion Get auf sie zuzugreifen. Und der Zugriff auf andere Felder des zuvor aufgerufenen Datensatzes ist um ein Vielfaches schneller als der erste Zugriff, da der Datensatz zwischengespeichert wird.
Und es reicht aus, die Korrektheit von DealTicket einmal zu überprüfen und nicht jedes Mal.
Im obigen Test wird jedes Mal eine neue Anzahl von Geschäften angezeigt, wodurch der Cache des zuvor ausgewählten Geschäfts ständig unterbrochen wird. Außerdem gibt es keine Garantie dafür, dass sich zwischen den Anrufen nicht etwas geändert hat. Sie können immer noch zwischen den Anfragen für die Geschichte handeln.
Wie kann es kostenlos sein? Überhaupt nicht kostenlos.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Generische Klassenbibliothek - Bugs, Beschreibung, Probleme, Anwendungsfälle und Vorschläge
fxsaber, 2017.12.08 22:46
Der Berater eröffnet 100.000 Trades und sucht dann nach dem Gesamtgewinn von zufälligen Trades mit verschiedenen Methoden (siehe Kommentare). Ergebnis
Pro 100.000 Abschlüsse (und die gleiche Anzahl von Aufträgen) ist 1 Mikrosekunde kostenlos. Es geht um den Tester.
Im obigen Test wird die Anzahl der Angebote jedes Mal neu festgelegt, wodurch der Cache der zuvor ausgewählten Angebote ständig unterbrochen wird. Außerdem gibt es keine Garantie dafür, dass sich zwischen den Anrufen nicht etwas geändert hat. Sie können zwischen den Anfragen für den Verlauf tauschen.
So wird die Historie (insbesondere im Tester) nur ergänzt, die alten Datensätze werden nicht verändert. Die Rede ist von der Clear-Variante.
Auf dem realen Markt scheint es so zu sein, dass ein Auftrag, selbst wenn er teilweise ausgeführt wird und mehrere Geschäfte generiert, nicht in die Historie aufgenommen wird, bis er vollständig ausgeführt oder storniert wurde. D.h. die Regel der eingefrorenen Geschichte wird beibehalten.
Bei 100.000 Geschäften (und der gleichen Anzahl von Aufträgen) ist 1 Mikrosekunde kostenlos. Es geht immer nur um den Tester.
HistorySelect im Tester ist absolut virtuell/falsch, erst recht mit den Parametern 0, INT_MAX. Dies wurde schon vor langer Zeit optimiert.
Sie können HistorySelect(legt den Zugriffsbereich in den Tester) und HistoryDealSelect(Ticket), das tatsächlich nach einem bestimmten Ticket sucht und es zwischenspeichert, nicht vergleichen.