Mein EA macht einen doppelten Eintrag - Seite 4

 
doshur:

Kann ich fragen, ob PositionSelect() die Client-Seite oder die Server-Seite überprüft?

Ich habe das starke Gefühl, dass das Problem durch die Verzögerung verursacht wird, bei der der Server (Broker-Seite) die Anfrage verarbeitet und die Client-Seite nicht aktualisiert, weshalb PositionSelect() erneut ausgeführt wird.

Ich bin der festen Überzeugung, dass es keinen Unterschied zwischen cTrade und MqlTradeRequest gibt und dass die Sleep-Funktion dazu beitragen sollte, alles zu verzögern, damit unsere Client-Seite "aktualisiert" wird, bevor PositionSelect() erneut ausgeführt wird und einen doppelten Eintrag verursacht. Überprüfen von meinem Journal Tab, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

Wenn ich mehr als 400 schlafe, sollte das sicher sein.

What do you think?


"Ich habe ein starkes Gefühl, dass das Problem durch die Verzögerung verursacht wird, wo Server (Broker-Seite) ist die Verarbeitung der Anfrage und nicht aktualisiert die Client-Seite, weshalb PositionSelect() läuft wieder"

Ich denke auch, dass dies die Ursache für die doppelte Eingabe ist. In meinem Code ist es theoretisch unmöglich, eine neue Order zu senden, wenn die aktuelle Positionsgröße gleich oder größer als die maximal zulässige Positionsgröße ist. Wenn also PositionSelect() nicht rechtzeitig den Status der aktuellen Position erhält, sendet mein EA wieder eine neue Order.


"Putting Sleep mehr als 400 sollte sicher sein???"

Je größer das Zeitintervall, desto besser, aber es gibt ein Problem. Wenn Sie Ihre Position in zwei Schritten umdrehen (LONG zu SHORT oder SHORT zu LONG), kann diese zusätzliche Zeitverzögerung die Ursache für einen schlechten Ausführungskurs sein, insbesondere bei makroökonomischen Ereignissen.

 
snelle_moda:


"Ich habe das starke Gefühl, dass das Problem durch die Verzögerung verursacht wird, bei der der Server (Brokerseite) die Anfrage verarbeitet und die Clientseite nicht aktualisiert, weshalb PositionSelect() erneut ausgeführt wird.

Ich denke auch, dass dies die Ursache für die doppelte Eingabe ist. In meinem Code ist es theoretisch unmöglich, eine neue Order zu senden, wenn die aktuelle Positionsgröße gleich oder größer als die maximal zulässige Positionsgröße ist. Wenn also PositionSelect() nicht rechtzeitig den Status der aktuellen Position erhält, sendet mein EA wieder eine neue Order.


"Putting Sleep mehr als 400 sollte sicher sein???"

Je größer das Zeitintervall, desto besser, aber es gibt ein Problem. Wenn Sie Ihre Position in zwei Schritten umdrehen (LONG zu SHORT oder SHORT zu LONG), kann diese zusätzliche Zeitverzögerung die Ursache für einen schlechten Ausführungskurs sein, insbesondere bei makroökonomischen Ereignissen.

Ich denke, das sollte kein Problem sein. Mein EA kehrt nicht sofort um, wenn ich gerade eine Kauf-/Verkaufsanfrage gesendet habe. Ich setze meinen Sleep auf 800ms, damit mein EA genügend Zeit hat, auf die Updates des Brokers zu warten. Hoffentlich kann Sleep dieses Problem hier beheben.
 
doshur:
Ich weiß nicht, ob Broker spielt auseinander hier, aber es scheint, unser Broker ist das gleiche. Alpari.

Pls entfernen Makler Name, wenn nötig.
Ja, der Broker ist derselbe.
 
snelle_moda:


Ich habe seit dem 10.03.2013 1 weiteren Doppeleintrag erhalten. Ich verwende beide Methoden für den Versand meiner Bestellung. Siehe meinen vorherigen Beitrag.

ah huh... genau wie ich erwartet habe...
 

Dies ist, was ich gerade implementiert. hoffentlich kann das Problem zu lösen

if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0))
            {
               Sleep(800);

               if(m_Trade.ResultRetcode() == 10009)
               {
                  Print("Position opened in ", Symbol());

                  return;
               }
               else
               {
                  Print("Error opening position in ", Symbol(), " - ", m_Trade.ResultComment(), "\n", "Return Code Desc - ", m_Trade.ResultRetcodeDescription());
               }
            }
            else
            {
               Print("Error with PositionOpen in ", Symbol(), " - ", m_Trade.ResultComment(), "\n", "Return Code Desc - ", m_Trade.ResultRetcodeDescription());
            }
 
doshur:

Dies ist, was ich gerade implementiert. hoffentlich kann das Problem zu lösen

Soweit ich weiß, zeigt ein Ergebniscode = 10008 auch an, dass ein Handel gut platziert ist.
 

Ich denke, es ist sehr wichtig, den Grund für dieses Problem zu finden, natürlich ist es auch wichtig, einen Workaround (Sleep ?) zu haben, bis wir vollständig verstehen können, was passiert ist. Also versuche ich, die Situation wieder aufzunehmen:

  • Bei der Verwendung der Methode PositionOpen aus der CTrade-Klasse haben mindestens 3 Benutzer zu einem bestimmten Zeitpunkt 2 Geschäfte in dieselbe Richtung getätigt anstatt eines, was zu einer Position mit einem verdoppelten Volumen im Vergleich zu dem, was erwartet wird, führt.
  • Der Code, der ursprünglich von doshur gepostet wurde, kann erklären, warum er in seinem Log "Position opened in..." sehen kann, obwohl kein Handel eröffnet wurde. Das liegt daran, dass, auch wenn PositionOpen() true zurückgibt, dies nicht bedeutet, dass ein Handel platziert wurde. Siehe Dokumentation. Aber es kann nicht erklären, warum ein "doppelter" Handel platziert wurde.
  • Ich kann nur 2 Erklärungen für diesen "doppelten" Handel sehen:
  1. PositionSelect() gibt nicht immer die wahre Situation der Position zurück. Eine Position wird geöffnet, aber PositionSelect gibt false zurück. Ein Fehler in PositionSelect also.
  2. Es wurde ein Handel platziert, aber wenn PositionSelect() beim nächsten Tick aufgerufen wird, existiert die Position noch nicht. Um zu verstehen, ob dies möglich ist, müssen wir den Ablauf der Operation kennen, wenn ein Handel platziert wird.
  • Dieses Problem scheint bei demselben Broker aufzutreten, mit einem Symbol, bei dem Depth of Market aktiviert ist (können die betroffenen Personen dies bitte bestätigen).
  • Das Problem tritt bei synchronen Aufträgen auf, asynchrone Aufträge wurden nicht verwendet (bitte bestätigen).
  • Das Problem tritt zufällig auf.
  • Klammeraffe berichtet, dass das Problemnicht mehr auftritt , aber ich kann nicht erkennen, wie der von ihm gepostete Code das erklären kann. Wird dieser Code bei jedem Tick ausgeführt? Wird dieser Code nach der Verwendung von PositionSelect() ausgeführt? Vielleicht hat er also die Ursache des Fehlers beseitigt, oder es ist nur ein Zufall.
  • Nachdem ich den Code überprüft habe, kann ich keinen Unterschied zwischen der Verwendung der CTrade-Klasse oder MqlTradeRequest mit OrderSend direkt erkennen.

Ich stimme mit snella_moda überein, dass die beste Erklärung ist:

I think the problem is the (to slow) execution of the PositionSelect(Symbol()) function. Maybe, the new ticks come in so fast, the EA sends in a new order before it receives a response of the PositionSelect(Symbol()). So the current position size is not calculated properly. In my code, its theoretically impossible to send in a new/double order if the current position size is equal or greater than the max allowed position size, see code. 

Aber es ist schwierig, das zu überprüfen.

Ich denke, das Beste ist, Metaquotes um Rat zu fragen. Ich werde das versuchen.

 
angevoyageur:
  • Klammeraffe berichtet, dass das Problemnicht mehr besteht, aber ich kann nicht erkennen, wie der von ihm gepostete Code das erklären kann. Wird dieser Code bei jedem Tick ausgeführt? Wird dieser Code nach der Verwendung von PositionSelect() ausgeführt? Vielleicht hat er also die Ursache des Fehlers beseitigt, oder es ist nur ein Zufall.

Die Zeile bezüglich "each tick" könnte der Grund sein, warum der Fehler nicht mehr auftritt.

Die Funktion wird nur ausgeführt, wenn ein neuer Balken erscheint. Wahrscheinlich kann also nur der erste Tick eines Balkens einen Handel ausführen. Nach dem ersten Takt bekommt der Code ein 'Return', bis ein neuer Takt erscheint. Vielleicht hat das das Problem für mich gelöst.

Ich glaube, dieses Stück Code stammt aus dem Artikel:

//-------------------------------------------------- Check for new bar     
         static datetime OldTime;
         datetime NewTime[1];
         bool newBar=false;
         
         int copied=CopyTime(Symbol(),Period(),0,1,NewTime);
         if (copied>0)
           {
             if (OldTime != NewTime[0])
               {  
                 newBar=true;
                 OldTime=NewTime[0];
               }
           }
         else
           {
            Print("Error in copying historical times data, error =",GetLastError());
            ResetLastError();
            return;
           }  
         if(newBar==false) return;      
//-------------------------------------------------- Check for new bar
 
Klammeraffe:

Die Zeile bezüglich "each tick" könnte der Grund sein, warum es nicht mehr passiert.

Die Funktion wird nur ausgeführt, wenn ein neuer Balken erscheint. Daher kann wahrscheinlich nur der erste Tick eines Balkens einen Handel ausführen. Nach dem ersten Takt bekommt der Code einen 'Return', bis ein neuer Takt erscheint. Vielleicht hat das das Problem für mich gelöst.

Ich glaube, dieser Teil des Codes stammt aus den Artikeln:

Ja, ich denke schon. Ich danke Ihnen.
 
  • Der Code, der ursprünglich von doshur gepostet wurde, kann erklären, warum er in seinem Log "Position opened in..." sehen kann, obwohl kein Handel eröffnet wurde. Das liegt daran, dass, auch wenn PositionOpen() true zurückgibt, dies nicht bedeutet, dass ein Handel platziert wurde (siehe Dokumentation). Aber es kann nicht erklären, warum ein "doppelter" Handel platziert wurde.

Korrektur. Es gibt eine doppelte"Position eröffnet in..." und 2 Trades wurden eröffnet.

  • Dieses Problem scheint bei demselben Broker aufzutreten, mit einem Symbol, bei dem die Markttiefe aktiviert ist (können die betroffenen Personen dies bitte bestätigen).
Ich bin mir nicht sicher, wie es bei anderen aussieht, aber bei mir ist DOM aktiviert.

  • Dieses Problem tritt bei synchronen Aufträgen auf, asynchrone Aufträge wurden nicht verwendet (bitte bestätigen).
Ich verwende die Standardeinstellungen von cTrade.

  • Das Problem tritt zufällig auf.
ja, zufällig