Размер позиции, возвращающий отрицательное значение

[Удален]  

В своей стратегии я использую функцию GetPosSize() для расчета размера позиции. На данный момент я использую стратегию только с EURUSD и не могу понять, почему posSize возвращает отрицательное значение, что приводит к ошибке OrderSend 4051. Любая помощь была бы очень признательна. Я опубликую весь соответствующий код здесь. Никаких других вычислений в отношении posSize по всему коду не производится, вызывается только функция. Все три отдельные части кода находятся внутри функции.

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

Попробуйте распечатать значения marginAllot, PercentRisk и pipsToSL, чтобы определить, откуда берется отрицательное число. Я предполагаю, что при определенных обстоятельствах pipsToSL передается как отрицательное число.

 
  1. NormalizeDouble(posSize,2);
    Эта строка ничего не делает.
  2. НЕ используйте NormalizeDouble, НИКОГДА. По любой причине. Это ошибка, не используйте ее.Ее использование всегда неправильно.
[Удален]  
honest_knave:

Попробуйте распечатать значения marginAllot, PercentRisk и pipsToSL, чтобы определить, откуда берется отрицательное число. Я предполагаю, что при определенных обстоятельствах pipsToSL передается как отрицательное число.

Я действительно смог найти несколько мест в остальной части кода, где pipsToSL был неправильно рассчитан как отрицательный. Спасибо.

WHRoeder:
  1. Эта строка ничего не делает.
  2. НЕ используйте NormalizeDouble, НИКОГДА. По любой причине. Это ошибка, не используйте ее. Его использование всегда неправильно

Я читал о том, что вы писали об этом раньше, но не понимал вашу мысль до последней ссылки. Спасибо.

[Удален]  

Почему я все еще получаю ответы с несколькими знаками после запятой, если я использую MathRound()? Я пробовал использовать DoubleToString, но это не помогло. Это связано исключительно с ограничениями функции Print() или здесь что-то еще не так?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: Почему я все еще получаю ответы с несколькими знаками после запятой, если я использую MathRound()
MathRound возвращает двойное число; бесконечное количество десятичных знаков.
 
WHRoeder:
NoLimitations : Почему я все еще получаю ответы с несколькими десятичными знаками, если я использую MathRound()
MathRound возвращает двойное число; бесконечное количество десятичных знаков.

Это не так, согласно странице документации по ней. https://docs.mql4.com/math/mathround

"Возвращаемое значение

Значение, округленное до ближайшего целого числа".

Если она должна, но не делает этого, то MQ должен быть уведомлен, или они должны поместить предупреждающий ярлык на функцию.

[Удален]  
JD4 прав, на странице документации сказано, что он округляет до ближайшего целого числа. Я не уверен, что есть другой способ достичь того, что я пытался сделать выше, без округления или отсечения определенного количества десятичных знаков. Какой смысл в MathRound() или round(), если они не возвращают целое число?
 
NoLimitations:
JD4 прав, на странице документации сказано, что он округляет до ближайшего целого числа. Я не уверен, что есть другой способ достичь того, что я пытался сделать выше, без округления или отсечения определенного количества десятичных знаков. Какой смысл в MathRound() или round(), если они не возвращают целое число?
Вы сказали, что MathRound не дает вам покоя. Вы пробовали предложенную альтернативу - просто round()?
[Удален]  
Да, я использовал round(); это привело к точно таким же значениям. Я пытался использовать MathFloor() или MathCeil() как способ вычислить значение менее точно и обойти проблему на время, но оба эти метода, похоже, тоже ничего не дают. Я просто хочу превратить чертову двойку в инт.
[Удален]  

Я также только что попробовал использовать это безрезультатно. Возможно, DTS просто изменяет точность значения для внешнего вида, а не фактическое значение? Я не вижу других вариантов.

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