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

 
figurelli:
BonjourFinanceEngineer, il serait peut-être mieux de commencer à vérifier le problème des ordres multiples de votre code original, car si nous faisons cela, nous allons probablement aborder d'autres points critiques ici et ne pas perdre le focus, qu'en pensez-vous ?

Bonjour figurelli

Voici mon nouveau code. J'ai changé depuis que j'ai soulevé le problème des ordres multiples sur ce fil.

Jusqu'à présent, ce code fonctionne bien avec plusieurs brokers. Aucun problème d'ordre multiple n'a encore été trouvé après le changement. BlindMist peut essayer ce code pour voir s'il peut éviter le problème d'ordre multiple avec ce courtier.

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:

Bonjour figurelli

Voici mon nouveau code. J'ai changé depuis que j'ai soulevé le problème des ordres multiples sur ce fil.

Jusqu'à présent, ce code fonctionne bien avec plusieurs brokers. Aucun problème d'ordre multiple n'a encore été trouvé après le changement. BlindMist peut essayer ce code pour voir s'il peut éviter le problème d'ordre multiple avec ce courtier.

Veuillez utiliser le bouton SRC lorsque vous postez un code.

Le code que vous avez posté ne peut pas éviter (tous) les ordres doubles, et au contraire il peut provoquer des ordres doubles dans certains cas.

 
angevoyageur:

Veuillez utiliser le bouton SRC lorsque vous postez un code.

Le code que vous avez posté ne peut pas éviter (tous) les doubles ordres, et au contraire il peut provoquer des doubles ordres dans certains cas.

Quelle serait la meilleure solution, s'il en existe une, à part fixer 10 heures de sommeil dans la boucle ?
 
FinanceEngineer:

Bonjour figurelli

Voici mon nouveau code. J'ai changé depuis que j'ai soulevé le problème des ordres multiples sur ce fil.

Jusqu'à présent, ce code fonctionne bien avec plusieurs brokers. Aucun problème d'ordre multiple n'a encore été trouvé après le changement. BlindMist peut essayer ce code pour voir s'il peut éviter le problème d'ordre multiple avec ce courtier.

SalutFinanceEngineer, notez que dans votre code original vous avez Print("OrderSend Code : "...) à if { } et else { }.

Mais else { } a un break, et votre code de débogage montre retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Donc, par déduction, vous avez imprimé le débogage de la condition if { } et votre break n'a jamais été utilisé.

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

Maintenant vous avez changé votre code, et il semble plus clair, mais notez que vous ne testez plus la valeur de retour de OrderSend(), seulement le result.retcode. Vous pourriez corriger cela en utilisant la variable checkOrderSend (*** regardez ici), que j'ai demandé auparavant :

      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.");
        }

Donc, à mon avis, la première chose à faire est de corriger ce test et de vérifier à nouveau en utilisant le même courtier problématique que vous avez signalé. Si le problème ne se reproduit pas, félicitations, vous avez vraiment résolu le bug, c'est-à-dire que cela n'indique pas que votre code est à l'épreuve du futur ou le plus sûr, mais que nous avons trouvé le bug.

En fait, vous pouvez oublier ou éviter de modifier à nouveau votre code, puisque le bogue ne se reproduit pas, cependant, dans ce cas, vous devez être conscient que vous ne testez plus la valeur de retour de OrderSend().

J'espère que ces informations pourront vous aider.

 
figurelli:

BonjourFinanceEngineer, notez que dans votre code original vous avez Print("OrderSend Code : "...) à if { } et else { }.

Mais else { } a un break, et votre code de débogage montre retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Donc, par déduction, vous avez imprimé le débogage de la condition if { } et votre break n'a jamais été utilisé.

Maintenant vous avez changé votre code, et il semble plus clair, mais notez que vous ne testez plus la valeur de retour de OrderSend(), seulement le result.retcode. Vous pouvez corriger cela en utilisant la variable checkOrderSend (*** regardez ici), que j'ai demandé auparavant :

Donc, à mon avis, la première chose à faire est de corriger ce test et de vérifier à nouveau en utilisant le même courtier problématique que vous avez signalé. Si le problème ne se reproduit pas, félicitations, vous avez vraiment résolu le bug, c'est-à-dire que cela n'indique pas que votre code est à l'épreuve du futur ou le plus sûr, mais que nous avons trouvé le bug.

En fait, vous pouvez oublier ou éviter de modifier à nouveau votre code, puisque le bogue ne se reproduit pas, cependant, dans ce cas, vous devez être conscient que vous ne testez plus la valeur de retour de OrderSend().

J'espère que ces informations pourront vous aider.

Qu'en est-il du code de retour 10010 ?

L'ordre à double entrée peut se produire sur n'importe quel courtier, la probabilité de l'obtenir avec Alpari est simplement plus grande car vous recevez beaucoup plus de ticks.

 
angevoyageur:

Qu'en est-il du code retourné 10010 ?

L'ordre à double entrée peut se produire sur n'importe quel courtier, la probabilité de l'obtenir avec Alpari est simplement plus grande car vous recevez beaucoup plus de ticks.

Si vous me demandez à moi, comme je l'ai déjà dit, je ne considère pas ce code comme suffisamment sûr et à l'épreuve du temps, et ce n'est qu'un exemple de l'absence de code de retour, alors relisez-le.

Cependant, si vous demandez à l'auteur du code, pourquoi ne pas lui demander directement ?

 
figurelli:

SalutFinanceEngineer, notez que dans votre code original vous avez Print("OrderSend Code : "...) à if { } et else { }.

Mais else { } a un break, et votre code de débogage montre retcode = 10008 (TRADE_RETCODE_PLACED) x 10.

Donc, par déduction, vous avez imprimé le débogage de la condition if { } et votre break n'a jamais été utilisé.

Maintenant vous avez changé votre code, et il semble plus clair, mais notez que vous ne testez plus la valeur de retour de OrderSend(), seulement le result.retcode. Vous pouvez corriger cela en utilisant la variable checkOrderSend (*** regarder ici), que j'ai demandé auparavant :

Donc, à mon avis, la première chose à faire est de corriger ce test et de vérifier à nouveau en utilisant le même courtier problématique que vous avez signalé. Si le problème ne se reproduit pas, félicitations, vous avez vraiment résolu le bug, c'est-à-dire que cela n'indique pas que votre code est à l'épreuve du futur ou le plus sûr, mais que nous avons trouvé le bug.

En fait, vous pouvez oublier ou éviter de modifier votre code à nouveau, puisque le bug ne se reproduit pas, cependant, dans ce cas, vous devez faire attention que vous ne testez plus la valeur de retour de OrderSend().

J'espère que ces informations pourront vous aider.

Bonjour

Je sais que cela peut paraître étrange. Quand je vérifiais la valeur retournée de OrderSend(request,result) dans le code précédent, j'avais un problème de commandes multiples. Maintenant dans mon nouveau code, je ne vérifie pas la valeur retournée de OrderSend(request,result) ( mais j'ai quand même assigné la valeur retournée à une variable pour éviter l'erreur sur la nouvelle version du terminal.

Avec ce nouveau code, je n'ai pas de problème de commandes multiples. J'ai utilisé Alpari UK qui a la réputation d'envoyer beaucoup de ticks. Mon code n'est peut-être pas parfait mais pensez à ceci. Il y a un certain nombre de codes retournés qui doivent être vérifiés dans Meta Trader 5.

Le premier d'entre eux est la valeur retournée par OrderCheck, le second est la valeur retournée par OrderSend et le troisième est la valeur retournée assignée à result.retcode. Je pense que quelles que soient les deux premières valeurs renvoyées, ce qui devrait vraiment nous intéresser le plus est la dernière plus le montant du volume réellement exécuté.

Donc, sur la base de ce fait, j'ai simplifié mon code en allant directement vérifier result.retcode. Veuillez me corriger si je me trompe. Je pense que l'exécution des ordres dans MT5 est certainement beaucoup plus sophistiquée que dans MT4 et beaucoup d'entre nous sont confus.

Si nous ne pouvons pas construire un cas clair en utilisant uniquement la logique, alors nous pouvons construire un cas clair en utilisant des expériences. Je recommande donc à BlindMist ou à toute autre personne d'essayer ce code avec son courtier pour voir si le fait de ne pas vérifier la fonction OrderSend peut être réellement utile.

Cordialement.

 
figurelli:
Si vous me demandez à moi, comme je l'ai déjà dit, je ne considère pas ce code comme suffisamment sûr et à l'épreuve du temps, et ce n'est qu'un exemple de l'absence de code de retour, alors relisez-le.

Cependant, si vous demandez à l'auteur du code, pourquoi ne pas lui demander directement ?

J'ai demandé à tous ceux qui participent à ce sujet. J'ai manqué votre message sur le code 10010, où est-il ?

 
angevoyageur:

J'ai demandé à tous ceux qui participent à ce sujet. J'ai manqué votre message sur le code 10010, où est-il ?

Bonjour Alain,

Ce n'est pas clair pour moi ce que tu as besoin de savoir, puisque nous parlons juste du nouveau code de FinanceEngineer, et d'un conseil sur le test du code de retour de OrderSend() qui a été changé par rapport au code original.

Notez que ni son code original ni son nouveau code n'ont le code 10010 à tester, donc si c'est pertinent pour vous, pourquoi ne pas l'avoir demandé dès son premier message ?

Quoi qu'il en soit, pouvez-vous expliquer pourquoi vous auriez besoin du test du code 10010 pour une politique de remplissage FOK ?

Puisque ce n'est pas la première fois que je vous vois en parler, vous et d'autres modérateurs, connaissez-vous des cas où ce code de test est vraiment nécessaire pour les ordres FOK (Fill Or Kill), que vous pourriez partager avec nous ?

Merci d'avance.

 
FinanceEngineer:

Bonjour

Je sais que cela peut paraître étrange. Lorsque je vérifiais la valeur retournée de OrderSend(request,result) dans le code précédent, j'avais un problème de commandes multiples. Maintenant dans mon nouveau code, je ne vérifie pas la valeur retournée de OrderSend(request,result) ( mais j'ai quand même assigné la valeur retournée à une variable pour éviter l'erreur sur la nouvelle version du terminal.

Avec ce nouveau code, je n'ai pas de problème de commandes multiples. J'ai utilisé Alpari UK qui a la réputation d'envoyer beaucoup de ticks. Mon code n'est peut-être pas parfait mais pensez à ceci. Il y a un certain nombre de codes retournés qui doivent être vérifiés dans Meta Trader 5.

Le premier d'entre eux est la valeur retournée par OrderCheck, le second est la valeur retournée par OrderSend et le troisième est la valeur retournée assignée à result.retcode. Je pense que quelles que soient les deux premières valeurs renvoyées, ce qui devrait vraiment nous intéresser le plus est la dernière plus le montant du volume réellement exécuté.

Donc, sur la base de ce fait, j'ai simplifié mon code en allant directement vérifier result.retcode. Veuillez me corriger si je me trompe. Je pense que l'exécution des ordres dans MT5 est certainement beaucoup plus sophistiquée que dans MT4 et beaucoup d'entre nous sont confus.

Si nous ne pouvons pas construire un cas clair en utilisant uniquement la logique, alors nous pouvons construire un cas clair en utilisant des expériences. Je recommande donc à BlindMist ou à toute autre personne d'essayer ce code avec son courtier pour voir si le fait de ne pas vérifier la fonction OrderSend peut être réellement utile.

Cordialement.

  • Sauter le code de retour de la fonction OrderSend() n'a rien à voir avec le problème des ordres doubles. Une simple coïncidence.
  • La fonction OrderCheck() n'est pas non plus pertinente, car elle sert uniquement à prévenir certaines erreurs AVANT d'envoyer un ordre.
  • Si OrderSend() retourne false, vous savez qu'il y a un problème, vous pouvez donc vérifier lequel et le traiter selon vos besoins.
  • Si OrderSend() retourne vrai, les difficultés commencent...voir message suivant.