Diskussion zum Artikel "Orders, Positions und Abschlüsse in MetaTrader 5" - Seite 4

 

Bitte sagen Sie mir, wenn die Funktion OrderSend true zurückgibt und result.order ein Orderticket hat (result.order!=0), ist dann garantiert, dass die Order vom Broker akzeptiert wird und sich im Trading-Tab befindet, oder wird die Anfrage in diesem Stadium nur vom Server des Brokers akzeptiert, aber nicht von der Börse?

Und die zweite Frage, kann es eine Situation geben, in der OrderSend true zurückgibt und result.order==0?

 
Aleksey Gunin:

Können Sie mir bitte sagen, wenn die Funktion OrderSend true zurückgibt und result.order ein Orderticket hat (result.order!=0), ist dann garantiert, dass die Order vom Broker akzeptiert wird und sich im Trading-Tab befindet, oder wird die Anfrage in diesem Stadium nur vom Server des Brokers akzeptiert, aber nicht von der Börse?

Garantiert.

Und die zweite Frage, kann es eine Situation geben, in der OrderSend true zurückgibt und result.order==0?

Nein.

 
fxsaber:

Garantien.

Nein.

Erst neulich wurde eine Klarstellung für die Funktion OrderSend hinzugefügt, siehe die Online-Hilfe.

 
Rashid Umarov:

Erst neulich wurde eine Klarstellung für die Funktion OrderSend hinzugefügt, die Sie in der Online-Hilfe nachlesen können.

Gilt dies auch für Marktaufträge?

Jeder akzeptierte Auftrag wird auf dem Handelsserver gespeichert und wartet auf seine Bearbeitung, bis eine der Bedingungen für seine Ausführung eintritt:

  • Verfall,
  • das Eintreten einer Gegenanfrage,
  • Auslösung des Auftrags bei Erhalt des Ausführungspreises,
  • Eingang einer Aufforderung zur Stornierung des Auftrags.
Es ist nicht vorgeschrieben, dass das Terminal selbst OrderCheck immer vor OrderSendAsync aufruft, und OrderSend ist ein Add-on zu OrderSendAsync.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Typische Fehler und deren Beseitigung bei der Arbeit mit der Handelsumgebung

fxsaber, 2018.02.20 12:23 Uhr.

Bedingtes Schema der Implementierung des Standard OrderSend (ohne Timeout)
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Bedingter Algorithmus für die Implementierung des Standard OrderSend
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // schematischer Aufruf
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


Aus diesem Schema geht klar hervor, dass es bei der Platzierung einer Market-Order über OrderSendAsync auf demselben MetaQuotes-Demo unmöglich ist, das Ereignis der Platzierung der entsprechenden Order zu garantieren, bis die Order ausgeführt oder abgelehnt wird. Das heißt, MT5 verfügt über keine einfachen Mechanismen zur Auswertung der Zwischenergebnisse seiner OrderSendAsync.


OrderSend wird so lange ausgeführt, bis Result.request_id gleich dem gleichen Wert von OrderSendAsync in OnTradeTransaction ist. Oder es wird durch Timeout abgebrochen. Daher hängt das Ergebnis von OrderSend nur von der Art der Nachricht in OnTradeTransaction mit der entsprechenden request_id ab.

Es wäre nützlich, etwas über die Bildung der request_id selbst zu erfahren. Wenn ich es richtig verstehe, handelt es sich um einen Zähler der an den Handelsserver gesendeten Aufträge ab dem Zeitpunkt des Starts/der Verbindung des Terminals/Kontos. Das Terminal selbst analysiert die vom Handelsserver eingehenden Nachrichten und ordnet die erforderliche request_id entweder nur einer einzigen zu (was zweifelhaft ist) oder setzt die request_id auf eine bestimmte Nachricht zurück (was sehr wahrscheinlich ist). Durch dieses Verhalten war es vor einiger Zeit möglich, die Bidding History mit der OrderSend-Ausgabe in Übereinstimmung zu bringen. Da aber nur eine Nachricht in OnTradeTransaction mit der richtigen request_id sichtbar ist, kommt es zu der unangenehmen asynchronen Situation im obigen Zitat.

 

Guten Tag, ich habe Inkonsistenzen bei MqlTradeResult.deal und MqlTradeResult.order gefunden

1) Beschreibung (MQL5 Referenzhandbuch)


2) Handel in Echtzeit

Ich platziere Marktaufträge (TRADE_ACTION_DEAL). Ich gebe die Werte von MqlTradeResult mit der Funktion Print aus:


und das Geschäft erscheint im Log:

Ich habe versucht, mit der Funktion Sleep für ein paar Sekunden "einzuschlafen" und die Daten erneut auszugeben (wenn das Geschäft bereits genau getätigt wurde und die Position offen ist), die Nummer des Geschäfts ist nicht erschienen.


3) Strategie-Tester

Hier sind alle Felder ausgefüllt:



Woher kommen diese Unterschiede?

 
Konstantin Kulikov:

Guten Tag, habe Inkonsistenzen bei MqlTradeResult.deal und MqlTradeResult.order gefunden




https://www.mql5.com/de/docs/trading/ordersend

Beim Senden einer Marktorder (MqlTradeRequest.action=TRADE_ACTION_DEAL) bedeutet das erfolgreiche Ergebnis der Funktion OrderSend() nicht, dass die Order ausgeführt wurde (die entsprechenden Geschäfte wurden ausgeführt): true bedeutet in diesem Fall nur, dass die Order erfolgreich im Handelssystem zur weiteren Ausführung platziert wurde. Der Handelsserver kann die Werte der Geschäfts- oder Auftragsfelder in der zurückgegebenen Ergebnisstruktur ausfüllen , wenn ihm diese Daten zum Zeitpunkt der Bildung der Antwort auf den OrderSend()-Aufruf bekannt sind. Im Allgemeinen können das Ereignis oder die Ereignisse der Ausführung von Geschäften, die der Order entsprechen, nach dem Senden der Antwort auf den OrderSend()-Aufruf eintreten. Daher ist es bei jeder Art von Handelsanfrage erforderlich, beim Empfang des Ergebnisses der OrderSend()-Ausführung zunächst den Rückgabecode des Handelsservers retcode und den Antwortcode des externen Handelssystems retcode_external (falls erforderlich)zu prüfen , die in der zurückgegebenen Ergebnisstruktur verfügbar sind.


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

Vielen Dank für diesen informativen Artikel. @MetaQuotes

Frage: Wie kann ich in einer einzigen for()-Schleife sowohl offene Aufträge als auch offene Positionen gemeinsam durchlaufen (ähnlich wie wir in MQL4 alle Aufträge durchlaufen und dann prüfen, ob ein Auftrag bereits ausgeführt wurde oder ein schwebender Auftrag ist)?

 
Rahul Dhangar :

Vielen Dank für diesen informativen Artikel. @MetaQuotes

Frage: Wie kann ich in einer einzigen for()-Schleife sowohl offene Aufträge als auch offene Positionen gemeinsam durchlaufen (ähnlich wie wir in MQL4 alle Aufträge durchlaufen und dann prüfen, ob ein Auftrag bereits ausgeführt wurde oder ein schwebender Auftrag ist)?

Um POSITIONEN und PENDING ORDERS zu berechnen, müssen Sie zwei unabhängige Zyklen verwenden. Ein Zyklus zählt die POSITIONEN auf, der zweite Zyklus zählt die ANHÄNGIGEN ORDERS auf. Beispiel: Berechnung von Positionen und hängenden Aufträgen

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

Ich weiß, dass Sie sich nicht wirklich um diejenigen kümmern, die mit der Sprache mql5 anfangen, angesichts der starken Gemeinschaft, die Sie haben, trotz vieler Kritikpunkte, hier ist noch einer:

Die Übersetzung und der Wortlaut des Textes erschweren das Verständnis... Ich habe geschwitzt, ich musste weit gehen, um herauszufinden, wer zuerst kommen sollte, da die Dokumentation sich selbst widerspricht, im Text:

  • Bestellhistorie

    Um Informationen über einen Auftrag aus der Historie zu erhalten, müssen Sie zunächst den Auftragshistorie-Cache mit einer der drei Funktionen erstellen: HistorySelect(start, end), HistorySelectByPosition() oder HistoryOrderSelect(ticket). Bei erfolgreicher Ausführung speichert der Cache die Anzahl der Aufträge, die von der FunktionHistoryOrdersTotal() zurückgegeben wird. Der Zugriff auf die Eigenschaften dieser Aufträge erfolgt über die einzelnen Elemente des Tickets unter Verwendung der entsprechenden Funktion:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, type_property)
    3. HistoryOrderGetString(ticket_order, type_property)


Im Gegensatz zu: https: //www.mql5.com/pt/docs/trading/historyorderstotal unten transkribiert.



HistoryOrdersTotal

Gibt die Anzahl der Aufträge in der Historie zurück. Bevor Sie HistoryOrdersTotal() aufrufen, müssen Sie zunächst die Historie der Trades und Orders mit demHistorySelect() Befehl oder demHistorySelectByPosition() Befehl erhalten.

int HistoryOrdersTotal();

Rückgabewert

Wert vom Typdouble.

Hinweis

Verwechseln Sie die Aufträge aus der Handelshistorie nicht mit denschwebenden Aufträgen, die auf der Registerkarte "Handel" der Toolbox-Leiste erscheinen. Die Liste derAufträge, die storniert wurden oder zu einer Transaktion geführt haben, ist auf der Registerkarte "Historie" in der Toolbox des Client-Terminals zu sehen.

Siehe auch


Die erste Passage widerspricht sich selbst, sie braucht keine Hilfe, aber die zweite kommt hinzu und verkompliziert die Dinge....: denn wer kommt zuerst, HistoryOrdersTotal oder eine der drei Funktionen HistorySelect (start, end) HistorySelectByPosition() oder HistoryOrderSelect(ticket), oder sogar HistorySelectByPosition(), die im zweiten Text erwähnt wird.

Das war schwierig, es hätte einfacher sein können... aber ich denke, das erste, was mir einfällt, ist eine der drei Funktionen HistorySelect(start, end) HistorySelectByPosition () oder HistoryOrderSelect(ticket) oder sogar HistorySelectByPosition(), die im zweiten Text erwähnt werden...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Guten Tag,
Frage an die Entwickler: können Sie mir eine ungefähre Information geben, wie viel Speicher der History-Cache benötigt? ungefähr kbytes für ein Geschäft und eine Bestellung.

Ich habe das Skript in einem Terminal mit einer kleinen Historie ausgeführt und dieses Ergebnis erhalten:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

Das bedeutet, dass bei einer Historie von ein paar Millionen Geschäften und einer Million Aufträgen der Cache etwa ein Gigabyte benötigt?

Und so für jedes mql-Programm?