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

 

В своей стратегии я использую функцию 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;