El tamaño de la posición devuelve un valor negativo

 

Dentro de mi estrategia, utilizo una función GetPosSize() para calcular el tamaño de las posiciones. Sólo estoy utilizando la estrategia con EURUSD en el momento y para la vida de mí no puedo averiguar por qué posSize está devolviendo un valor negativo, lo que resulta en un error 4051 OrderSend. Cualquier ayuda sería muy apreciada. Voy a publicar todo el código relevante aquí. No se hace ningún otro cálculo hacia posSize en todo el código, sólo se llama a la función. Las tres piezas de código separadas están dentro de la función.

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

Trate de imprimir los valores de marginAllot, PercentRisk y pipsToSL para reducir el origen del número negativo. Mi suposición especulativa es que pipsToSL está siendo pasado como un número negativo bajo ciertas circunstancias.

 
  1. NormalizeDouble(posSize,2);
    Esta línea no hace nada.
  2. NO use NormalizeDouble, NUNCA. Por ninguna razón. Es una chapuza, no la use. Suuso es siempre incorrecto
 
honest_knave:

Trate de imprimir los valores de marginAllot, PercentRisk y pipsToSL para reducir el origen del número negativo. Mi suposición especulativa es que pipsToSL está siendo pasado como un número negativo bajo ciertas circunstancias.

En realidad pude encontrar algunos lugares en el resto del código donde pipsToSL fue calculado incorrectamente como negativo. Gracias.

WHRoeder:
  1. Esta línea no hace nada.
  2. NO use NormalizeDouble, NUNCA. Por cualquier razón. Es una chapuza, no la uses. Su uso es siempre incorrecto

Ya he leído que has posteado sobre esto, pero no entendí tu punto hasta tu último enlace. Gracias.

 

¿Por qué sigo obteniendo respuestas con varios decimales si estoy usando MathRound()? He intentado usar DoubleToString pero eso no ha ayudado en absoluto. ¿Se debe esto a las limitaciones de Print() o hay algún otro problema?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: ¿Por qué seguiría obteniendo respuestas con varios decimales si estoy usando MathRound()
MathRound devuelve un doble; número infinito de decimales.
 
WHRoeder:
NoLimitations : ¿Por qué sigo obteniendo respuestas con varios decimales si estoy usando MathRound()
MathRound devuelve un doble; número infinito de decimales.

No según la página de documentación de la misma. https://docs.mql4.com/math/mathround

"Valordevuelto

Valor redondeado hasta el entero más cercano".

Si se supone que lo hace pero no lo hace, entonces MQ necesita ser notificado, o necesitan poner una etiqueta de advertencia en la función.

 
JD4 tiene razón, la página del documento dice que redondea al entero más cercano. No estoy seguro de otra manera de lograr lo que estaba tratando de arriba sin redondear o cortar un cierto número de lugares decimales. ¿Qué sentido tendría MathRound() o round() si no devuelven un número entero?
 
NoLimitations:
JD4 tiene razón, la página de documentación dice que redondea al entero más cercano. No estoy seguro de otra manera de lograr lo que estaba tratando de arriba sin redondear o cortar un cierto número de lugares decimales. ¿Cuál sería el punto de MathRound() o round() si no devuelven un número entero?
Has dicho que MathRound te daba problemas, ¿has probado la alternativa sugerida de sólo redondear()?
 
Sí, he utilizado round(); el resultado es exactamente el mismo. Intenté usar MathFloor() o MathCeil() como una forma de calcular el valor con menos precisión y evitar el problema por el momento, pero ambos parecen no hacer nada también. Sólo quiero convertir un maldito doble en un int jajaja
 

También acabo de intentar usar esto sin éxito. ¿Posiblemente DTS simplemente cambia la precisión de un valor para la apariencia y no el valor real? No veo ninguna otra opción.

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