NormalizeDouble нужно лишь при торговых операциях открытия/модификации ордеров OrderSend / OrderModify. Она как раз именно для этого и была введена в язык. В остальных случаях её использование абсолютно лишнее - всегда можно обойтись и без неё.
NormalizeDouble нужно лишь при торговых операциях открытия/модификации ордеров OrderSend / OrderModify. Она как раз именно для этого и была введена в язык. В остальных случаях её использование абсолютно лишнее - всегда можно обойтись и без неё.
Ну почему же бред? Приведённая ветка даёт исчерпывающий ответ на тему этого топика:
******************
Mak 08.06.05 15:41
Проверять вещественные числа на равенство всегда некорректно (за очень редким исключением).
Равенство можно проверить только с некоторой точностью.
И сделать это можно только так
MathAbs(X-Y) < precision
**********************
Что никак не противоречит с моим ответом. Плюс к этому я ещё
точно указал где использование функции NormalizeDouble уместно, удобно
и полностью оправданно.
Ну а уж дело сугубо личное - воспользоваться этим ответом, или
же продолжать долбиться об бетонную стенку головою кому-то
что-то доказывая насчёт того что должен и что не должен позволять
тип double после нормализации! ;o).
Дело не в точности. А в том, что что математические операции с
нормализованными и ненормализованными операндами дают совершенно
рядом не стоящие результаты.
Цитата из доки:
int i = 1 / 2; // приведения типов нет, результат: 0 int i = 1 / 2.0; // выражение приводится к типу double, затем приводится к целевому типу int, результат: 0 double d = 1.0 / 2.0; // приведения типов нет, результат: 0.5 double d = 1 / 2.0; // выражение приводится к типу double, который совпадает с целевым типом, результат: 0.5 double d = 1 / 2; // выражение типа int приводится к целевому типу double, результат: 0.0
А что бывает в результате других операций?
Я говорю, что при рациональном программировании данная задача возникнуть не может и даю рекомендации о том когда следует применять нормализацию. Но вас этот ответ не устраивает и вы хотите, чтобы было решение именно вашей искуственно поставленной задачи.
Хотя ответ, который я предложил в самом начале является многократно проверенным и не только мной одним.
При ВСЕХ вычислениях в экперте используем тип double, результат вычислений с которым описан в приведённой вами документации.
При необходимости послать/модифицировать ордер ВСЕ значения в этом ордере нормализуем.
Соответственно нормализации подлежат лишь ТЕ значения, которые отправляюься на сервер для работы с ордерами! Зачем вам нужно знать результат каких-то там операций с нормализованными вещественными?
Дело не в точности. А в том, что что математические операции с
нормализованными и ненормализованными операндами дают совершенно
рядом не стоящие результаты.
Цитата из доки:
int i = 1 / 2; // приведения типов нет, результат: 0
int i = 1 / 2.0; // выражение приводится к типу double, затем приводится к целевому типу int, результат: 0
double d = 1.0 / 2.0; // приведения типов нет, результат: 0.5
double d = 1 / 2.0; // выражение приводится к типу double, который совпадает с целевым типом, результат: 0.5
double d = 1 / 2; // выражение типа int приводится к целевому типу double, результат: 0.0
А что бывает в результате других операций?
Ваш пример из доки к нормализации и NormalizeDouble абсолютно никакого отношения не имеет.
Это пример приведения типов используемое в MQL4.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уже много раз писалось про NormalizeDouble, но тем не менее вопросов при применении указанной функции не становится меньше. Думаю что это происходит от того, что в документации к MQL4 об этой функции сказано очень скудно. Есть предложение к разработчикам дополнить и сделать более подробным описание этой функции. Интересует полный перечень тех случаев ( после каких математических вычислений ) когда необходимо нормализовать значение. Например: надо ли нормализовать произведение double на int, или частное от деления int на double, или сумму double и double, ну и так далее... Великолепно если бы подобную информацию представили в виде таблицы, где в первой колонке по строкам были бы указаны виды мат. операций, в первых двух колонках возможные сочетания типов операндов, а в третьей колонке была бы указана "+" и "-" необходимость нормализовать результат такой операции. А то складывается впечатление, что нормализовать надо результат любой операции, и весь советник настолько пестрит NormalizeDouble, что становится невыносимо трудно чидать код советника. Уважаемые разработчики, пожалуйста проясните ситуацию.