Alert: MT4 Terminal dupliziert von Experten gesendete Orders - Seite 5

 

Hallo Freunde:

Es tut mir leid, dass ich nicht früher geantwortet habe: Ich wusste nichts von Ihren Beiträgen, weil ich keine Benachrichtigung von Metaquotes erhalten habe. Ich habe zwar ein Häkchen gesetzt, wie RaptorUK empfohlen hat, aber sie haben nie geantwortet. Ich mache das Gleiche wie JamesMadden, wenn es nötig ist: Ich schließe einfach den Auftrag und verliere den Spread. Wenn es nicht so riskant ist, belasse ich es einfach dabei! (wenn mein EA profitabel ist, wird er auf lange Sicht mehr gewinnen als verlieren) Aber natürlich mag ich den Fehler nicht.

Jetzt habe ich neue Probleme mit Build 600 und ich würde gerne wissen, wenn jemand weiß, wie man sie zum Antworten bringt :)

PD: Wie kann ich diese Webanwendung dazu bringen, mir eine E-Mail zu schicken, wenn dieser Beitrag aktualisiert wird? Ich bin bereits auf das Thema abonniert.

 
Ricardo1:

Hallo Freunde:

Es tut mir leid, dass ich nicht früher geantwortet habe: Ich wusste nichts von Ihren Beiträgen, weil ich keine Benachrichtigung von Metaquotes erhalten habe. Ich habe zwar ein Häkchen gesetzt, wie RaptorUK empfohlen hat, aber sie haben nie geantwortet. Ich mache das Gleiche wie JamesMadden, wenn es nötig ist: Ich schließe einfach den Auftrag und verliere den Spread. Wenn es nicht so riskant ist, belasse ich es einfach dabei! (wenn mein EA profitabel ist, wird er auf lange Sicht mehr gewinnen als verlieren) Aber natürlich mag ich den Fehler nicht.

Jetzt habe ich neue Probleme mit Build 600 und ich würde gerne wissen, wenn jemand weiß, wie man sie dazu bringt, zu antworten :)

Wenn Sie es herausfinden, lassen Sie es mich wissen ... Ich habe ein offenes Ticket vom März 2013, auf das ich nie eine Antwort erhalten habe. Ich kann nur vorschlagen, jedes Mal neue Kommentare hinzuzufügen und nach Neuigkeiten oder einer Antwort zu fragen.


PD: Wie bekomme ich diese Webanwendung dazu, mir eine E-Mail zu schicken, wenn dieser Beitrag aktualisiert wird? Ich habe das Thema bereits abonniert.

E-Mail-Benachrichtigungen funktionieren schon seit ein paar Jahren nicht mehr... vielleicht können Sie das dem Service Desk melden.
 
RaptorUK:
Wenn Sie es herausfinden, lassen Sie es mich wissen. Ich habe ein offenes Ticket vom März 2013, auf das ich nie eine Antwort erhalten habe. Ich kann nur vorschlagen, immer wieder neue Kommentare hinzuzufügen und nach Neuigkeiten oder einer Antwort zu fragen.

E-Mail-Benachrichtigungen funktionieren schon seit einigen Jahren nicht mehr ... vielleicht könnten Sie es dem Service Desk melden



Hallo!

Ich habe gerade dieses Thema gefunden, weil ich nach genau diesem Problem gesucht habe. Ich habe das Problem vorher nicht bemerkt, aber heute ist es bei mir aufgetreten.

Unabhängig vom Expertenprotokoll, das, wie bereits erwähnt, Trades aufzeichnet, gibt es das MetaTrader-Journal, das alle Trades aufzeichnet, die von EA oder von einer Person getätigt wurden. Heute habe ich in meinem Portfolio einen Handel gefunden, der ein Duplikat eines nur wenige Sekunden zuvor getätigten Handels war, aber der zweite Handel erschien weder im Expertenprotokoll noch im MetaTrader-Journal.

Ich habe meinen Broker gebeten, seine Protokolle der eingehenden Aufträge mit den ausgeführten Geschäften zu vergleichen, aber ich vermute, dass er entweder keine Protokolle führt oder keine Nachforschungen anstellen will.

Wenn der EA 2 Aufträge platziert hat, würde ich erwarten, beide im Journal zu sehen. Selbst wenn die Desktop-Anwendung aus irgendeinem Grund die Anfrage dupliziert hat, würde ich erwarten, dass der Server antwortet und den zweiten Handel aufzeichnet. Es scheint eher so, dass der Handel vom Server und nicht vom Client ausgeführt wird.

Dies ist das erste Mal, dass ich das Problem bemerke, und ich kann keine Möglichkeit finden, das Problem zu reproduzieren. Die Beträge, mit denen ich jetzt arbeite, sind sehr klein, so dass der Wert nicht wichtig ist, aber es gibt Anlass zur Sorge über die Funktionsfähigkeit von MetaTrader.

Ich dachte nur, ich würde meine Gedanken zu einem Thema beisteuern, das schon eine Weile im Raum steht.

Bearbeiten:

Ich habe weiter nachgeforscht und einen weiteren Fall gefunden. Die Order war bereits durch den Stop Loss geschlossen worden, so dass ich es nicht bemerkt habe. In beiden Fällen hat der EA eine erwartete Order platziert. Diese wird im Journal angezeigt, unmittelbar gefolgt von einer Login-Meldung, die mit der Platzierung der Phantom-Order übereinstimmt.

Falls noch jemand glaubt, dass ein Phantomauftrag aufgetreten ist, überprüfen Sie bitte die Login-Nachricht im Journal. Sie könnte von Bedeutung sein.

 

Es scheint, dass ich nicht der einzige bin, der von diesem lästigen Problem betroffen ist. Gleich wie spikedog, mein EA für eine Markt-Order, die in einem anderen doppelten Eintrag der gleichen Losgröße innerhalb von Millisekunden führte angefordert, doppelte Auftragsprotokoll wurde im Journal, aber nicht Experten Registerkarte angezeigt; Ich habe seitdem meine Codes leicht geändert, um hoffentlich besser gegen dieses Problem zu schützen, indem Sie doppelte Handel innerhalb der gleichen Bar (Handel auf Bar offen nur) direkt vor OrderSend() filtern.

Es ist das erste Mal, dass ich dieses Problem mit den doppelten Trades hatte; ich hatte seither mehr als 500 Trades bei 3 Brokern eröffnet und bis jetzt kein Problem. Btw, die nachfolgenden Trades funktioniert wieder gut.

Wie beigefügt ist mein Code zu verarbeiten OrderSend(), wenn die doppelte Problem passiert. Ich kann nicht sehen, wie mein EA ist die Ursache für die doppelte Bestellung. Der einzig mögliche Grund, den ich mir jetzt vorstellen kann, ist vielleicht, dass der Server bei einer sehr seltenen Gelegenheit meine OrderSend verarbeitet hat, aber irgendwie "-1" zurückgibt und mein EA eine weitere Anfrage stellt, die die erste als Requote behandelt. Nur meine bloße Spekulation.


            bool Buy_Ticket = false;
            while(Buy_Ticket==false){     //Loop to solve Requote issues
               for(int BT_count=0; BT_count < RequoteTries; BT_count++){
                  if (!IsTradeAllowed()) Sleep(RequoteTries_WaitingTime);
                  RefreshRates();

                  int B_Spread = MarketInfo(Symbol(), MODE_SPREAD);  //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
                     for(int buyMod=0; buyMod < OrdersTotal(); buyMod++){
                        if (OrderSelect(buyMod,SELECT_BY_POS,MODE_TRADES)){
                           if ((OrderSymbol()!=Symbol()) || (OrderType()!=OP_BUY)) continue;
                           if ((OrderStopLoss()==0) && (OrderTakeProfit()==0)){
                              double B_SL = NormalizeDouble((OrderOpenPrice()-((B_Spread*Point)+stoploss)),Digits);
                              double B_TP = NormalizeDouble((OrderOpenPrice()+takeprofit),Digits);

                              bool buy_ModSL_succeed = false;
                              while(buy_ModSL_succeed==false){     //Loop to solve SL+TP modify Requote issues   
                                 for(int buyMod_count=0; buyMod_count < RequoteTries; buyMod_count++){
                                    if (!IsTradeAllowed()) Sleep(5000);
                                    RefreshRates();                                 
                                    if (OrderModify(OrderTicket(), OrderOpenPrice(), B_SL, B_TP, 0, Red)==false) continue;
                                    buy_ModSL_succeed = true;
                                    Print(entrycode_txt," initiated Long trade successfully modified SL & TP.");
                                    break;                        
                                 }  //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false){
                                    getError = GetLastError();
                                    Alert("Error: ",getError," in Buy order#:",OrderTicket()," modify for SL:",B_SL," & TP:",B_TP," after ",RequoteTries," attempts.");
                                    break;
                                 }
                              }  //End WHILE loop for SL+TP modify requote handling
                           }  //End IF statement to select new orders without SL & TP
                        }  //End IF orderselect
                     }  //End FOR loop to modify new orders without SL & TP 
                  }  //End IF statement when buy order accepted & need SL+TP modify

                  if (Buy_Ticket==false) continue;
                  else break;
               }  //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket==false) break;    //Exit WHILE loop to handle Requote issues, fail to buy
            }  //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman:

Ich kann nicht erkennen, wie mein EA die Ursache für die doppelte Bestellung ist.

Es könnte mit diesem Fehler in Ihrem Code zusammenhängen, Sie sollten ihn beheben und erneut testen....

                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed

OrderSend() gibt ein int zurück, nicht ein bool, so dass die Überprüfung, ob der Rückgabewert "true" ist, falsch ist.

 

@BigFisherman

B.T.W, was ist mit deinem Code los?

if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
if (Buy_Ticket==false) continue;

und wieder ?

else break;
 
RaptorUK:

Es könnte mit diesem Fehler in Ihrem Code zusammenhängen, Sie sollten ihn beheben und erneut testen...

OrderSend() gibt ein int und kein bool zurück, so dass die Überprüfung, ob der Rückgabewert "true" ist, falsch ist.


Danke raptoruk für den Vorschlag. Sie haben Recht :)
 
BigFisherman:

Danke raptoruk für die Anregung. Dessen bin ich mir bewusst. Ich glaube jedoch nicht, dass das die Ursache für den doppelten Handel ist, denn der vorgestellte Code ist gültig, wenn auch etwas verwirrend.
Wie kann der Code gültig sein? Wenn OrderSend() funktioniert, erhalten Sie einen Wert größer als 0 zurück, d.h. die Ticketnummer, wenn es fehlschlägt, erhalten Sie -1 zurück, Sie testen auf wahr oder falsch ... korrigieren Sie Ihren Code und beseitigen Sie die Unsicherheit.
 
RaptorUK:
Wie ist der Code gültig? Wenn die OrderSend() funktioniert, erhalten Sie einen Wert größer als 0 zurück, d.h. die Ticketnummer, wenn es fehlschlägt, erhalten Sie -1 Sie testen auf wahr oder falsch ... Korrigieren Sie Ihren Code und entfernen Sie die Unsicherheit.



Nochmals vielen Dank.

Prost!

 
RaptorUK:
Wie ist der Code gültig? Wenn OrderSend() funktioniert, erhalten Sie einen Wert größer als 0 zurück, d.h. die Ticketnummer, wenn es fehlschlägt, erhalten Sie -1 zurück, Sie testen auf true oder false ... korrigieren Sie Ihren Code und beseitigen Sie die Unsicherheit.


Hallo RaptorUK,



Ich habe eine Frage, die nicht genau das Thema dieses Threads betrifft, aber ich hoffe, dass ich meinen vorherigen Beitrag als Beispiel verwenden kann, um mein Verständnis von mql4 Coding zu vertiefen und vielleicht auch anderen Anfängern wie mir zu helfen (wenn Sie denken, dass es off-topic ist und einen neuen Thread braucht, löschen Sie bitte diesen und lassen Sie es mich wissen).

Ich war zunächst etwas verwirrt über meine ursprüngliche Art und Weise der Deklaration von Buy_Ticket als bool statt int, also habe ich weitere Tests dazu durchgeführt. Ich stimme zwar zu, dass meine ursprüngliche Art, OrderSend() als bool zu lesen, keine gute Art der Codierung ist (verwirrend), aber mein Test zeigt, dass sie gültig ist. Um es einfacher für das Lesen zu machen, habe ich das folgende codiert, bitte beraten und danke für Ihre Zeit.


P.S.: Wie empfohlen, habe ich meinen EA bereits geändert, um OrderSend() als int zu lesen.



//+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for (int SimRun=0; SimRun<3; SimRun++){
      bool Buy_Ticket = 0;
      int Ordersend = 0;            //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

      switch (SimRun)
      {
         case 0: break;             //FOR Ordersend==0
         case 1:
         {
            Ordersend = 1;          //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
            break;
         }
         case 2:
         {
            Ordersend = -1;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
            break;
         }
      }
      
      
      // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0;   //SIMPLIFIED CODE FOR EASIER READING
      
      
      if (Buy_Ticket==true){
         Print("** Buy_Ticket returns true  **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
      else{                         //if (Buy_Ticket==false)
         Print("** Buy_Ticket returns false **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+


Journal

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0
Grund der Beschwerde: