Posição Tamanho Retornando Valor Negativo

 

Dentro de minha estratégia, uso uma função GetPosSize() para calcular tamanhos de posição. Estou usando apenas a estratégia com EURUSD no momento e, por toda a minha vida, não consigo entender porque o posSize está retornando um valor negativo, resultando em um erro de OrderSend 4051. Qualquer ajuda seria muito apreciada. Vou postar aqui todos os códigos relevantes. Nenhum outro cálculo para posSize é feito em todo o código, apenas a função é chamada. Todos os três pedaços de código separados estão dentro da função.

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

Tente imprimir os valores de marginAllot, PercentRisk e pipsToSL para restringir de onde vem o número negativo. Meu palpite especulativo é que a pipsToSL está sendo passada como um número negativo sob certas circunstâncias.

 
  1. NormalizeDouble(posSize,2);
    Esta linha não faz nada.
  2. NÃO use o NormalizeDouble, TUDO. Por QUALQUER motivo. É um kludge, não o use.O seu uso é sempre errado.
 
honest_knave:

Tente imprimir os valores de marginAllot, PercentRisk e pipsToSL para restringir de onde vem o número negativo. Meu palpite especulativo é que a pipsToSL está sendo passada como um número negativo sob certas circunstâncias.

Na verdade, consegui encontrar alguns lugares no resto do código onde o pipsToSL foi calculado incorretamente como negativo. Obrigado.

WHRoeder:
  1. Esta linha não faz nada.
  2. NÃO use o NormalizeDouble, TUDO. Por QUALQUER motivo. É um kludge, não o use. O seu uso é sempre errado.

Eu já li sobre isso antes, mas não entendi seu ponto até seu último link. Obrigado.

 

Por que eu ainda estaria obtendo respostas a múltiplas casas decimais se estou usando MathRound()? Eu tentei usar DoubleToString, mas isso não ajudou em nada. Isso se deve inteiramente às limitações da Print() ou há algo mais errado?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: Por que eu ainda estaria obtendo respostas a múltiplas casas decimais se estou usando o MathRound()
MathRound retorna um duplo; número infinito de casas decimais.
 
WHRoeder:
NoLimitações : Por que eu ainda estaria obtendo respostas a múltiplas casas decimais se estou usando MathRound()
MathRound retorna um duplo; número infinito de casas decimais.

Não de acordo com a página do documento para isso. https://docs.mql4.com/math/mathround

"Valor de retorno

Valor arredondado até o número inteiro mais próximo".

Se for suposto, mas não for, então o MQ precisa ser notificado, ou eles precisam colocar uma etiqueta de aviso na função.

 
JD4 está certo, a página do documento diz que ele arredonda para o número inteiro mais próximo. Não tenho certeza de outra maneira de realizar o que eu estava tentando acima sem arredondar ou cortar um certo número de casas decimais. Qual seria o ponto de MathRound() ou round() se eles não retornarem um número inteiro?
 
NoLimitations:
JD4 está certo, a página do documento diz que ele arredonda para o número inteiro mais próximo. Não tenho certeza de outra maneira de realizar o que eu estava tentando acima sem arredondar ou cortar um certo número de casas decimais. Qual seria o ponto de MathRound() ou round() se eles não retornarem um número inteiro?
Você disse que a MathRound estava lhe dando ajustes. Você tentou a alternativa sugerida de apenas arredondamento()?
 
Sim, eu usei round(); resultou exatamente nos mesmos valores. Eu tentei usar MathFloor() ou MathCeil() como uma forma de calcular o valor com menos precisão e contornar o problema por enquanto, mas ambos aparentemente não estão fazendo nada também. Eu só quero transformar um maldito duplo em um int hahaha
 

Eu também tentei usar isso sem sucesso. Possivelmente a DTS simplesmente muda a precisão de um valor para a aparência e não o valor real? Não vejo nenhuma outra opção.

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