NormalizeDouble не работает

 

Здравствуйте. Не получается нормализовать цену открытия бара.
NormalizeDouble(0.9920099999999999, 5) возвращает 0.9920099999999999

 
а что выдаст https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
newnek:
а что выдаст https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice
не знаю как правильно использовать. Мои знания ограничиваются mql4.
 

Правильно работает, увидеть не можем, надо по результатам сравнения проверять.

   if(NormalizeDouble(0.9920099999999999, 5)==0.99201){
      Alert("Правильно!");
   }
   else{
      Alert("Неправильно");
   }
 
Dmitry Fedoseev:

Правильно работает, увидеть не можем, надо по результатам сравнения проверять.

Увидеть можем, например, так:

Alert(StringConcatenate(NormalizeDouble(0.9920099999999999, 5)));

 

К стати, результат выполнения Alert(NormalizeDouble(0.9920099999999999, 5)); такой же.

Проблема заключается в том, что я эту цену я использую в имени объекта. Когда NormalizeDouble не срабатывает, длинна имени превышает 63 символа и ObjectCreate его обрезает. После чего, не работает ObjectSetInteger, так как имя объекта отличается от имени, передаваемого в ObjectCreate.

Простой пример, еще один способ увидеть:

string name = StringConcatenate("1111111111111111111111111111111111111111111111", NormalizeDouble(0.9920099999999999, 5));
   
ObjectCreate(0, name, OBJ_ARROW, 0, Time[1], Open[1]);
   
if(ObjectFind(name) != -1)
   Alert("Объект найден");
   
else Alert("Объект не найден");

Результат: Объект не найден. Не буду мусорить скринами, если не верите, можете запустить и проверить.

Если заменить первую строку следующим образом, объект найдется:

string name = StringConcatenate("1111111111111111111111111111111111111111111111", 0.99211);

Нолики заменил для того, что бы набралось 5 символов после запятой (точки).

К стати, если в числе 0.9920099999999999 заменить хотя бы один нолик на любую другую цифру, NormalizeDouble заработает

 

Ну и что же вы видите? 

NormalizeDouble(0.9920099999999999, 5) равно 0.99201.

А в алерте невесть что неведомой длины. Что тут можно увидеть?

 
Vladislav Boyko:

Увидеть можем, например, так:

StringConcatenate <- WTF

DoubleToString и никак иначе.


 
  double n = NormalizeDouble(0.9920099999999999,5);
  string n_str = DoubleToString(n,5); 

  Print (n_str);

USDJPY,M30: 0.99201

 

 что числа типа double писались правильно в строковом представлении нужно использовать функцию 

 

string  DoubleToString( 
   double  value,      // число 
   int     digits=8    // кол-во знаков после запятой 
   );

обратное представление  

double  StringToDouble( 
   string  value      // строка 
   );
 
Через DoubleToString можно только как бы увидеть, но нельзя убедиться в правильности работы NoralizeDouble(). Убедиться в правильности/неправильности можно только через проверку условия.
 
o_O:

DoubleToString и никак иначе.


Я, не посмотрев в справочник, ошибочно думал что digits должен быть до 8, а не до 16, поэтому использовал StringConcatenate