Funktion OrderSendAsync() - Seite 3

 

Technische Meldung. Zusammenfassen interessanter Aussagen zu einem Thema.

sergeev:

Yedelkin:
Welche Kontoeigenschaft ist für das Limit der gleichzeitigen Aufträge in der Ausführungswarteschlange verantwortlich? Ist es möglich, diese Zahl programmgesteuert zu ermitteln?

wird das Ergebnis der Funktion OrderSendAsync = false einfach sein

es als Leitfaden verwenden

 
Rosh:

Ich habe den Thread mit Interesse gelesen und ihn sogar in der Praxis getestet, und hier habe ich die eklatante Diskriminierung des automatischen Handels entdeckt.

Hier ist das Protokoll des manuellen Stellenabbaus: (verständliche Chronologie von unten nach oben)

2012.04.26 22:32:05     Trades  '686934': deal #9256820 sell 0.02 EURUSD at 1.32391 done (based on order #10091825)
2012.04.26 22:32:05     Trades  '686934': order #10091825 sell 0.02 / 0.02 EURUSD at 1.32391 done
2012.04.26 22:32:05     Trades  '686934': accepted instant sell 0.02 EURUSD at 1.32391
2012.04.26 22:32:04     Trades  '686934': instant sell 0.02 EURUSD at 1.32391

Was wir hier sehen: Der Auftrag wird gesendet, der Auftrag wird angenommen, dem Auftrag wird ein Ticket zugewiesen, und schließlich wird der Auftrag ausgeführt (es kann einige Verschiebungen in der Interpretation geben, aber das war's auch schon). Alles ist klassisch.

Seltsam ist nur, dass das Ereignis "Trades" (innerhalb des Terminals) mit Sicherheit weiß, durch welche Kategorie es ausgelöst wurde, sowie durch welche Reihenfolge (für die letzten beiden Kategorien); andernfalls wäre es unmöglich, einen solchen Kommentar auszugeben, und der Programmierer müsste das Rad neu erfinden, um diese Informationen zu erhalten. Und die Situation mit der Funktion OrderSendAsync hat die Sache nicht einfacher gemacht.

Es ist jedoch festzustellen, dass die Geschwindigkeit der Auftragsausführung zugenommen hat. Jetzt haben wir keine Zeit mehr, um zu bemerken, dass der Auftrag in die Warteschlange gestellt wird, und er ist bereits ausgeführt worden.


Wir haben also ein Bündel von Aufträgen, von denen jeder theoretisch 4 Trades umfasst, in jedem der Trades müssten wir jeden Auftrag kontrollieren.

Wir haben also 4*Anzahl_Auftrag*Anzahl_Auftrag Kontrollpunkte, d.h. wir haben 400 für 10 Aufträge und 40000 für 100. Und Gott bewahre, irgendeine Order hätte weniger Trades als 4, dann bricht die gesamte Kontrolllogik zusammen, da das Warten vor dem Senden einer zweiten Order (wenn die erste Anfrage nicht ausgeführt wird) genau bei Nummer 4 stattfindet.

 

Sie haben einen Stapel von Handelsaufträgen an den Server gesendet.

Müssen Sie für jeden Auftrag eine separate Ausführungskontrolle durchführen? Und wie lange müssen wir auf eine Antwort warten?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
joo:

Muss jeder Auftrag separat überwacht werden?

Ja

Und wie lange muss ich auf eine Antwort warten?

Das ist von Makler zu Makler unterschiedlich. Wenn STP, ist es eher eine Frage für seinen Liquiditätsanbieter.
 
sergeev:

ja

Sie haben nicht dieselbe Funktion für verschiedene Makler. Wenn STP, dann ist es eher eine Frage für ihren Liquiditätsanbieter.

Wenn Sie das Fenster manuell öffnen, drücken Sie auf "Kaufen", warten auf ein Angebot oder eine Ausführung, drücken auf "OK" und sind fertig.

Wenn Sie im automatischen Modus öffnen, sollte es auch einen Referenzpunkt geben, von dem aus Sie eine zweite Anfrage senden müssen, sonst ist alles in Ordnung.

SZS hat den obigen Beitrag ergänzt, lesen Sie ihn noch einmal.

 
Urain:

Nein, das ist reines Rätselraten, wenn Sie manuell ein Fenster öffnen, auf "Kaufen" drücken, auf eine Rückfrage oder Ausführung warten, auf "OK" drücken und fertig.

Nein. Dies ist der Fall, wenn der Rückgabecode DONE(10009) lautet.

Es gibt aber auch Makler, die Ihren Handel an den Anbieter weitergeben. Und in diesem Fall werden Sie sofort PLACED(10008) zurückgegeben. Übrigens, wenn es sich um eine Marktorder handelt, wird in dieser Antwort kein Deal-Ticket erscheinen, sondern nur das Order-Ticket.

Und im Falle von OrderSendAsync wird es nicht einmal ein Ticket für die Bestellung geben.

Im Automodus sollte dies der Referenzpunkt sein, von dem aus Sie eine zweite Anfrage senden wollen, sonst ist alles in Ordnung.

Nun, was ist der Referenzpunkt bei Requotes sogar auf MT4? Sie werden keine Endlosschleife bilden und auf die Löschung oder Eröffnung eines Auftrags warten.

Alles ist vom Typ Ticket, mit Überprüfung der gespeicherten Zustände, usw.

Документация по MQL5: Торговые функции / OrderGetTicket
Документация по MQL5: Торговые функции / OrderGetTicket
  • www.mql5.com
Торговые функции / OrderGetTicket - Документация по MQL5
 

Versucht, die Funktion OrderSendAsync() auszuführen

//+------------------------------------------------------------------+
//|                                               OrderSendAsync.mq5 |
//+------------------------------------------------------------------+
MqlTradeResult  res={0};
MqlTradeRequest req={0};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   req.action=TRADE_ACTION_PENDING;
   req.symbol=_Symbol;
   req.volume=1.0;
   req.price=3.0;
   req.type=ORDER_TYPE_BUY_STOP;
   req.type_filling=ORDER_FILLING_RETURN;
   switch(OrderSendAsync(req,res))
     {
      case  true:
         Print("retcode=",res.retcode,", order=",res.order,", deal=",res.deal);
         break;
      default: Print("Неудача при отправке запроса функцией OrderSendAsync()");
     }
  }

Sie antwortete mit

2012.05.02 21:12:33 OrderSendAsync (USDCHF,M1) retcode=10008, order=0, deal=0

Es stellt sich eine kurze Frage: Wie wollen wir das Schicksal einer Handelsanfrage verfolgen, wenn sie mit der Funktion OrderSendAsync() gesendet wird, wenn wir nicht einmal das Auftragsticket kennen? Der Kommentar muss vom Makler ausgefüllt werden.

 
Der asynchrone Modus ist für die Eingabe von Massenaufträgen gedacht, nicht aber für eine einzelne Transaktion. Für eine einzelne Transaktion ist es besser, den synchronen Modus zu verwenden - alles wird mit der gleichen Geschwindigkeit und mit voller Leistung ausgeführt.

Verfolgen Sie die Ausführung von asynchronen Transaktionen in OnTrade. Ja, dies ist ein komplizierterer Weg, aber das ist der Preis der Asynchronität.
 
Renat:
Der asynchrone Modus ist für die Eingabe von Massenaufträgen gedacht, nicht aber für eine einzelne Transaktion. Für eine einzelne Transaktion ist es besser, den synchronen Modus zu verwenden - alles wird mit der gleichen Geschwindigkeit und mit voller Leistung ausgeführt.

Verfolgen Sie die Ausführung von asynchronen Transaktionen in OnTrade. Ja, es ist ein komplizierterer Weg, aber das ist der Preis der Asynchronität.
Okay, ich möchte eine Frage klären: Wie soll jemand das Schicksal von fünfhundert Handelsanfragen in einem Massenversand von Aufträgen verfolgen? Da jeder Massenversand von Aufträgen aus einer Vielzahl von Einzeltransaktionen besteht, wird jeder das Prinzip des Vergleichs des vorherigen und des aktuellen Stands der Geschichte anwenden? Gibt es keine anderen Ansätze?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
Die Wurzel des Verständnisses ist, dass asynchrone Prozesse
1) garantiert nicht die Rechtzeitigkeit oder sogar die Verfügbarkeit der Antwort
2) erfordert eindeutig getrennte Warteschlangen von Operationen durch den Entwickler

Mit anderen Worten, wir müssen eine Liste von Aufträgen erstellen und diese dann in OnTrade prüfen und ausführen. Das ist natürlich sehr unangenehm.

Wir unsererseits könnten asynchrone Warteschlangen transparent verwalten, sie mit Antworten füllen und den Händlern bequeme Funktionen zur Verfügung stellen, um verarbeitete Einträge in der Warteschlange zu überprüfen und abzurufen. Sie können die Warteschlangen in OnTrade asynchron oder synchron überprüfen, indem Sie die Abfrage in der Schleife direkt nach dem Senden eines Stapels von Aufträgen durchführen.

Wir werden über einen solchen Mechanismus nachdenken - er würde den EA-Entwicklern das Leben leichter machen, indem er sie von ihrer Routine entlastet.