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

 

Liebe MQL5-Benutzer.

Ich bin derzeit einige mehrere Orderausführung Problem mit meinem EA, sondern nur für einen bestimmten Makler erleben.

Mein EA funktioniert perfekt im Strategie-Tester. Es funktioniert auch mit anderen Brokern im Live-Trading-Modus zu.

Bei einem bestimmten Broker führt mein EA manchmal 10 Orders der gleichen Größe gleichzeitig aus.

Es scheint, dass das Problem durch die Kommunikation zwischen Brokern und Terminal verursacht wird.

Unten ist mein aktueller Code und der aktuelle Code prüft 10 Mal, ob die Bestellung ausgeführt wird.

Wenn der EA retcode==10009 oder retcode==10008 unmittelbar nach dem Absenden der Order erhält, dann wird die Schleife gestoppt und nur 1 Order geöffnet. Dies ist der Idealfall und ein gutes Arbeitsszenario.

Es können jedoch 10 Orders der gleichen Größe geöffnet werden, wenn das Terminal nicht retcode==10009 oder retcode==10008 unmittelbar nach dem Absenden der Order erhält. Ich habe gehört, dass auch einige andere Leute mit den gleichen Problemen zu kämpfen haben.

Wie kann ich dieses Problem der mehrfachen Auftragseingabe abstellen.

Für jeden Vorschlag wäre ich sehr dankbar.

Mit freundlichen Grüßen.

   for(int i=0;i<10;i++)
   {
     
      volume=NormalizeDouble(volume, lotDigit);
      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=DoubleToString(Money,2)+"$";
     
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
     
     
      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;
      }
     
     

      Sleep(1000);
   }
  

 

 
FinanceEngineer:

Liebe MQL5-Benutzer.

Ich bin derzeit einige mehrere Orderausführung Problem mit meinem EA, sondern nur für einen bestimmten Makler erleben.

Mein EA funktioniert perfekt im Strategie-Tester. Es funktioniert auch mit anderen Brokern im Live-Trading-Modus zu.

Bei einem bestimmten Broker führt mein EA manchmal 10 Orders der gleichen Größe gleichzeitig aus.

Es scheint, dass das Problem durch die Kommunikation zwischen Brokern und Terminal verursacht wird.

Unten ist mein aktueller Code und der aktuelle Code prüft 10 Mal, ob die Bestellung ausgeführt wird.

Wenn der EA retcode==10009 oder retcode==10008 unmittelbar nach dem Absenden der Order erhält, dann wird die Schleife gestoppt und nur 1 Order geöffnet. Dies ist der Idealfall und ein gutes Arbeitsszenario.

Es können jedoch10 Orders der gleichen Größe geöffnet werden, wenn das Terminal nicht retcode==10009 oder retcode==10008 unmittelbar nach dem Absenden der Order erhält. Ich habe gehört, dass auch einige andere Leute mit den gleichen Problemen zu kämpfen haben.

Wie kann ich dieses Problem der mehrfachen Auftragseingabe abstellen.

Für jeden Vorschlag wäre ich sehr dankbar.

Mit freundlichen Grüßen.

Welchen Code haben Sie erhalten, als er 10 Orders eröffnet hat?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien


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




 
angevoyageur:

Welchen Code haben Sie erhalten, wenn er 10 Bestellungen eröffnet?

Hallo

Ich habe für jede Bestellung den retcode==10008 erhalten. Er wurde 10 Mal wiederholt. Mit freundlichen Grüßen.


 


   for(int i=0;i<10;i++)
   {
      
      volume=NormalizeDouble(volume, lotDigit);
      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=DoubleToString(Money,2)+"$";
      
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
      
      
      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;
      }
      
      

      Sleep(1000);
   }
   

 
 
FinanceEngineer:

Hallo

ich habe für jede Bestellung den Retcode==10008 erhalten. Er wurde 10 Mal wiederholt. Mit freundlichen Grüßen.

Es wiederholt sich also nicht in der gleichen Schleife, da Sie hier eine Unterbrechung haben:

      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;
      }

Können Sie Ihre Expertenprotokolle zur Bestätigung posten?

Vor dieser Schleife sollten Sie ein PositionSelect(Symbol()) haben ?

 
angevoyageur:

Es wiederholt sich dann nicht in derselben Schleife, da Sie hier eine Pause haben:

Können Sie Ihre Expertenprotokolle zur Bestätigung posten?

Vor dieser Schleife sollten Sie ein PositionSelect(Symbol()) haben?

Ja, natürlich. Hier sind die Expertenprotokolle.

PF 0 00:00:02.348 EA_v (EURJPY,H1) OrderSend Code: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) OrderSend Code: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) OrderSend Code: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) OrderSend Code: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) OrderSend Code: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) OrderSend Code: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) OrderSend Code: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) OrderSend Code: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code: 10008

Auch Ihre Vermutung ist richtig. Ich habe PositionSelect(Symbol()) vor diesem Code verwendet, um das Volumen der aktuellen Position zu überprüfen.

Mit freundlichen Grüßen.

 
FinanceEngineer:

Ja, natürlich, hier sind die Protokolle der Experten.

PF 0 00:00:02.348 EA_v (EURJPY,H1) OrderSend Code: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) OrderSend Code: 10008
DI 0 00:00:04.692 EA_v (EURJPY,H1) OrderSend Code: 10008
FL 0 00:00:05.864 EA_v (EURJPY,H1) OrderSend Code: 10008
HS 0 00:00:07.020 EA_v (EURJPY,H1) OrderSend Code: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) OrderSend Code: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) OrderSend Code: 10008
KI 0 00:00:10.489 EA_v (EURJPY,H1) OrderSend Code: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) OrderSend Code: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) OrderSend Code: 10008

Auch Ihre Vermutung ist richtig. Ich habe PositionSelect(Symbol()) vor diesem Code verwendet, um das Volumen der aktuellen Position zu überprüfen.

Mit freundlichen Grüßen.

Ok, also ist es wohl das gleiche Problem, das wir in einigen Themen besprechen. PositionSelect() wird von der lokalen Datenbank des Terminals aktualisiert, und die Ticks kommen zu schnell, als dass sie aktualisiert werden könnten. Sleep() ist keine zuverlässige Methode, Sie müssen einen Workaround finden, um sicher zu sein, dass Ihre Position offen ist, bevor Sie eine neue Order senden.

Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien

Mein EA macht eine doppelte Eingabe

doshur, 2013.12.21 03:21

Ich erinnere mich an jemanden, der das gleiche Problem hatte und xxxx verwendet.

Ich konnte nicht finden, dass Thread, wenn jemand kann mir helfen, das wäre ein großer Dank...


 
angevoyageur:

Ok, es ist also das gleiche Problem, über das wir in einigen Themen sprechen. PositionSelect() wird aus der lokalen Datenbank des Terminals aktualisiert, und die Ticks kommen zu schnell, als dass diese aktualisiert werden könnten. Sleep() ist keine zuverlässige Methode, Sie müssen einen Workaround finden, um sicher zu sein, dass Ihre Position offen ist, bevor Sie eine neue Order senden.

Ich verstehe. Vielen Dank dafür. Wenn PositionSelect() nicht funktioniert, wie wäre es, die Order mit PositionsTotal() zu begrenzen? Wird PositionsTotal() aus der Datenbank des Brokers aktualisiert?

 
FinanceEngineer:

Aha, ich verstehe. Vielen Dank dafür. Wenn PositionSelect() nicht funktioniert, wie sieht es dann mit der Begrenzung von Aufträgen mit PositionTotal() aus? Wird PositionsTotal() aus der Datenbank des Brokers aktualisiert?

Ich glaube nicht, aber Sie können es versuchen und uns Bescheid geben.
 
angevoyageur:
Ich glaube nicht, aber du kannst es ja mal ausprobieren und uns Bescheid geben.
Das werde ich sicher tun. Mit freundlichen Grüßen.
 

Hallo

hat jemand eine funktionierende Lösung für dieses Problem gefunden?

Es ist frustrierend, wenn mehrere Aufträge ausgeführt werden, wenn Sie ordnungsgemäße Kontrollen vorhanden sind.

Es macht keinen Sinn, PositionSelect aus einer lokalen Datenbank zu aktualisieren, wenn alle Handelsausführungen auf einem entfernten Broker-Server stattfinden.

Ich bin der Meinung, dass dies in zukünftigen Build-Releases behoben werden sollte.

Bitte veröffentlichen Sie Ihre Lösung.

Ich danke Ihnen,

 
BlindMist:

Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien

Multiple Order Entry Problem für Live-Konto bei einem bestimmten Broker

BlindMist, 2014.05.15 02:00

Hallo .

Hat jemand eine funktionierende Lösung für dieses Problem gefunden?

Es ist frustrierend, wenn mehrere Orders ausgeführt werden, obwohl man eine gute Kontrolle hat.

Es macht keinen Sinn, PositionSelect aus einer lokalen Datenbank zu aktualisieren, wenn alle Handelsausführungen auf einem entfernten Broker-Server stattfinden.

Ich bin der Meinung, dass dies in zukünftigen Build-Releases behoben werden sollte.

Bitte posten Sie Ihre Lösung.

Vielen Dank!

HalloBlindMist, es ist sinnvoll, Ihre lokale Datenbank zu überprüfen, um festzustellen, ob Ihr Konto mit dem Maklerserver synchronisiert ist.

Bitte werfen Sie einen Blick auf den vorgeschlagenen Beitrag, um dieses Problem zu lösen.

Grund der Beschwerde: