NormalizeDouble VS MathRound

 

Скажите пожалйста чем отличается действия

NormalizeDouble(OrderOpenPrice(),Digits) от MathRound(OrderOpenPrice()/Point)*Point

Заранее спасибо откликнувшимся.

З.Ы. Это первая половина вопроса. По результатам ответа будет второй. :)

 

Самостоятельно проверить лень?

 

нет, я уже проверил.

Выдаёт одинаковые значения.

но если допустим OrderOpenPrice()=1.3500, то при


double z=1.3500;

if (NormalizeDouble(OrderOpenPrice(),Digits)==z) ....

иногда выдаётся TRUE, а иногда FALSE.

Пытаюсь разобраться в причинах данного события.

 
Наверно, потому что результат MathRound(OrderOpenPrice()/Point)*Point не нормализован
 

Как он может быть не нормализован, если целое число умножается на поинт? Оно автоматом нормализуется. Даже если у тебя есть ООР равное 1.3500124 то после MathRound(ООР/Point) ты получишь 13500 и умножив на Point, ты получишь 1.3500.

Или MathRound не отбрасывает дробную часть от числа?

 

В общем нашёл одну вещь.

Показания тестера в "результатах"

48 2007.01.10 17:40 sell 20 0.30 1.2950 0.0000 1.2903 0.00 10517.12

в журнале

2008.01.27 01:26:00 2007.01.10 17:40 Tester: order #20, sell 0.30 EURUSD is opened at 1.2950

При int x=OrderOpenPrice()/Point;

х получается равен 12949

Даже при x=NormalizeDouble(OrderOpenPrice(),Digits)/Point, х=12949.

А во всех отчётах OrderOpenPrice()=1,2950.

О_о

 

попробуйте не делить на Point, а умножить на MathPow(10,Digits). Но в любом случае окончательный результат надо нормализовать, а у вас x=NormalizeDouble(OrderOpenPrice(),Digits)/Point - не нормализованный результат.

 

Дорогой Интегер.

Point является нормализованной величиной - 10 в минус какой-то степени.

NormalizeDouble(OrderOpenPrice(),Digits) - является тоже нормализованной.

И как действия над нормализованными значениями могут дать ненормализованный результат?

Это приблизительно как сумма двух int будет равна double, типа 2+2=4, 5. :)


Вопрос к "создателям" - возможно ли, что при вызове Point значение получится так сказать не нормализованным? (типа для EURUSD Point=0.000105, а не 0.0001)

 
kermit:

Дорогой Интегер.

Point является нормализованной величиной - 10 в минус какой-то степени.

NormalizeDouble(OrderOpenPrice(),Digits) - является тоже нормализованной.

И как действия над нормализованными значениями могут дать ненормализованный результат?



А вот так вот! Любые арифметические действия над переменным double дают ненормализованный результат. Лично для меня это очевидно. Брюки поглаженные перед стиркой, после стирки уже никак глаженными не назовешь
 
Мне кажется это неправильно. Если бы такое было возможно, то все записи в команде OrderSend, типа Ask+SL*Point,где SL - это целое (int), приводили бы к ошибке.
To Kermit: Почему Вы используете MathRound? Она ведь не отбрасывает дробную часть, а округляет до ближайшего. Почему не используете MathFloor?
 

Мне как бы без разницы - округляется или отбрасывается.

Меня больше всего волнует

Даже при x=NormalizeDouble(OrderOpenPrice(),Digits)/Point, х=12949.

А во всех отчётах OrderOpenPrice()=1,2950.

Получается, что цена не кратна Point. Но ведь так не должно быть!!!

Можете привести хоть один весомый аргумент, почему цена имеет право быть не кратной Point?

Причина обращения: