Taille de la position retournant une valeur négative

 

Dans ma stratégie, j'utilise une fonction GetPosSize() pour calculer la taille des positions. Pour l'instant, je n'utilise la stratégie qu'avec EURUSD et je n'arrive pas à comprendre pourquoi posSize renvoie une valeur négative, ce qui entraîne une erreur OrderSend 4051. Toute aide serait grandement appréciée. Je vais poster tout le code pertinent ici. Aucun autre calcul vers posSize n'est effectué dans le code, seule la fonction est appelée. Les trois morceaux de code séparés se trouvent dans la fonction.

double GetPosSize(string symbol, double pipsToSL)
{
   double marginReq;
   double marginAllot = AccountBalance()/Number_of_Pairs;
   double posSize;
   int pairsOpen = OpenOrderCount();
   int pairsNotOpen = Number_of_Pairs - pairsOpen;
   if(symbol == "EURUSD")
   {
      marginReq = 2600;
   }
if(pairsOpen == 0)
   {
      posSize = (marginAllot * (PercentRisk/100)/pipsToSL) / 10;
   }
NormalizeDouble(posSize,2);
   Print(posSize);
   return(posSize);
 

Essayez d'imprimer les valeurs de marginAllot, PercentRisk et pipsToSL pour déterminer d'où vient le nombre négatif. Ma supposition spéculative est que pipsToSL est passé comme un nombre négatif dans certaines circonstances.

 
  1. NormalizeDouble(posSize,2);
    Cette ligne ne fait rien.
  2. N'utilisez JAMAIS NormalizeDouble, JAMAIS. Pour quelque raison que ce soit. C'est une astuce, ne l'utilisez pas.Son utilisation est toujours mauvaise.
 
honest_knave:

Essayez d'imprimer les valeurs de marginAllot, PercentRisk et pipsToSL pour déterminer d'où vient le nombre négatif. Ma supposition spéculative est que pipsToSL est passé comme un nombre négatif dans certaines circonstances.

En fait, j'ai pu trouver quelques endroits dans le reste du code où pipsToSL était incorrectement calculé comme négatif. Merci.

WHRoeder:
  1. Cette ligne ne fait rien.
  2. N'utilisez PAS NormalizeDouble, JAMAIS. Pour n'importe quelle raison. C'est un gadget, ne l'utilisez pas. Son utilisation est toujours mauvaise.

J'ai lu que vous aviez déjà posté des messages à ce sujet, mais je n'ai pas compris votre point de vue avant votre tout dernier lien. Merci.

 

Pourquoi est-ce que j'obtiendrais encore des réponses à plusieurs décimales si j'utilise MathRound() ? J'ai essayé d'utiliser DoubleToString mais cela ne m'a pas aidé du tout. Est-ce que cela est entièrement dû aux limitations de Print() ou y a-t-il un autre problème ?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: Pourquoi est-ce que j'obtiendrais encore des réponses à plusieurs décimales si j'utilise MathRound()
MathRound renvoie un double ; nombre infini de décimales.
 
WHRoeder:
NoLimitations : Pourquoi j'obtiens toujours des réponses à plusieurs décimales si j'utilise MathRound() ?
MathRound renvoie un double ; nombre infini de décimales.

Pas selon la page de documentation de la fonction. https://docs.mql4.com/math/mathround

"Valeur de retour

Valeur arrondie au nombre entier le plus proche".

Si elle est censée le faire mais ne le fait pas, alors MQ doit être notifié, ou ils doivent mettre une étiquette d'avertissement sur la fonction.

 
JD4 a raison, la page de documentation indique qu'il arrondit au nombre entier le plus proche. Je ne suis pas sûr qu'il existe un autre moyen d'accomplir ce que j'essayais de faire ci-dessus sans arrondir ou couper un certain nombre de décimales. Quel serait l'intérêt de MathRound() ou round() s'ils ne retournent pas un nombre entier ?
 
NoLimitations:
JD4 a raison, la page de documentation indique qu'il arrondit au nombre entier le plus proche. Je ne suis pas sûr qu'il existe un autre moyen d'accomplir ce que j'essayais de faire ci-dessus sans arrondir ou couper un certain nombre de décimales. Quel serait l'intérêt de MathRound() ou round() s'ils ne renvoient pas un nombre entier ?
Vous avez dit que MathRound vous donnait du fil à retordre. Avez-vous essayé l'alternative suggérée de simplement arrondir() ?
 
Oui, j'ai utilisé round() ; cela a donné exactement les mêmes valeurs. J'ai essayé d'utiliser MathFloor() ou MathCeil() pour calculer la valeur de manière moins précise et contourner le problème pour le moment, mais ces deux méthodes ne semblent rien faire non plus. Je veux juste transformer un fichu double en un int.
 

Je viens également d'essayer de l'utiliser, sans succès. Il est possible que le DTS modifie simplement la précision d'une valeur pour l'apparence et non la valeur réelle ? Je ne vois pas d'autres options.

posSize = posSize * 100;
DoubleToString(posSize,0);
StringToDouble(posSize);
posSize = posSize / 100;