Нужна помощь с NormalizeDouble!

 

Скажите почему при volume=0.2*3 получается вот такое число 0,6000000000000001?????????

Пробовал NormalizeDouble(volume,2)- та же песня, WTF????

Причем терминал выдает сообщение про установку ордера с лотом 0,6 а мой принт 0,6000000000000001. Это что - глюк принта?

Файлы:
irpea.png  10 kb
 

Просто такова реальность. 

NormalizeDouble() приводит число в норму, но вывод принтом все портит. Число нормальное, но нет возможности это увидеть.  

 
Dmitry Fedoseev:

Просто такова реальность. 

NormalizeDouble() приводит число в норму, но вывод принтом все портит. Число нормальное, но нет возможности это увидеть.  

То есть если проверить 0.2*3==0,6000000000000000, то будет true?

Насколько я помню такие случаи из практики, то вроде бы "ДА"

 
Renat Akhtyamov:

То есть если проверить 0.2*3==0,6000000000000000, то будет true?

Насколько я помню такие случаи из практики, то вроде бы "ДА"


NormalizeDouble(0.2*3,2)==0,60

 
Maksim Neimerik:

Скажите почему при volume=0.2*3 получается вот такое число 0,6000000000000001?????????

Пробовал NormalizeDouble(volume,2)- та же песня, WTF????

Причем терминал выдает сообщение про установку ордера с лотом 0,6 а мой принт 0,6000000000000001. Это что - глюк принта?


Нормализацию нужно проводить только (непосредственно) при сравнении/выводе.

для принта использовать DoubleToString

ps. англичане вот вообще пишут "никогда не используйте эту функцию" )
https://www.mql5.com/en/forum/146370#comment_3693988
 
Taras Slobodyanik:

...

ps. англичане вот вообще пишут "никогда не используйте эту функцию" )
https://www.mql5.com/en/forum/146370#comment_3693988

Он не прав.

return( MathRound(p/ts) * ts );

Нормализация по размеру тика это хорошо, но результат этого вычисления надо нормализовать обычным образом.

 

С точки зрения программирования подобные вопросы любопытны. И таких проблем жизнь подкидывает множество. Когда же бедному алготрейдеру, к таком случае, заниматься проблемами торговли на форексе? Это вопрос риторический. И когда начинают безапелляционно утверждать, что алготрединг более эффективен чем ручной трейдинг...!? Я, мягко говоря, очень сильно сомневаюсь. (Я - сам программист, я всё это могу оценить) Вот поэтому какого советника ни возьми - они все сливают. А вот ручная торговля - действительно встречается очень качественной. Посмотрите в пункте меню Сигналы - некоторые сигналы - очень даже ничего. Особенно я аплодирую тем из них, кто работает со стоп-лоссом.(Я к таким не отношусь).

 
Dmitry Fedoseev:

Он не прав.

Нормализация по размеру тика это хорошо, но результат этого вычисления надо нормализовать обычным образом.


так округление происходит в MathRound, по идее результат выходит без хвостов...

 
Taras Slobodyanik:

так округление происходит в MathRound, по идее результат выходит без хвостов...


После этого округления делается умножение.

 
добрый день.

для того чтоб понять что такое число в формате double необходимо вспомнить архитектуру процессора и как он представляет эти числа.
вспоминаем (кто изучал) что такое число в понимании компа, это последовательность 0 и 1 например число 4 он видит как 0100 а число 8 как 1000. как следствие он не может видеть число 0.6 в чистом виде как мы, а видит его как 2 в какой то степени, для него 4=2^2 , а 8=2^3 , а 125=2^6+2^5+2^4+2^3+2^2+2^0. из этого следует что написание 0.6 для нас понятно, так как это десятичная система исчисления, а у компа двоичная и он будет представлять себе число 0.6 по битно так, как это заложено  в его структуре памяти.и вывод в чистом виде как 0.60000001 для него приемлемо. а вот для того чтоб видеть нормальный результат в принте или в другой функции и существуют разные стандарты для работы.

         /*
         if(SredTPBuy!=OrderTakeProfit())ТАКАЯ ПРОВЕРКА С ЧИСЛАМИ DOUBLE НЕ ВЕРНА
         */
         if(MathAbs(SredTPBuy-OrderTakeProfit())>=_Point)//правильная проверка на соответствие условию
            Result=OrderModify(OrderTicket(),OrderOpenPrice(),0,SredTPBuy,0);

это пример правильного сравнения чисел в формате double, в алгоритмах работающих с ними, из предыдущего моего комментария в другом ветке.

 
Andrey Kisselyov:
if(MathAbs(SredTPBuy-OrderTakeProfit())>=_Point)

Не, просто она используется в таком месте, где незаметна ее неправильная работа и не важна. Модификация будет где-то на пункт ближе, где-то на пункт дальше - не сильно важно.

Еще, если цена не нормализована, можно получить ошибку 129