Dieses Diagramm zeigt, dass es bei der Platzierung eines Marktauftrags mit OrderSendAsync in MetaQuotes-Demo unmöglich ist, den entsprechenden Auftrag zuverlässig abzufangen, bis er entweder ausgeführt oder abgelehnt wird. D.h. es gibt in MT5 keine einfachen Mechanismen zur Auswertung von Zwischenergebnissen ihrer OrderSendAsync.
Kurz gesagt: Wenn es einen Marktauftrag gibt, ist er auch als "Position" zu betrachten. In Anführungszeichen, weil es sich um eine umbrochene Position handelt. Der hervorgehobene Code wird normalerweise nirgendwo angezeigt. Sie vermeidet jedoch die Wiedereröffnung von Positionen. Das Interessanteste ist hier in rot hervorgehoben. Die Notwendigkeit dieses Chips ist nicht sofort ersichtlich.
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++; // если мы сюда попадаем при проверке состояния, не запускать стратегию вообще, т.к. это промежуточное состояние.
Möglicherweise gibt es beim nächsten Tick kein Handelssignal. Da ich selbst MT4 verwende, kann ich nicht umhin, solche "Positionen" zu sehen, ohne in Schwierigkeiten zu geraten.
Die richtige Option anhand eines einfachen Beispiels
Kurz gesagt: Wenn es einen Marktauftrag gibt, ist er auch als "Position" zu betrachten. In Anführungszeichen, denn es handelt sich um eine verpackte Position. Der hervorgehobene Code wird normalerweise nirgendwo angezeigt. Sie vermeidet jedoch die Wiedereröffnung von Positionen. Das Interessanteste ist hier in rot hervorgehoben. Die Notwendigkeit dieses Chips ist nicht sofort ersichtlich.
Es geht darum, dass es so genannte "closing market orders" gibt. Die gleiche SL/TP. Natürlich möchten wir solche Marktaufträge nicht als "Positionen" sehen. Und wir möchten nicht, dass diese Aufträge, die wir erteilt haben, auch noch geschlossen werden. Die hervorgehobene Bedingung ist also der geeignete Filter.
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++;
Ich lade alle Interessierten ein, diese Frage zu diskutieren. Meine Meinung zu diesem Thema ist folgende:
Wir senden eine Bestellung an den Server.
Ein Marktauftrag erscheint und kann eventuell storniert werden, aber haben wir ihn bereits als Position gezählt?
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) &&
!OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb))
Res++;
Diese Schleife fügt eine Position hinzu, wenn ein Auftrag gefunden wird, der keinen Positionsbezeichner hat (die ID ist Null).
Wir haben eine weitere Stelle zurückgegeben.
Was passiert, wenn die Bestellung vom Server storniert wird?
...
Ich denke, dass wir bei der Berechnung von Marktaufträgen WRONG_VALUE zurückgeben sollten, zum Beispiel, wenn wir einen gefunden haben - Positionen können nicht kleiner als Null sein. Dies ist ein Signal, dass ein nicht erfasster Marktauftrag vorliegt. Aber nicht, um die Anzahl der Stellen zu erhöhen.
Die richtige Option anhand eines einfachen Beispiels
Ich denke, es ist besser, wenn der Auftrag noch nicht in der Position verbucht ist, sondern einfach abgewartet wird, bis er verbucht ist.
Ich verstehe die Idee nicht.
Dieses Diagramm zeigt, dass es bei der Platzierung eines Marktauftrags mit OrderSendAsync in MetaQuotes-Demo unmöglich ist, den entsprechenden Auftrag zuverlässig abzufangen, bis er entweder ausgeführt oder abgelehnt wird. D.h. es gibt in MT5 keine einfachen Mechanismen zur Auswertung von Zwischenergebnissen ihrer OrderSendAsync.
scheint ein Thema zu sein,
Ich möchte darauf hinweisen, dass dieser Code :
funktioniert in der DEMO einwandfrei (result=request),
aber bei REAL - ist es unmöglich, ein Ergebnis zu erhalten (Ergebnis=0.0). ... Es sei denn, Sie warten ein paar Sekunden.
Scheint zum Thema zu gehören,
Ich möchte darauf hinweisen, dass ein solcher Code :
Bei DEMO funktioniert es einwandfrei (Ergebnis=Anfrage),
aber bei REAL - ist es unmöglich, ein Ergebnis zu erhalten (Ergebnis=0.0). ... Es sei denn, Sie warten ein paar Sekunden.
Es fehlen Daten - Protokolle, Strukturfeldwerte nach OrderSend, Name des Handelsservers.
Kurz gesagt: Wenn es einen Marktauftrag gibt, ist er auch als "Position" zu betrachten. In Anführungszeichen, weil es sich um eine umbrochene Position handelt. Der hervorgehobene Code wird normalerweise nirgendwo angezeigt. Sie vermeidet jedoch die Wiedereröffnung von Positionen. Das Interessanteste ist hier in rot hervorgehoben. Die Notwendigkeit dieses Chips ist nicht sofort ersichtlich.
Möglicherweise gibt es beim nächsten Tick kein Handelssignal. Da ich selbst MT4 verwende, kann ich nicht umhin, solche "Positionen" zu sehen, ohne in Schwierigkeiten zu geraten.
Es fehlen Daten - Protokolle, Strukturfeldwerte nach OrderSend, Name des Handelsservers.
2018.02.20 15:20:35.845 Trades order #66745055 buy 0.01 / 0.01 EURUSDeur at market done in 610.625 ms
2018.02.20 15:20:35.935 Trades deal #5461453 buy 0.01 EURUSDeur at 1.23403 done (based on order #66745055)
2018.02.20 15:20:35.845 TestBUY (EURUSDeur,M15) retcode=10009 deal=0 order=66745055
Wenn die Anforderung erfüllt ist (10009), warum deal=0
Wenn die Anfrage erledigt ist (10009), warum deal=0
Das war fast der Ausgangspunkt der Diskussion. Die Links enthalten alle Einzelheiten.
Es gibt eine Lösung, damit OrderSend perfekt funktioniert, aber das wäre Werbung.
Die richtige Option anhand eines einfachen Beispiels
Kurz gesagt: Wenn es einen Marktauftrag gibt, ist er auch als "Position" zu betrachten. In Anführungszeichen, denn es handelt sich um eine verpackte Position. Der hervorgehobene Code wird normalerweise nirgendwo angezeigt. Sie vermeidet jedoch die Wiedereröffnung von Positionen. Das Interessanteste ist hier in rot hervorgehoben. Die Notwendigkeit dieses Chips ist nicht sofort ersichtlich.
Es geht darum, dass es so genannte "closing market orders" gibt. Die gleiche SL/TP. Natürlich möchten wir solche Marktaufträge nicht als "Positionen" sehen. Und wir möchten nicht, dass diese Aufträge, die wir erteilt haben, auch noch geschlossen werden. Die hervorgehobene Bedingung ist also der geeignete Filter.
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;SZY Fügen Sie diesen Code hier ein und prüfen Sie das Ergebnis auf einem Demo-Server.
Ich lade alle Interessierten ein, diese Frage zu diskutieren. Meine Meinung zu diesem Thema ist folgende:
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;Diese Schleife fügt eine Position hinzu, wenn ein Auftrag gefunden wird, der keinen Positionsbezeichner hat (die ID ist Null).
Wir haben eine weitere Stelle zurückgegeben.
Was passiert, wenn die Bestellung vom Server storniert wird?
...
Ich denke, dass wir bei der Berechnung von Marktaufträgen WRONG_VALUE zurückgeben sollten, zum Beispiel, wenn wir einen gefunden haben - Positionen können nicht kleiner als Null sein. Dies ist ein Signal, dass ein nicht erfasster Marktauftrag vorliegt. Aber nicht, um die Anzahl der Stellen zu erhöhen.