Fragen zu OrderSend() - Seite 8

 

Während wir auf einen Artikel zu diesem Thema warten, frage ich mich, ob ich das allgemeine Konzept der Analyse von Handelsgeschäften richtig verstehe.

...
bool AllowTrade = true;
ulong OrderTicket;
...
void OnTick() {
  ...
  if (!AllowTrade) return;
  ...
  MqlTradeResult Result;
  if (OrderSend(...)) {
    Ticket = Result.order;
    AllowTrade = false;
  }
}
...
void OnTrade() {
  if (AllowTrade) return;
  if (OrderSelect(Ticket)) {
    if (...)
    ...
    // AllowTrade = true|false;
  }
  else AllowTrade = true;
}
...

D.h. grob gesagt, nach dem Senden einer Order ohne Analyse des Retcodes verbieten wir die Handelsoperationen in der Arbeitsschleife (OnTick()) mit dem "AllowTrade"-Flag.

Das Handelsverbot wird in OnTrade() erst dann aufgehoben, wenn die Auftragsnummer gefunden wurde und eine Analyse ihres Schicksals durchgeführt wurde.

Wir haben zwei Fragen:

1. Welches ist das in OnTrade zu prüfende Auftragsticket? Welche Status sind während seiner Lebensdauer endgültig?

2. Ich weiß, dass die Warteschlange der Tick-Ereignisse (OnTick) "abfallen" kann. D.h. wenn ein anderes Tick-Ereignis eintrifft und die OnTick-Funktion (vom vorherigen Tick) ihre Arbeit noch nicht beendet hat, wird das aktuelle Ereignis "fallen gelassen", d.h. es wird nicht verarbeitet. Gibt es einen ähnlichen Ansatz bei Handelsereignissen (OnTrade)? D.h., ist es möglich, dass ich z.B. in der Hauptschleife ein Handelsverbot ausspreche und das OnTrade-Ereignis für den gerade gesendeten Auftrag "ausfällt", weil ich im Moment seines Eintreffens noch etwas im selben Tick wie das Senden des entsprechenden Handelsauftrags verarbeite?

 
voix_kas: D.h., besteht die Wahrscheinlichkeit, dass ich z.B. in der Hauptschleife ein Handelsverbot erteile und das OnTrade-Ereignis für die soeben gesendete Order "ausfällt", da ich im Moment seines Eintreffens noch etwas im selben Tick wie das Senden der entsprechenden Handelsorder bearbeite?

Ich habe mich noch nicht mit diesem Thema befasst, aber im Handbuch steht Folgendes:

1) Die Länge der Transaktions-Warteschlange beträgt 1024 Einträge. Wenn OnTradeTransaction() zu lange braucht, um eine andere Transaktion zu verarbeiten, können alte Transaktionen in der Warteschlange durch neuere verdrängt werden;

2) OnTrade wird nach entsprechenden OnTradeTransaction-Aufrufen aufgerufen.

 
Yedelkin:

Ich habe mich noch nicht mit diesem Thema befasst, aber im Handbuch steht Folgendes:

1) Die Länge der Transaktions-Warteschlange beträgt 1024 Einträge. Wenn OnTradeTransaction() zu lange braucht, um eine andere Transaktion zu verarbeiten, können alte Transaktionen in der Warteschlange durch neuere verdrängt werden;

2) OnTrade wird nach entsprechenden OnTradeTransaction-Aufrufen aufgerufen.

Generell verstanden. Wiepapaklass bereits angedeutet und in dem Artikelhttps://www.mql5.com/ru/articles/232 gesagt hat:

Es gibtnur eine garantierte Methode, um herauszufinden, was sich auf einem Handelskonto genau geändert hat. Auf diese Weise wird der Stand des Handels und der Handelsgeschichte gespeichert und der neue Stand mit dem gespeicherten verglichen.

Ein weiterer Serviceblock im Expert Advisor. :(

Die Frage ist eigentlich die folgende. Kann man den Code verkleinern, ohne alle Variablen (Aufträge/Geschäfte/Positionen) zu analysieren, und sich nur auf die aus dem OrderSend-Ergebnis erhaltene Auftragsnummer konzentrieren? Oder ist diese Zahl vielleicht nicht einmalig bzw. nicht in der Historie enthalten?

 
voix_kas: Kann man den Code verkleinern, ohne alle Variablen zu analysieren (Aufträge/Handelsgeschäfte/Positionen), und sich nur auf den Auftrag konzentrieren, dessen Nummer aus dem Ergebnis des OrderSend ermittelt wird? Oder ist diese Zahl vielleicht nicht einmalig bzw. nicht in der Historie enthalten?

Ja, natürlich. Wenn ein Handelsauftrag zum Erhalt eines Auftragstickets geführt hat, dann ist dieses Ticket eindeutig und das gesamte Schicksal des Auftrags kann anhand dieses Tickets nachvollzogen werden.

Hier können Sie sehen, wie das Auftragsticket in der Historie verwendet wird: MQL5 Referenz / Handelsfunktionen / HistoryOrderGetInteger

 
Yedelkin:
Ja, natürlich. Wenn eine Handelsanfrage zu einem Auftragsticket geführt hat, dann ist dieses Ticket eindeutig und kann verwendet werden, um das gesamte Schicksal des Auftrags zu verfolgen.
Nur zur Information. Wird der Variable MqlTradeResult.order ein Standardwert (z. B. "0") zugewiesen, wenn der Auftrag vom Server nicht zur Ausführung angenommen wurde, z. B. bei einem Requote?
 
voix_kas: Wird der MqlTradeResult-Variable Result.order ein Standardwert (z. B. "0") zugewiesen, wenn ein Auftrag vom Server nicht zur Ausführung angenommen wurde, z. B. ein Requote?
Eine Variable vom Typ MqlTradeResult wird normalerweise vor ihrer Verwendung auf Null gesetzt. Das Feld Result.order enthält also einen Nullwert. Ich habe noch nie erlebt, dass dieses Feld nach dem erfolglosen Absenden einer Handelsanfrage einen anderen Wert angenommen hat.
Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - Документация по MQL5
 
Yedelkin:
Eine Variable vom Typ MqlTradeResult wird normalerweise auf Null gesetzt, bevor sie verwendet wird. Das Feld "Ergebnis.Auftrag" enthält also den Wert Null. Ich habe noch nie gesehen, dass dieses Feld nach dem erfolglosen Senden einer Handelsanfrage einen anderen Wert annimmt.
Wenn Sie nichts dagegen haben, würde ich gerne näher auf die Frage der Interpretation von Rücksendecodes eingehen. 24 von 30 gemeldeten Antworten (hoffentlich gibt es keine ungemeldeten) deuten eindeutig auf eine fehlgeschlagene Auftragserteilung hin. Die anderen 6: 1. TRADE_RETCODE_PLACED Nehmen wir an, dass wir keine schwebenden Aufträge erteilen. Ist diese Reaktion im Markthandel (SYMBOL_TRADE_EXECUTION_MARKET) möglich? 2. TRADE_RETCODE_DONE Es kann nichts weiter geprüft werden. Alles lief genau so, wie vom Expert Advisor beschrieben. 3. TRADE_RETCODE_DONE_PARTIAL Ich nehme an, dass diese Antwort ähnlich ist wie TRADE_RETCODE_DONE im Modus ORDER_FILLING_IOC, wenn ohne Pending Orders gehandelt wird. 4. TRADE_RETCODE_ORDER_CHANGED Bedeutet dies eine eindeutige Ablehnung unseres Handelsauftrags? 5. TRADE_RETCODE_LOCKED Ich denke, dies ist der schlimmste Fall. Was sollten wir in diesem Fall tun? Ich vermute, dass die Bestellnummer noch nicht verfügbar ist. Die Handelsströme sind rege. Wir können nicht handeln, und es ist nicht klar, wie wir wissen können, dass der Handelsfluss nicht blockiert ist. 6. TRADE_RETCODE_FROZEN Bedeutet dies eine eindeutige Ablehnung unseres Handelsauftrags? Bitte kommentieren Sie die einzelnen Punkte.
 

voix_kas: Если не возражаете, хотелось бы углубиться в вопрос интерпритации кодов возврата. Из 30 задекларированных вариантов ответа (будем надеятся, что с недекларированными мы не столкнёмся) 24 - указывают на явный отказ в размещении ордера. Остальные 6:  

1 TRADE_RETCODE_PLACED Keine schwebenden Aufträge vorausgesetzt. Ist diese Antwort während des Markthandels möglich (SYMBOL_TRADE_EXECUTION_MARKET)?

TRADE_RETCODE_DONE Es kann nichts weiter geprüft werden. Alles lief genau so, wie es der Expert Advisor verlangt hatte.

3. TRADE_RETCODE_DONE_PARTIAL Ich gehe davon aus, dass diese Antwort dieselbe ist wie TRADE_RETCODE_DONE angesichts des Modus ORDER_FILLING_IOC.

4. TRADE_RETCODE_ORDER_CHANGED Bedeutet dies eine eindeutige Ablehnung unseres Handelsauftrags?

5. TRADE_RETCODE_LOCKED Ich denke, dies ist der schlimmste Fall. Was sollten wir in diesem Fall tun? Ich vermute, dass die Bestellnummer noch nicht verfügbar ist. Die Handelsströme sind rege. Wir können keinen Handel treiben, und es ist nicht klar, woher wir wissen sollen, ob der Handelsfluss freigegeben ist.

6. TRADE_RETCODE_FROZEN Bedeutet dies eine eindeutige Ablehnung unseres Handelsauftrags?

Bitte kommentieren Sie die einzelnen Punkte.

Leider reichen meine Kenntnisse nicht aus, um auf jeden einzelnen Punkt einzugehen. Nun, wenn etwas passiert, werden meine Kollegen es korrigieren.

1. Im Forum wurde einmal eine Situation erwähnt, in der ein Handelskonto bei einem Untermakler eröffnet werden kann. In diesem Fall kann der Untermakler den Geschäftsauftrag zur weiteren Bearbeitung (an den Makler) senden und TRADE_RETCODE_PLACED an das Kundenterminal senden. Es ist nicht bekannt, ob der Makler eine solche Handelsanfrage letztendlich bearbeiten wird.

2. Ja, das denke ich auch. Das Einzige, was wir uns merken sollten, ist, dass die Informationen über diesen Auftrag asynchron in der Terminaldatenbank eingehen.

Ich denke, es geht um die teilweise Ausführung eines Handelsauftrags in den Modi ORDER_FILLING_IOC und ORDER_FILLING_RETURN.

4. https://www.mql5.com/ru/forum/1111/page124#comment_18407

5. Ich weiß absolut nichts über diesen Code. Es stellt sich heraus, dass die Anfrage aus internen Gründen des Brokers nicht bearbeitet wurde. Ob es später bearbeitet wird, ist nicht klar. Ich selbst setze diesen Code mit der Ablehnung eines Handelsantrags gleich.

6. https://www.mql5.com/ru/forum/1111/page123#comment_18372

...und allgemein - versuchen Sie eine Stichwortsuche im Forum. Sie können viele weitere Informationen finden :)

 
Yedelkin:

Leider verfüge ich nicht über genügend Wissen, um mich zu jedem einzelnen Punkt ausführlich zu äußern. Nun, wenn überhaupt, werden die Kollegen dies korrigieren.

1. Im Forum wurde einmal eine Situation erwähnt, in der ein Handelskonto bei einem Untermakler eröffnet werden kann. In diesem Fall kann der Untermakler den Geschäftsauftrag zur weiteren Bearbeitung (an den Makler) senden und TRADE_RETCODE_PLACED an das Kundenterminal senden. Es ist nicht bekannt, ob der Makler eine solche Handelsanfrage letztendlich bearbeiten wird.

2. Ja, das denke ich auch. Das Einzige, was wir uns merken sollten, ist, dass die Informationen über diesen Auftrag asynchron in der Terminaldatenbank eingehen.

Ich denke, es geht um die teilweise Ausführung eines Handelsauftrags in den Modi ORDER_FILLING_IOC und ORDER_FILLING_RETURN.

4. https://www.mql5.com/ru/forum/1111/page124#comment_18407

5. Ich weiß absolut nichts über diesen Code. Es stellt sich heraus, dass die Anfrage aus internen Gründen des Brokers nicht bearbeitet wurde. Ob es später bearbeitet wird, ist nicht klar. Ich selbst setze diesen Code mit der Ablehnung eines Handelsantrags gleich.

6. https://www.mql5.com/ru/forum/1111/page123#comment_18372

...und allgemein - versuchen Sie eine Stichwortsuche im Forum. Hier finden Sie viele weitere Informationen :).

Hier haben wir folgendes: 26 von 30 Codes (einschließlich TRADE_RETCODE_ORDER_CHANGED und TRADE_RETCODE_FROZEN) bedeuten eine ausdrückliche Ablehnung des Antrags (es wird kein Auftrag erzeugt).

TRADE_RETCODE_DONE und TRADE_RETCODE_DONE_PARTIAL - garantiert erstellter Auftrag.

Es stellt sich die Frage, wie man TRADE_RETCODE_PLACED (nicht schwebend) und TRADE_RETCODE_LOCKED korrekt ausführt. Kommentare von MQ zu diesen beiden Codes sind erwünscht.

 
Das ist cool, frohes neues Jahr #2015 an alle, aber ich frage mich, wie es endete. Zwei Jahre lang war es still....