Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXVII): Arbeiten mit Handelsanfragen - platzieren von Pending-Orders" - Seite 3
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
Es liegt nicht an mir, dass Sie sich nicht zu diesem Thema äußern wollen, aber Sie haben das Wesen dieses Themas nicht verstanden.
Sie haben entschieden, dass ich nicht verstehe, dass jede Art von zeitversetzter Abfrage ihre eigene Lösung braucht. Alle Anfragen haben ihre eigenen Eigenschaften und eine gemeinsame Lösung ist unmöglich. Eine Lösung für Bestellungen ist eine Lösung, eine andere für wiederholte Abfragen bestimmter Daten. In den letzten beiden Artikeln haben wir an einer Lösung für Bestellungen gearbeitet. Der nächste Artikel wird sich auch damit befassen. Meiner Meinung nach ist das zu lang.
3 Artikel für die Lösung einer ausstehenden Anfrage NUR für Bestellungen, von denen zwei nichts ausfüllen.... Während in der Tat (nicht in der Form) die Lösung für ausstehende Bestellungen recht einfach ist.
Sie haben entschieden, dass ich nicht verstehe, dass jede Art von anhängiger Abfrage eine andere Lösung benötigt. Alle Abfragen haben ihre eigenen Eigenschaften und eine gemeinsame Lösung ist unmöglich. Eine Lösung für Bestellungen ist eine Lösung, eine andere für wiederholte Abfragen bestimmter Daten. In den letzten beiden Artikeln haben wir uns mit einer Lösung für Bestellungen beschäftigt. Der nächste Artikel wird sich auch damit befassen. Meiner Meinung nach ist er zu lang.
3 Artikel für die Lösung einer ausstehenden Anfrage NUR für Bestellungen, von denen zwei nichts ausfüllen.... Während in der Tat (nicht in der Form) die Lösung der ausstehenden Auftragsanfrage ziemlich einfach ist.
Der Teil "unmöglich" ist ein bisschen voreilig.
Genau, das ist unmöglich. Verschiedene Objekt-Abfragen - verschiedene Eigenschaften. Man kann nicht alle Eigenschaften in ein Abfrageobjekt packen.
Ich frage mich nur, wie eine einfache Aufgabe anderthalb Monate lang in drei Artikeln gelöst werden kann. Wenn diese Programmiermethode als "effizient" gilt, dann bin ich froh, dass ich anders programmiere.
Es ist unmöglich, alle Aufrufe des EA an den Server zu verfolgen.
Ich frage, weil die Lösung für das Problem des wiederholten Versendens von fehlgeschlagenen Aufträgen (offensichtlich) keine Komplikationen erfordert und einfach zu lösen ist.
Wenn Aufträge nicht über Bibliotheksmethoden gesendet werden, muss die gesamte Handelslogik unabhängig geschrieben werden. Die Bibliothek bietet die Möglichkeit, dies nicht zu tun, zwingt Sie aber nicht dazu, alles über ihre Funktionen zu erledigen.
In einer solchen Situation kann die Bibliothek keine Handelsfunktionen verwalten, die nicht ihre eigenen sind. Sie ist jedoch in der Lage, die Tatsache eines erfolgreichen Handelsauftrags zu melden, der über Funktionen Dritter gesendet wurde.
Nutzen Sie die Funktionen der Bibliothek, um auf vom Server zurückgegebene Fehler zu reagieren und diese angemessen zu bearbeiten.
Was sehen Sie als Handler für Server-Returncodes?
Genau, das ist unmöglich. Verschiedene Abfrageobjekte - verschiedene Eigenschaften. Sie können nicht alle Eigenschaften in ein Abfrageobjekt einfügen.
Ich frage mich nur, wie eine einfache Aufgabe in drei Artikeln in eineinhalb Monaten gelöst werden kann. Wenn diese Programmiermethode als "effizient" gilt, dann bin ich froh, dass ich anders programmiere.
Bei den Objekten handelt es sich um ausstehende Handelsanfragen . Alle Informationen über Handelsanfragen werden in einer einzigen Struktur für alle Anfragen gespeichert - MqlTradeRequest.
Trollst du?
In der Tat, ich beschreibe das Konzept. Schritt für Schritt. In Artikeln (ich schreibe die Texte selbst, ich überprüfe sie drei- oder viermal auf Fehler, und ich übersehe einige davon). Ich spreche den Inhalt des Konzepts in Artikeln aus, Logik und Funktionalität, zeige, wie man es macht. Gleichzeitig denke ich vorher über verschiedene Möglichkeiten nach, von denen ein großer Teil in den Papierkorb wandert - das heißt, ich schreibe tatsächlich drei- oder viermal mehr Code, als in den Artikeln steht. Manchmal schreibe ich den gesamten Code von Grund auf neu, und zwar nach anderen Prinzipien. Dann teste ich alles im Tester und in der Demo - was in jedem Artikel beschrieben ist. Und dann vermisse ich einige Fehler und korrigiere sie später in den nächsten Artikeln.
Wenn der Code auf Anhieb funktioniert, bedeutet das, dass darin eine Bombe versteckt ist, und ich erwarte in Zukunft eine große Überraschung.
Ich bin überrascht, dass Sie alles in einer Stunde selbst schreiben. Keine Prüfungen, keine Tests, und nur so lange, wie es geht :)
Ich möchte wirklich verstehen, was Sie hier für einfach halten. Warum willst du nicht verstehen, dass dies ein Teil der zukünftigen Funktionalität anderer Teile der Bibliothek ist, und alles im Voraus "in deinem Kopf" mit dem verknüpft werden sollte, was noch nicht da ist, aber geplant ist?
Ich stelle mir nicht die Aufgabe, es einmal zu tun und es dann schweben zu lassen. Ich habe eine andere Aufgabe - nämlich zu überlegen, wie alles weiter vernetzt werden soll. Das braucht Zeit und eine bestimmte Herangehensweise. Wenn das für Sie schwierig ist, nun ja... Dann ist es kompliziert.
...
Und was sehen Sie als Server-Returncode-Handler?
Ich werde Ihnen eine kurze und effektive Lösung zeigen.
1. deklarieren Sie eine globale Variable: string Del_req;
2. Schreiben Sie die Funktion void Delayed_request(). Die Funktion wird von OnTimer() einmal pro Sekunde aufgerufen (wenn Del_req != NULL).
3. Fügen Sie den Parameter int delayed_request_ID = 0 zu jeder Handelsfunktion hinzu, die einen Auftrag sendet.
4. Jede Handelsanfrage gibt eine Serverantwort zurück. Wenn delayed_request = 0 (kein wiederholter Aufruf von Delayed_request() ) und die Serverantwort eine Wiederholung der Anfrage erfordert, schreiben die Handelsfunktionen alle Aufrufparameter in die Variable Del_req (durch zwei Trennzeichen - delayed_request_ID und Parameter) und fügen am Ende der Zeile die Anzahl der erforderlichen Versuche hinzu (z. B. 10).
5. Die Funktion Delayed_request() überprüft den String Del_req einmal pro Sekunde. Wenn die Zeichenkette nicht NULL ist, legt die Funktion sie in ein Array und durchläuft es in einer Schleife, um die Teilzeichenkette des Anrufs zu finden, findet sie, extrahiert sie aus der gesamten Zeichenkette, teilt sie auf, prüft die Art des Anrufs und übergibt die Parameter zusammen mit der delayed_request_ID an die erforderliche Handelsfunktion. Als Nächstes wird der Aufrufzähler überprüft und um eins dekrementiert. Ist der Zähler nach Abzug von eins gleich null, wird die gesamte Teilzeichenkette des Aufrufs aus der gesamten Del_req-Zeichenkette gelöscht.
6. Wenn die Handelsfunktion einen Anruf mit delayed_request_ID annimmt und die Anfrage an den Server erfolgreich war, löscht sie die Teilzeichenkette des Anrufs aus der allgemeinen Del_req-Zeichenkette (sie findet sie nach delayed_request_ID).
All dies kann an einem Tag erledigt werden und kann nicht nur auf Handelsanfragen, sondern auf alle Anfragen angewendet werden.
ZY: Das ist kein Trolling, ich bin wirklich überrascht, dass einfache Lösungen für erfahrene Programmierer nicht offensichtlich sind.
Ich werde Ihnen eine kurze und effektive Lösung zeigen.
1. eine globale Variable deklarieren : string Del_req;
2. Schreiben Sie die Funktion void Delayed_request(). Die Funktion wird von OnTimer() einmal pro Sekunde aufgerufen.
3. Fügen Sie einen Parameter int delayed_request_ID = 0 zu jeder Handelsfunktion hinzu, die einen Auftrag sendet.
4. Jede Handelsanfrage gibt eine Serverantwort zurück. Wenn delayed_request = 0 (kein wiederholter Aufruf von Delayed_request() ) und die Serverantwort eine Wiederholung der Anfrage erfordert, schreiben die Handelsfunktionen alle Aufrufparameter in die Variable Del_req (durch zwei Trennzeichen - delayed_request_ID und Parameter) und fügen am Ende der Zeile die Anzahl der erforderlichen Versuche hinzu (z. B. 10).
5. Die Funktion Delayed_request() überprüft die Zeichenkette Del_req einmal pro Sekunde. Wenn die Zeichenkette nicht NULL ist, legt die Funktion sie in ein Array und durchläuft es in einer Schleife, um den Anruf zu finden, findet ihn, extrahiert ihn aus der gesamten Zeichenkette, teilt ihn auf, prüft die Art des Anrufs und übergibt die Parameter zusammen mit der delayed_request_ID an die erforderliche Handelsfunktion. Als Nächstes wird der Aufrufzähler überprüft und um eins dekrementiert. Ist der Zähler ungleich Null, ändert Del_req den Aufrufzähler im Aufrufstring auf einen um eins kleineren Wert, ist er gleich Null, wird der gesamte Aufrufstring aus dem gesamten Del_req-String gelöscht.
6. Wenn die Handelsfunktion einen Anruf mit delayed_request_ID erhält und die Anfrage an den Server erfolgreich war, löscht sie die Teilzeichenkette des Anrufs aus der gesamten Del_req-Zeichenkette (findet sie anhand der delayed_request_ID).
All dies kann an einem Tag erledigt werden und kann nicht nur auf Handelsanfragen, sondern auf alle Anfragen angewendet werden.
ZY: Das ist kein Trolling, ich bin wirklich überrascht, dass einfache Lösungen für erfahrene Programmierer nicht offensichtlich sind.
Absichtlich Bremsen in Methoden zu drücken?
Und was ist der Unterschied zwischen der vorgeschlagenen Methode und der, die gerade gemacht wird? Abgesehen von der Tatsache, dass man sich durch teure Funktionen der Arbeit mit Strings arbeiten muss? Konzeptionell nichts. Das ist der Grund - es wird so sein, wie es beabsichtigt ist. Darüber hinaus wird das, was getan wird, und Sie wissen es noch nicht, verwendet, um die Funktionalität der Arbeit mit verzögerten Abfragen zu erweitern.
Bewusst auf die Bremse treten bei Methoden?
Und was ist der Unterschied zwischen der vorgeschlagenen Methode und der, die gerade gemacht wird? Abgesehen von der Tatsache, dass Sie sich durch teure Funktionen für die Arbeit mit Zeichenketten arbeiten müssen? Nichts. Das ist der Grund - es wird so sein, wie es beabsichtigt ist. Darüber hinaus wird das, was getan wird, und Sie wissen es noch nicht, verwendet, um die Funktionalität der Arbeit mit verzögerten Abfragen zu erweitern.
Tun Sie, was Sie für richtig halten. Es ist Ihre Kreativität. Ich habe meine Meinung geäußert.
Und es gibt keine Bremsen. Anhängige Anfragen werden immer noch einmal pro Sekunde gesendet.
Der Unterschied besteht darin, dass schwebende Anfragen nicht zu vollwertigen Objekten werden und daher nicht viel Code mit sich bringen.
Tun Sie, was Sie für richtig halten. Es ist Ihre Kunst. Ich habe meine Meinung gesagt.
Und es gibt keine Bremsen. Anhängige Anfragen werden sowieso einmal pro Sekunde gesendet.
Warum werden sie einmal pro Sekunde gesendet? Um den Handelsserver zu überfluten?
Der Unterschied besteht darin, dass schwebende Abfragen nicht zu vollwertigen Objekten werden und somit nicht viel Code hinter sich herziehen.
Und ich brauche vollwertige Objekte, um das zu implementieren, was ich weiter geplant habe. Aber das wissen Sie noch nicht, und Sie versuchen, uneffektive Lösungsansätze für einen kleinen Teil der Aufgabe für die weitere Arbeit anzubieten. Und hier ist alles miteinander verbunden, und das allgemeine Konzept ist das gleiche - die anderen Dinge, die in der Zukunft geplant sind, hängen von diesem kleinen Teil ab.
Wie auch immer, danke für Ihre Meinung - jede Meinung ist nützlich und macht Sinn.
ZY: Und ja, es ist nicht schlimm, ein funktionierendes, erweiterbares und kompatibles Stück Code zu schreiben, anstatt ständig gedankenlos geschriebene unvollständige Lösungen für die nächsten Aufgaben neu zu schreiben.