Problem bei der Eingabe mehrerer Aufträge für ein Live-Konto bei einem bestimmten Broker - Seite 3

 
figurelli:
HalloFinanceEngineer, vielleicht wäre es besser, das Problem mit den Mehrfachaufträgen in Ihrem ursprünglichen Code zu überprüfen, denn wenn wir das tun, werden wir wahrscheinlich andere kritische Punkte hier ansprechen und nicht den Fokus verlieren.

Hallo figurelli

Dies ist mein neuer Code. Ich habe ihn geändert, da ich in diesem Thread das Problem der Mehrfachorder angesprochen habe.

Bis jetzt funktioniert dieser Code gut mit mehreren Brokern. BlindMist kann diesen Code ausprobieren, um zu sehen, ob er das Multiple-Order-Problem mit diesem Broker vermeiden kann.

for(int i=0;i<10;i++)
   {

      
 
      if(volume<=0.0) break;
      

      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
         
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
      
      
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);

         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
      
      
      
      
      request.action          = TRADE_ACTION_DEAL;
      request.symbol        = mSymbol;
      request.volume        = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl                = stoploss;
      request.tp               = takeprofit;
      request.deviation     = SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
      request.type_filling   = ORDER_FILLING_FOK;
      request.comment     = strComment;
      request.magic         = EAMagic;
      
      
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      

      
      bool checkOrderSend = OrderSend(request, result);
      
      if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend was successful. Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
      

      Sleep(1000);
      
   }
   

 

 
 
FinanceEngineer:

Hallo figurelli

Dies ist mein neuer Code. Ich habe ihn geändert, da ich in diesem Thread das Problem der Mehrfachorder angesprochen habe.

Bis jetzt funktioniert dieser Code gut mit mehreren Brokern. BlindMist kann diesen Code ausprobieren, um zu sehen, ob er das Problem der Mehrfachbestellungen mit diesem Broker vermeiden kann.

Bitte verwenden Sie die SRC-Taste, wenn Sie den Code posten.

Der Code, den Sie gepostet haben, kann nicht (alle) Doppelaufträge vermeiden, und im Gegenteil, er kann in einigen Fällen Doppelaufträge provozieren.

 
angevoyageur:

Bitte verwenden Sie die SRC-Schaltfläche, wenn Sie den Code posten.

Der Code, den Sie gepostet haben, kann nicht (alle) Doppelbestellungen vermeiden, und im Gegenteil, er kann in einigen Fällen Doppelbestellungen provozieren.

Was wäre ein besserer Weg, wenn es eine Lösung gibt, außer der Einstellung von 10 Stunden Schlaf innerhalb der Schleife?
 
FinanceEngineer:

Hallo figurelli

Dies ist mein neuer Code. Ich habe ihn geändert, da ich in diesem Thread das Problem der Mehrfachorder angesprochen habe.

Bis jetzt funktioniert dieser Code gut mit mehreren Brokern. BlindMist kann diesen Code ausprobieren, um zu sehen, ob er das Problem der Mehrfachaufträge mit diesem Broker vermeiden kann.

HalloFinanceEngineer, beachten Sie, dass Sie in Ihrem ursprünglichen Code Print("OrderSend Code: "...) bei if { } und else { } haben.

Aber else { } hat einen Break, und Ihr Debug-Code zeigt retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Daraus lässt sich schließen, dass Sie den Debug-Code der if { }-Bedingung gedruckt haben und der Break nie verwendet wurde.

if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
         
      }
      else if(result.retcode==10009 || result.retcode==10008)
      { 
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }

Jetzt haben Sie Ihren Code geändert, und es sieht klarer aus, aber beachten Sie, dass Sie nicht mehr den Rückgabewert von OrderSend() testen, sondern nur den result.retcode. Sie könnten dies mit der Variablen checkOrderSend (*** siehe hier) korrigieren, nach der ich zuvor gefragt habe:

      bool checkOrderSend=OrderSend(request,result);

      if(checkOrderSend) // (*** look here)
        {
         if(result.retcode==10009 || result.retcode==10008)
           {
            Print("OrderSend was successful. Code: ",result.retcode);
            volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
            break;
           }
         else
           {
            Print(ResultRetcodeDescription(result.retcode));
           }
        }
      else 
        {
         Print("OrderSend execution error.");
        }

Meiner Meinung nach sollten Sie als Erstes diesen Test korrigieren und mit demselben problematischen Broker, den Sie gemeldet haben, erneut testen. Wenn das Problem nicht mehr auftritt, herzlichen Glückwunsch, Sie haben den Fehler wirklich gelöst, d.h. das bedeutet nicht, dass Ihr Code zukunftssicher oder der sicherste ist, sondern dass wir den Fehler gefunden haben.

Eigentlich können Sie es vergessen oder vermeiden, Ihren Code erneut zu ändern, da der Fehler nicht mehr auftritt, allerdings müssen Sie in diesem Fall darauf achten, dass Sie den Rückgabewert von OrderSend() nicht mehr testen.

Ich hoffe, diese Informationen können Ihnen helfen.

 
figurelli:

HalloFinanceEngineer, beachten Sie, dass Sie in Ihrem ursprünglichen Code Print("OrderSend Code: "...) bei if { } und else { } haben.

Aber else { } hat einen Break, und Ihr Debug-Code zeigt retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Daraus lässt sich schließen, dass Sie den Debug-Code der if { }-Bedingung gedruckt haben und der Break nie verwendet wurde.

Jetzt haben Sie Ihren Code geändert, und es sieht klarer aus, aber beachten Sie, dass Sie nicht mehr den Rückgabewert von OrderSend() testen, sondern nur den result.retcode. Sie könnten dies mit der Variablen checkOrderSend (*** siehe hier) korrigieren, nach der ich zuvor gefragt hatte:

Meiner Meinung nach sollten Sie als Erstes diesen Test korrigieren und mit demselben problematischen Broker, den Sie gemeldet haben, erneut testen. Wenn das Problem nicht mehr auftritt, herzlichen Glückwunsch, Sie haben den Fehler wirklich gelöst, d.h. das bedeutet nicht, dass Ihr Code zukunftssicher oder der sicherste ist, sondern dass wir den Fehler gefunden haben.

Eigentlich können Sie es vergessen oder vermeiden, Ihren Code erneut zu ändern, da der Fehler nicht mehr auftritt, allerdings müssen Sie in diesem Fall darauf achten, dass Sie den Rückgabewert von OrderSend() nicht mehr testen.

Ich hoffe, diese Informationen können Ihnen helfen.

Was ist mit dem Rückgabecode 10010?

Die Double Entry Order kann bei jedem Broker auftreten, die Wahrscheinlichkeit, dass sie bei Alpari auftritt, ist einfach größer, da Sie viel mehr Ticks erhalten.

 
angevoyageur:

Was ist mit dem Rückgabecode 10010?

Die Double-Entry-Order kann bei jedem Broker vorkommen, die Wahrscheinlichkeit, sie bei Alpari zu erhalten, ist einfach größer, da Sie viel mehr Ticks erhalten.

Wenn Sie mich fragen, wie ich schon sagte, halte ich diesen Code nicht für zukunftssicher und sicher genug, und dies ist nur ein Beispiel für den Mangel an Return-Code, also lesen Sie bitte noch einmal.

Allerdings, wenn Sie den Code Autor fragen, was über fragen direkt an ihn?

 
figurelli:

HalloFinanceEngineer, beachten Sie, dass Sie in Ihrem ursprünglichen Code Print("OrderSend Code: "...) bei if { } und else { } haben.

Aber else { } hat einen Break, und Ihr Debug-Code zeigt retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Daraus lässt sich schließen, dass Sie den Debug-Code der if { }-Bedingung gedruckt haben und Ihr Break nie verwendet wurde.

Jetzt haben Sie Ihren Code geändert, und es sieht klarer aus, aber beachten Sie, dass Sie nicht mehr den Rückgabewert von OrderSend() testen, sondern nur den result.retcode. Sie könnten dies mit der Variablen checkOrderSend (*** siehe hier) korrigieren, nach der ich zuvor gefragt habe:

Meiner Meinung nach sollten Sie als Erstes diesen Test korrigieren und mit demselben problematischen Broker, den Sie gemeldet haben, erneut testen. Wenn das Problem nicht mehr auftritt, herzlichen Glückwunsch, Sie haben den Fehler wirklich gelöst, d.h. das bedeutet nicht, dass Ihr Code zukunftssicher oder der sicherste ist, sondern dass wir den Fehler gefunden haben.

Eigentlich können Sie es vergessen oder vermeiden, Ihren Code erneut zu ändern, da der Fehler nicht mehr auftritt, allerdings müssen Sie in diesem Fall darauf achten, dass Sie den Rückgabewert von OrderSend() nicht mehr testen.

Ich hoffe, diese Informationen können Ihnen helfen.

Hallo

Ich weiß, es klingt seltsam. Wenn ich den zurückgegebenen Wert von OrderSend(request,result) im vorherigen Code überprüfte, bekam ich das Problem der Mehrfachbestellung. In meinem neuen Code überprüfe ich den zurückgegebenen Wert von OrderSend(request,result) nicht (aber ich habe den zurückgegebenen Wert immer noch einer Variablen zugewiesen, um einen Fehler beim neuen Build des Terminals zu vermeiden.

Mit dem neuen Code habe ich das Problem der Mehrfachbestellung nicht. Ich habe Alpari UK verwendet, das den Ruf hat, viele Ticks zu senden. Mein Code mag nicht perfekt sein, aber denken Sie mal so. Es gibt eine ganze Reihe von zurückgegebenen Codes, die in Meta Trader 5 überprüft werden müssen.

Erstens der von OrderCheck zurückgegebene Wert, zweitens der von OrderSend zurückgegebene Wert und drittens der in result.retcode zugewiesene Rückgabewert. Ich denke, unabhängig von den ersten beiden zurückgegebenen Werten sollten wir uns vor allem für den letzten Wert und die Menge des tatsächlich ausgeführten Volumens interessieren.

Auf der Grundlage dieser Tatsache habe ich meinen Code vereinfacht, indem ich direkt den result.retcode überprüft habe. Bitte korrigieren Sie mich, wenn ich falsch liege. Ich denke, die Orderausführung im MT5 ist sicherlich viel komplexer als im MT4 und viele von uns sind verwirrt.

Wenn wir nicht in der Lage sind, einen klaren Fall nur mit Logik zu erstellen, dann können wir einen klaren Fall mit Experimenten erstellen. Daher empfehle ich BlindMist oder anderen Leuten, diesen Code mit ihrem Broker auszuprobieren, um zu sehen, ob das Überspringen der OrderSend-Funktion tatsächlich hilfreich sein könnte.

Mit freundlichen Grüßen.

 
figurelli:
Wenn Sie mich fragen, wie ich bereits gesagt habe, halte ich diesen Code nicht für zukunftssicher und sicher genug, und dies ist nur ein Beispiel für das Fehlen eines Rückgabecodes, also lesen Sie bitte noch einmal.

Wenn Sie jedoch den Autor des Codes fragen, wie wäre es, wenn Sie sich direkt an ihn wenden?

Ich habe eine Frage an alle, die sich an diesem Thema beteiligen. Ich habe Ihre Nachricht über den Code 10010 verpasst, wo ist er?

 
angevoyageur:

Ich habe eine Frage an alle, die sich an diesem Thema beteiligen. Ich habe Ihre Nachricht über den Code 10010 verpasst, wo ist er?

Hallo Alain,

Es ist mir nicht klar, was Sie wissen müssen, da wir nur über den neuen Code von FinanceEngineer sprechen und einen Ratschlag zum Testen des Rückgabecodes von OrderSend(), der gegenüber dem ursprünglichen Code geändert wurde.

Beachten Sie, dass sowohl sein ursprünglicher als auch sein neuer Code keinen Test des Codes 10010 haben. Wenn es also für Sie relevant ist, warum haben Sie nicht schon im ersten Beitrag von ihm danach gefragt?

Wie auch immer, können Sie erklären, warum Sie den Code 10010-Test für eine FOK-Füllungspolitik benötigen?

Da dies nicht das erste Mal ist, dass ich Sie und andere Moderatoren darüber sprechen sehe, kennen Sie einige Fälle, in denen es wirklich notwendig ist, diesen Code-Test für FOK (Fill Or Kill)-Aufträge, die Sie mit uns teilen könnten?

Vielen Dank im Voraus.

 
FinanceEngineer:

Hallo

ich weiß, es klingt seltsam. Wenn ich den zurückgegebenen Wert von OrderSend(request,result) im vorherigen Code überprüfte, bekam ich das Problem der Mehrfachbestellung. In meinem neuen Code überprüfe ich den zurückgegebenen Wert von OrderSend(request,result) nicht (aber ich habe den zurückgegebenen Wert immer noch einer Variablen zugewiesen, um Fehler bei einer neuen Version des Terminals zu vermeiden.

Mit dem neuen Code habe ich das Problem der Mehrfachbestellung nicht. Ich habe Alpari UK verwendet, das den Ruf hat, viele Ticks zu senden. Mein Code mag nicht perfekt sein, aber denken Sie mal so. Es gibt eine ganze Reihe von zurückgegebenen Codes, die in Meta Trader 5 überprüft werden müssen.

Erstens der von OrderCheck zurückgegebene Wert, zweitens der von OrderSend zurückgegebene Wert und drittens der in result.retcode zugewiesene Rückgabewert. Ich denke, unabhängig von den ersten beiden zurückgegebenen Werten sollten wir uns vor allem für den letzten Wert und die Menge des tatsächlich ausgeführten Volumens interessieren.

Auf der Grundlage dieser Tatsache habe ich meinen Code vereinfacht, indem ich direkt den result.retcode überprüft habe. Bitte korrigieren Sie mich, wenn ich falsch liege. Ich denke, die Orderausführung im MT5 ist sicherlich viel komplexer als im MT4 und viele von uns sind verwirrt.

Wenn wir nicht in der Lage sind, einen klaren Fall nur mit Logik zu erstellen, dann können wir einen klaren Fall mit Experimenten erstellen. Daher empfehle ich BlindMist oder anderen Leuten, diesen Code mit ihrem Broker auszuprobieren, um zu sehen, ob das Überspringen der OrderSend-Funktion tatsächlich hilfreich sein könnte.

Mit freundlichen Grüßen.

  • Das Überspringen des OrderSend()-Rückgabecodes ist für das Problem der doppelten Aufträge irrelevant. Ein einfacher Zufall.
  • OrderCheck() ist ebenfalls irrelevant, da es nur dazu dient, einige Fehler VOR dem Senden einer Order zu verhindern.
  • Wenn OrderSend() false zurückgibt, wissen Sie, dass ein Problem aufgetreten ist, so dass Sie prüfen können, welches Problem vorliegt, und es entsprechend Ihren Anforderungen bearbeiten können.
  • Wenn OrderSend() true zurückgibt, beginnen die Schwierigkeiten... siehe nächste Meldung.