Mein EA macht einen doppelten Eintrag - Seite 9

 

Hallo

Dieser Ansatz funktioniert nur, wenn die aktuelle Positionsgröße Null ist und der neue Trade erfolgreich mit der gewünschten Positionsgröße ausgeführt wird.

Siehe Code:

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


Was aber, wenn Ihr EA die Position umdreht: von einer LONG- zu einer SHORT-Position oder umgekehrt und diese Aktion in 2 verschiedenen Trades ausgeführt wird?

Nach dem ersten Handel wird der Boolean "position_opened" auf "TRUE" gesetzt und der EA kann den zweiten Handel nicht öffnen, da die Bedingung"if(conditions_to_open && !position_opened)" geprüft wird, also wird der zweite Handel blockiert.

Und was ist, wenn die Positionsgröße nur teilweise geöffnet ist? Dann brauchen Sie einen zweiten Handel, um Ihre Positionsgröße auf die richtige Größe zu bringen.


Um es kurz zu machen: Sie brauchen immer die Funktion PositionSelect(Symbol()), um die AKTUELLE Positionsgröße zu berechnen, und genau hier hat das Problem angefangen (und dieser Forumsbeitrag).

Im kritischen Moment, wenn der EA die Funktion PositionSelect(Symbol()) aufruft, hat das Terminal die AKTUELLE Positionsgröße noch nicht aktualisiert und der EA arbeitet mit der falschen Positionsgröße und sendet eine neue doppelte Order an den Handelsserver.


Ich denke, dass der Ansatz von(figurelli) besser ist, weil Sie gezwungen sind zu warten, bis der EA die Funktion PositionSelect(Symbol()) auf die richtige Positionsgröße aktualisiert hat.


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

Hallo

Dieser Ansatz funktioniert nur, wenn die aktuelle Positionsgröße Null ist und der neue Trade erfolgreich mit der gewünschten Positionsgröße ausgeführt wird.

Siehe Code:


Was aber, wenn Ihr EA die Position umdreht: von einer LONG- zu einer SHORT-Position oder umgekehrt und diese Aktion in 2 verschiedenen Trades ausgeführt wird?

Nach dem ersten Handel wird der Boolean "position_opened" auf "TRUE" gesetzt und der EA kann den zweiten Handel nicht öffnen, da die Bedingung"if(conditions_to_open && !position_opened)" geprüft wird, also wird der zweite Handel blockiert.

Und was ist, wenn die Positionsgröße nur teilweise geöffnet ist? Dann brauchen Sie einen zweiten Handel, um Ihre Positionsgröße auf die richtige Größe zu bringen.


Um es kurz zu machen: Sie brauchen immer die Funktion PositionSelect(Symbol()), um die AKTUELLE Positionsgröße zu berechnen, und genau hier hat das Problem angefangen (und dieser Forumsbeitrag).

Im kritischen Moment, wenn der EA die Funktion PositionSelect(Symbol()) aufruft, hat das Terminal die AKTUELLE Positionsgröße noch nicht aktualisiert und der EA arbeitet mit der falschen Positionsgröße und sendet eine neue doppelte Order an den Handelsserver.


Ich denke, dass der Ansatz von(figurelli) besser ist, weil man gezwungen ist zu warten, bis der EA die Funktion PositionSelect(Symbol()) aktualisiert hat.


Sie haben recht, beide Ansätze haben ihre Grenzen.

Der Ursprung dieses Problems ist nun klar identifiziert. Jeder muss seinen Code abhängig von seiner Strategie anpassen. Ich glaube nicht, dass es eine allgemeine Methode gibt, die auf alle Fälle anwendbar ist.

 
Brauchen wir eine OrderSendReliable()-Bibliothek für das große und mächtige mql5?
 
Ubzen:
Brauchen wir eine OrderSendReliable()-Bibliothek für das große und mächtige mql5?
Ich glaube nicht, dass Sarkasmus eine Hilfe sein kann. Obwohl es eindeutig ein schlechtes Design ist, das zu einer solchen Komplexität führt.
 
angevoyageur:

Sie haben recht, beide Ansätze haben ihre Grenzen.

Der Ursprung dieses Problems ist nun klar identifiziert. Jeder muss seinen Code je nach seiner Strategie anpassen. Ich glaube nicht, dass es eine allgemeine Methode gibt, die auf alle Fälle anwendbar ist.


Oder wir müssen auf eine "offizielle Erklärung" von den Metaquotes-Leuten selbst warten.

Gibt es bereits eine Antwort vom Service Desk?

 
angevoyageur: Ich glaube nicht, dass Sarkasmus eine Hilfe sein kann. Obwohl es eindeutig ein schlechtes Design ist, das zu einer solchen Komplexität führt.

Würden Sie es als nicht hilfreich betrachten, wenn ich Ihnen zustimme? .

Ich habe nur gelehrt, dass die Lösung, bis zur Beendigung des Handels zu schlafen, mich an OrderSendReliable() erinnerte. Ich habe gelehrt, dass man das eleganter hätte lösen können.

Es erinnert mich auch an die Handhabung von old_documents ... wo es heißt { and all trading should be stopped }.

Wie auch immer, Entschuldigung, ich wollte nicht auf mql5 herumhacken.

 
snelle_moda:


Oder wir müssen auf ein "offizielles Statement" von den Metaquotes-Leuten selbst warten.

Gibt es schon eine Antwort vom Service Desk?

Nein. Ich habe gerade darüber nachgedacht... Es wäre wahrscheinlich sinnvoll, wenn alle Betroffenen ein Ticket an den ServiceDesk über dieses Problem schreiben würden. Allerdings bin ich sehr skeptisch, ob MQ bereit ist, dieses Design zu ändern. Aber wir können es versuchen.

Die Leute können an ServiceDesk schreiben und die Ticketnummer hier angeben. Meines lautet

Fehler, MetaTrader 5 MQL, Öffnen, Starten: 2013.12.23 19:08, #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

Wenn ich mit Ihnen übereinstimme, würden Sie es als nicht hilfreich betrachten? .

Ich habe nur gelehrt, dass die Lösung "Schlafen bis zum Beenden des Handels" mich an OrderSendReliable() erinnert hat. Ich habe gelehrt, dass man das eleganter hätte lösen können.

Es erinnert mich auch an die Handhabung von old_documents ... wo es heißt { and all trading should be stopped }.

Wie auch immer, Entschuldigung wollte nicht auf mql5 herumhacken.

Ich frage mich, ob ein ähnliches Problem nicht auch in mql4 existieren kann, ich habe in den letzten Monaten mindestens 2 Themen im mql4-Forum von Benutzern gelesen, die sich über doppelte Trades beschwerten. Ich bin nicht sicher, ob es damit zusammenhängt, aber es kann sich lohnen, diese Themen zu überprüfen. Haben Sie diese Themen auch gelesen?
 
angevoyageur: Ich frage mich, ob es ein ähnliches Problem nicht auch in mql4 gibt, ich habe in den letzten Monaten mindestens 2 Themen im mql4-Forum von Benutzern gelesen, die sich über doppelte Trades beschwerten. Ich bin nicht sicher, ob es damit zusammenhängt, aber es kann sich lohnen, diese Themen zu überprüfen. Haben Sie diese Themen auch gelesen?

Ja, aber es ist schwer zu sagen, ob es an einer schlechten Codierung liegt. Der Doppelhandel war schon vor dem Thread über den Mehrfachhandel ein Problem. Die Art, wie es traditionell gehandhabt wird, ist die Art, wie snelle_moda es handhabt.

 
Ubzen:

Ja, aber es ist schwer zu sagen, ob es an einer schlechten Codierung liegt. Der Doppelhandel war schon vor dem Thread über den Mehrfachhandel ein Problem. Die Art, wie es traditionell gehandhabt wird, ist die Art, wie snelle_moda es handhabt.

Ich bin nicht sicher, ob ich verstehe, was Sie meinen. Das Problem, über das wir in diesem Thema sprechen, wird nicht durch eine schlechte Kodierung verursacht, sondern durch ein schlechtes Design in mql5 (das ist meine Meinung, oder vielleicht ist es einfach ein Bug?). Was meinen Sie mit "mehrere Handelsfäden"?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.