Problème de saisie d'ordres multiples pour un compte en direct avec un courtier spécifique

 

Chers utilisateurs de MQL5.

Je rencontre actuellement un problème d'exécution d'ordres multiples avec mon EA, mais uniquement pour un courtier spécifique.

Mon EA fonctionne parfaitement dans le testeur de stratégie. Il fonctionne également avec d'autres courtiers en mode de trading en direct.

Avec un courtier spécifique, mon EA exécute parfois 10 ordres de la même taille en même temps.

Il semble que le problème soit causé par la communication entre les courtiers et le terminal.

Voici mon code actuel et le code actuel vérifie 10 fois si l'ordre est exécuté.

Si l'EA reçoit retcode==10009 ou retcode==10008 immédiatement après l'envoi de l'ordre, alors la boucle s'arrête et un seul ordre est ouvert. C'est un cas idéal et un bon scénario de travail.

Cependant, il peut ouvrir 10 ordres de la même taille si le terminal ne reçoit pas de retcode==10009 ou retcode==10008 immédiatement après l'envoi de l'ordre. J'ai entendu dire que d'autres personnes rencontraient le même problème.

Comment puis-je arrêter ce problème d'entrée d'ordres multiples.

Toute suggestion sera très appréciée.

Cordialement.

   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:

Chers utilisateurs de MQL5.

Je rencontre actuellement un problème d'exécution d'ordres multiples avec mon EA, mais uniquement pour un courtier spécifique.

Mon EA fonctionne parfaitement dans le testeur de stratégie. Il fonctionne également avec d'autres courtiers en mode de trading en direct.

Avec un courtier spécifique, mon EA exécute parfois 10 ordres de la même taille en même temps.

Il semble que le problème soit causé par la communication entre les courtiers et le terminal.

Voici mon code actuel et le code actuel vérifie 10 fois si l'ordre est exécuté.

Si l'EA reçoit retcode==10009 ou retcode==10008 immédiatement après l'envoi de l'ordre, alors la boucle s'arrête et un seul ordre est ouvert. C'est un cas idéal et un bon scénario de travail.

Cependant,il peut ouvrir 10 ordres de la même taille si le terminal ne reçoit pas de retcode==10009 ou retcode==10008 immédiatement après l'envoi de l'ordre. J'ai entendu dire que d'autres personnes rencontrent le même problème.

Comment puis-je arrêter ce problème d'entrée d'ordres multiples.

Toute suggestion sera très appréciée.

Cordialement.

Quel code avez-vous reçu lors de l'ouverture de 10 ordres ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading.


Veuillez utiliser le bouton SRC lorsque vous postez un code. Merci.




 
angevoyageur:

Quel code avez-vous reçu lors de l'ouverture de 10 commandes ?

Bonjour

J'ai reçu le retcode==10008 pour chacune des commandes. Il l'a répété 10 fois. Bien à vous.


 


   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:

Bonjour

J'ai reçu le retcode==10008 pour chacune des commandes. Il l'a répété 10 fois. Bien à vous.

Il ne le répète pas dans la même boucle, car vous avez une pause ici :

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

Pouvez-vous poster les logs de vos experts pour confirmer ?

Avant cette boucle, vous devriez avoir un PositionSelect(Symbol()) ?

 
angevoyageur:

Il ne le répète pas dans la même boucle, car vous avez une pause ici :

Pouvez-vous poster les logs de vos experts pour confirmer ?

Avant cette boucle, vous devriez avoir un PositionSelect(Symbol()) ?

Oui, bien sûr. Voici les logs des experts.

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

Votre supposition est également correcte. J'ai utilisé PositionSelect(Symbol()) avant ce code pour vérifier le volume de la position actuelle.

Cordialement.

 
FinanceEngineer:

Oui, bien sûr. Voici le journal des experts.

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

Votre supposition est également correcte. J'ai utilisé PositionSelect(Symbol()) avant ce code pour vérifier le volume de la position actuelle.

Cordialement.

Ok, donc c'est bien le même problème dont nous parlons dans certains sujets. PositionSelect() est mis à jour à partir de la base de données locale du terminal, et les ticks arrivent trop rapidement pour que cela soit mis à jour. Sleep() n'est pas une méthode fiable, vous devez trouver une solution de contournement pour être sûr que votre position est ouverte avant d'envoyer un nouvel ordre.

Forum sur le trading, les systèmes de trading automatisés et le test des stratégies de trading

Mon EA fait une double entrée

doshur, 2013.12.21 03:21

Je me souviens de quelqu'un qui avait le même problème et qui utilise xxxx.

Je n'ai pas trouvé ce fil de discussion, si quelqu'un peut m'aider ce serait un grand merci....


 
angevoyageur:

Ok, donc c'est bien le même problème dont nous parlons dans certains sujets. PositionSelect() est mis à jour à partir de la base de données locale du terminal, et les ticks arrivent trop rapidement pour que cela soit mis à jour. Sleep() n'est pas une méthode fiable, vous devez trouver une solution de contournement pour être sûr que votre position est ouverte avant d'envoyer un nouvel ordre.

Je vois. Merci beaucoup. Si PositionSelect() ne fonctionne pas, pourquoi ne pas limiter l'ordre en utilisant PositionsTotal()? La fonction PositionsTotal() est-elle mise à jour à partir de la base de données du courtier ?

 
FinanceEngineer:

Je vois. Merci beaucoup. Si PositionSelect() ne fonctionne pas, comment limiter l'ordre en utilisant PositionsTotal()? La fonction PositionsTotal() est-elle mise à jour à partir de la base de données du courtier ?

Je ne pense pas, mais vous pouvez l'essayer et nous le faire savoir.
 
angevoyageur:
Je ne pense pas, mais vous pouvez essayer et nous le faire savoir.
Bien sûr, je le ferai. Salutations.
 

Bonjour

Quelqu'un a-t-il trouvé une solution fonctionnelle à ce problème ?

C'est frustrant d'avoir des ordres multiples exécutés alors que vous avez des contrôles appropriés en place.

Il n'est pas logique que PositionSelect soit mis à jour à partir d'une base de données locale alors que toutes les exécutions de transactions ont lieu sur un serveur de courtage distant.

Je pense que ce problème devrait être résolu dans les futures versions.

Veuillez poster votre solution.

Merci,

 
BlindMist:

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Problème de saisie d'ordres multiples pour un compte en direct avec un courtier spécifique.

BlindMist, 2014.05.15 02:00

Bonjour

Quelqu'un a-t-il trouvé une solution fonctionnelle à ce problème ?

C'est frustrant d'avoir des ordres multiples exécutés alors que vous avez des contrôles appropriés en place.

Cela n'a pas de sens d'avoir PositionSelect mis à jour à partir d'une base de données locale lorsque toutes les exécutions de transactions se produisent sur un serveur de courtier distant.

Je pense que ce problème devrait être résolu dans les prochaines versions.

Veuillez poster votre solution.

Merci,

BonjourBlindMist, il est logique de vérifier votre base de données locale pour vérifier si votre compte est synchronisé avec le serveur du courtier.

Veuillez consulter l'article suggéré pour résoudre ce problème.

Raison: