Странная ошибка...

 

Здравстуйте! 

Заметил странную ошибку(может я туплю, но по результатам скорее МТ), из-за которой чуть голову не сломал.

Запустите ниже приведенный эксперт, модель необходимо выбрать: по ценам открытия, тф от минуток до часовика, далее обратите внимание на сообщения в журнале экспертов. 

Ошибка в том, что если константа с плавающей точкой:

 double porog=MathAbs(Open[0]-Close[1])/Point =1;

и присвоив ее целой константе:

int rezultat=porog;

то эта константа(rezultat)  почему то иногда= 0(что не есть правильно), а иногда =1(что есть правильно).

Да и вообще сравнив константу porog с 1, почему то также равенство не выполняется...

Проверял на версиях терминалов не выше 223.


У меня единственный вопрос: ПОЧЕМУ?

Файлы:
0j0.mq4  1 kb
 
int start()
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 double porog=MathAbs(Open[0]-Close[1])/Point;
 string st=DoubleToStr(porog,8);
 int    stop=StrToInteger(st);
 
 int rezultat=porog;
 
if(stop==1) Print("porog= "+porog+"   +    st= "+st+"    +    stop= "+stop+"    +    rezultat= "+rezultat);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
}

действительно. вот что выводит:

porog= 1.00000000 + st= 1.00000000 + stop= 1 + rezultat= 0


то есть porog в строку нормально переводится

затем строка в целое число тоже нормально,

но потом О ЧУДО!!!! double в целое переводится НУЛЁМ!!!

хороший глючок. 

 

Если использовать нормализацию, то глюк исчезнет.

Это уже обсуждалось.

вот если написать так:

 double porog=NormalizeDouble(MathAbs(Open[0]-Close[1])/Point, 8);

то и результат адекватный

porog= 1.00000000 + st= 1.00000000 + stop= 1 + rezultat= 1



НОРМАЛИЗАЦИЯ избавит вас от проблем в будущем.

 
sergeev >>:

Если перевести шаманство с переменной stop на нормальный язык, получится

   int stop = NormalizeDouble(porog, 8);
Естественно оно не обязано быть равным преобразованному в целое без нормализации.
 
Нормализация, конечно, хорошо, но вот только падение скорости расчетов и повышение трудоемкости кодинга, из-за этого, не совсем есть хорошо, к сожалению(
 
TheXpert >>:

Никаких глюков, все корректно. Если перевести шаманство с переменной stop на нормальный язык, получится

Естественно оно не обязано быть равным преобразованному в целое без нормализации.

эт я пошутил неудачно...

 
TheXpert >>:

Если перевести шаманство с переменной stop на нормальный язык, получится

Естественно оно не обязано быть равным преобразованному в целое без нормализации.

Да, это по правилу да!

Но:

MetaQL >>:

Да и вообще сравнив константу porog с 1, почему то также равенство не выполняется...

т.е. допустим если константу(double)  porog сравнить с числом 1.0000000, то равенство не получается, вот это мне показалось странным, т.к. сравнение происходит double с double...

 
MetaQL >>:

Да, это по правилу да!

Но:

т.е. допустим если константу(double)  porog сравнить с числом 1.0000000, то равенство не получается, вот это мне показалось странным, т.к. сравнение происходит double с double...

В MQL4 15 значащих знаков. Может они не видны Вам при 8-ми нулях после запятой?

 
Zhunko >>:

В MQL4 15 значащих знаков. Может они не видны Вам при 8-ми нулях после запятой?

Да дело не в этом, я сравнивал porog с еденицей со столки нулями сколки было напечатано в журнале, т.е. 1(пункт)/point, получается 4 нуля после запятой, тобишь 1,0000  равенство не выполняется(иногда выполняется), и даже когда сравниваю с 15 нулями

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