Mein EA macht einen doppelten Eintrag - Seite 10

 
angevoyageur: Ich bin nicht sicher, ob ich verstehe, was Sie meinen. Das Problem, über das wir in diesem Thema sprechen, wird nicht durch eine schlechte Codierung, sondern durch ein schlechtes Design in mql5 verursacht (das ist meine Meinung, oder vielleicht ist es einfach ein Fehler?). Was meinen Sie mit "multiple trading thread" ?

Ich bin zurückgegangen und habe noch einmal gelesen, was Sie als schlechtes Design ansehen.

In old-mt4 gibt es diese Klasse nicht. Die normale Methode zur Überprüfung auf Successful_Orders ist Ticket#==(-1) && GetLastError(). Ich habe noch nie einen Fall gesehen, in dem Ihre Order ein gültiges Ticket# und GLE=0 zurückgibt, aber beim nächsten Tick liefert Ihre OrdersTotal() immer noch 0.

Ich habe nicht die gesamte mql5-Dokumentation durchgelesen. Aber wenn dort steht, dass die PositionSelect_Information erst später aktualisiert wird. Und jemand verwendet PositionSelect, um seine Eingabelogik auszuwerten. Dann muss diese Person warten, bis die PositionSelect_Information aktualisiert wird, bevor sie die OrderSend-Logik verlässt.

Die Sache mit dem Thread... Ich sprach von mehreren Threads im Vergleich zu einem einzelnen Thread für das Senden von Aufträgen. Wie bei gleichzeitigen Aufträgen, die zur gleichen Zeit geöffnet werden. Das kann hier relevant sein, muss es aber nicht.

 
Ubzen:

Ich bin zurückgegangen und habe noch einmal gelesen, was Sie als schlechtes Design ansehen.

In old-mt4 gibt es diese Klasse nicht. Die normale Methode zur Überprüfung auf Successful_Orders innerhalb ist Ticket#==(-1) && GetLastError(). Ich habe noch nie einen Fall gesehen, in dem eine Bestellung ein gültiges Ticket# zurückgibt und GLE=0 ist, aber beim nächsten Tick gibt die Funktion OrdersTotal() immer noch 0 zurück.

Ich habe nicht die gesamte mql5-Dokumentation durchgelesen. Aber wenn dort steht, dass die PositionSelect_Information erst später aktualisiert wird. Und jemand verwendet PositionSelect, um seine Eingabelogik auszuwerten. Dann muss diese Person warten, bis die PositionSelect_Information aktualisiert wird, bevor sie die OrderSend-Logik verlässt.

Die Sache mit dem Thread... Ich sprach von mehreren Threads im Vergleich zu einem einzelnen Thread für das Senden von Aufträgen. Wie bei gleichzeitigen Aufträgen, die zur gleichen Zeit geöffnet werden. Das kann hier relevant sein, muss es aber nicht.

In der Dokumentation zu PositionSelect steht nichts von "wird erst später aktualisiert". Sie besagt nur, dass die Informationen über eine Position veraltet sein können, selbst wenn PositionSelect wahr ist, was mit Ihrem Problem hier nichts zu tun hat.

Ich werde mir die Zeitnehmen, einige Tests zu machen , wenn der Markt geöffnet ist , um sicher zu sein, dass ich nichts Dummes sage, eine vollständigere Antwort später.

 
angevoyageur:

In der Dokumentation zu PositionSelect steht nichts von "wird erst später aktualisiert". Sie sagt nur, dass selbst wenn PositionSelect wahr ist, die Informationen über eine Position veraltet sein können, was nichts mit Ihrem Problem hier zu tun hat.

Ich werde mir die Zeitnehmen, einige Tests durchzuführen , wenn der Markt geöffnet ist , um sicher zu sein, dass ich nichts Dummes sage, eine vollständigere Antwort folgt später.

K..... und btw, wenn das Dokument nichts aussagt, dann stimme ich mit Ihnen völlig überein.

Die Frage, die wir dem Service_Desk letztendlich stellen werden, lautet: "Warum können Sie die Positionsinformationen nicht aktualisieren, wenn trade.PositionOpen()==true?"

Sie werden wahrscheinlich eine gute Antwort für uns haben .

 
angevoyageur:

Nein. Ich habe gerade darüber nachgedacht... Es wäre wahrscheinlich sinnvoll, wenn alle Betroffenen ein Ticket an ServiceDesk über dieses Problem schreiben würden. Allerdings bin ich sehr skeptisch, ob MQ bereit ist, dieses Design zu ändern. Aber wir können es versuchen.

Die Leute können an ServiceDesk schreiben und die Ticketnummer hier angeben. Meines lautet

Fehler, MetaTrader 5 MQL, Öffnen, Starten: 2013.12.23 19:08, #916435


Ich habe auch den Service Desk informiert, #933192 | 2014.01.19 14:44

 

Kann MQ dies wirklich einfach umgestalten, um eine Timeout-Funktion zu haben?

Wie keine Antwort, dann bekommen wir einen Fehler, etwas in der Art?

 
doshur:

Kann MQ dies wirklich einfach umgestalten, um eine Timeout-Funktion zu haben?

Zum Beispiel keine Antwort, dann bekommen wir einen Fehler, oder so ähnlich?


Sie haben genau das Gegenteil gemacht. Als mql5 erstellt wurde, gab es einen Timeout-Parameter für Funktionen wie PositionSelect.

Aber sie haben ihn später entfernt, siehe Punkt 9 hier https://www.mql5.com/en/forum/53/page5#comment_14479

 

Ich stimme mit den Argumenten eines schlechten Designs überein, aber meiner Meinung nach bestand das Hauptproblem bei MQL5 darin, einen erfolgreichen Forex-basierten Code so anzupassen, dass er auch mit Aktienmärkten funktioniert (was wirklich eine tolle Sache ist).

Zum Beispiel verwenden mehrere Börsen das FIX-Protokoll als Standard, und für mich ist dieses Kommunikationsprotokoll nicht einfach an einen Code oder eine Architektur anzupassen.

Wie auch immer, ich glaube, die MQ-Jungs hatten eine zeitliche Herausforderung und mussten MQL5 auf der Grundlage von MQL4 und nicht von Grund auf neu entwickeln. Ich erinnere mich, dass die Meisterschaft in diesem Jahr ausgesetzt wurde, damit sie mehr Zeit haben.

Vielleicht kann dieses Thema also ein guter Ratschlag für zukünftiges MQL6 und für eine wirklich neue Architektur von Grund auf sein, vor allem in Bezug auf die Belastbarkeit von Transaktionen und agnostische Lösungen, die in jedem Markt funktionieren.

 
doshur:

Kann MQ dies wirklich einfach umgestalten, um eine Timeout-Funktion zu haben?

Wenn zum Beispiel keine Antwort erfolgt, erhalten wir einen Fehler oder so etwas in der Art?

Traditionell bedeutet TimeOut nicht, dass der Auftrag nicht in eine Position umgewandelt wird. Sie müssen eine längere Zeit warten, um zu prüfen, ob der Auftrag tatsächlich zu einer Position wird, und schließlich den Handel aussetzen, wenn der Auftrag nicht ausgeführt wird.

Ich denke, MQ würde sich der Meinung von figurelli anschließen, dass dies ein Programmierfehler ist. Denn die Funktionen, auf denen trade.PositionOpen aufbaut, besagen eindeutig, dass Sie andere Dinge überprüfen müssen.


****** (Hinzufügen einer persönlichen Agenda ... Sie können an dieser Stelle aufhören zu lesen) *******

Das ist der Grund, warum ich neue Programmierer nicht mit Funktionen und deren Rückgabewerten belästige, wenn ich ihnen im mql_forum helfe. Ich sehe keinen Sinn darin, zu sagen, dass man immer das Folgende tun soll.

if( AuftragSenden()<0 ) { Print( GetLastError() ); }

Das soll ein automatischer Händler sein ... Sie könnten weg sein ... und was er macht ist Print()?

Meiner Meinung nach sind Error_Handling und Error_Reporting 2_sehr unterschiedliche Monster. Der Versuch, die korrekte Behandlung eines Fehlers zu erklären, könnte seitenlang dauern und es ist eine sehr persönliche Entscheidung des Händlers, wie oft er es erneut versuchen sollte oder ob er den Handel beenden sollte.

**** Ich will damit nicht sagen, dass ein Neuling, der einen EA programmiert und Probleme beim Handel hat ... Dass sie nicht Print( GetLastError(); ) <- Dies sollte offensichtlich sein. Aber wenn ich ihnen sage, sie sollen immer Get_Error, dann sollte ich ihnen auch sagen, sie sollen immer Handle_Error. *** Ende der Agenda. ****

 
angevoyageur:


Sie haben genau das Umgekehrte gemacht. Als mql5 erstellt wurde, gab es einen Timeout-Parameter für Funktionen wie PositionSelect.

Aber sie haben ihn später entfernt, siehe Punkt 9 hier https://www.mql5.com/en/forum/53/page5#comment_14479

Zeit, ihn wiederzubeleben?
 
doshur:
Zeit, es wiederzubeleben?

Das glaube ich nicht. Ein synchroner Handelsauftrag muss in allen Aspekten synchron sein. So einfach ist das.

Hier ist die Anfrage synchron, aber dann muss man sich um asynchrone Dinge kümmern. Und darüber ist nichts dokumentiert.