Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Устарел
В стандартной библиотеке есть функция нормализации цены с учётом грануляции
В стандартной библиотеке есть функция нормализации цены с учётом грануляции
я уже начал догадываться что NormalizeDouble(new_lot-sum_lots,Lots_Digits); не выдает точно 0 а сохраняет какой-то хвост
Если переменные new_lot и sum_lots равны, то разность будет точно 0. Но неизвестно, как вы их вычисляете, при вычислениях они действительно могут оказаться неравными, отсюда и ненулевая разница. Делайте то же самое так:
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits).
Если переменные равны в пределах указанного числа знаков, то разница будет строго 0.
Если переменные new_lot и sum_lots равны, то разность будет точно 0. Но неизвестно, как вы их вычисляете, при вычислениях они действительно могут оказаться неравными, отсюда и ненулевая разница. Делайте то же самое так:
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits).
Если переменные равны в пределах указанного числа знаков, то разница будет строго 0.
И снова про округление......
подскажите пожалуйста по ситуации (только не кидайте помидорами, я гуманитарий),
имеется такая переменная:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
по идее delta изначально нормализирована,
OrderLots наверное должен возвращать нормализированные даблы,
но каким-то образом иногда в редких случаях я получаю числа вроде 2.775557561562891e-17
то есть это почти нуль но не нуль.......
первый вопрос - это нормально?
...
Перечитал ещё раз внимательнее. Нифига это не нормально. Если вот это описание верно:
Работа функции NormalizeDouble:
Я написал небольшой обучающий код (самому было интересно поковырять), который выворачивает наружу внутренности плавающего числа. Если кому интересно, то можно позапускать (код C++, можно на каком-нибудь онлайн компиляторе. Здесь https://goo.gl/tP691X, например)
Выхлоп при f == 0.5 + 1/(2^24). 1/(2^24) - самый младший разряд мантиссы при данной степени:
Степень = 126 - 127 = -1
Мантисса = 1,00000000000000000000001
Сдвигаем мантиису на степень -1 = 0,100000000000000000000001 = 1^(-1) + 1^(-24) = 1/(2^1) + 1/(2^24) = 0.5 + 0,00000005960464478 = 0,50000005960464478
В качестве теории https://habrahabr.ru/post/112953/.
ЗЫ: этот онлайн компилятор поприличней будет http://rextester.com/l/cpp_online_compiler_gcc
Я написал небольшой обучающий код (самому было интересно поковырять), который выворачивает наружу внутренности плавающего числа. Если кому интересно, то можно позапускать (код C++, можно на каком-нибудь онлайн компиляторе. Здесь https://www.tutorialspoint.com/compile_cpp11_online.php, например)
Можно запустить и на MQL5 - заменить c[Pos] на _R(f)[(char)Pos] (или _R(f).Bytes[Pos]), подключив эту библиотеку.
ЗЫ
Результат
А что с мантиссой случилось?
32 - это ascii код проблела. Похоже библиотека с ошибкой не имеет версии для char. Думаю, надо удалить проблелы между значениями мантиссы. Или может вместо ' ' писать " " ?
А что с мантиссой случилось?
32 - это ascii код проблела. Похоже библиотека с ошибкой. Думаю, надо удалить проблелы между значениями мантиссы. Или может вместо ' ' писать " " ?
fmtprntl.mqh - не моя, поэтому не могу точно сказать.
Не охото заморачиваться, поэтому для Вашего f распечатал значения байтов
Сопутствующий побочный эффект.
Оказалось удобно. Но на такое использование изначально не рассчитывали
Для вывода вещественного числа на печать с нужной точностью есть специальные функции.
Скажите, зачем нужно округлять вещественные числа в процессе вычислений? Ведь в этом случае теряется точность вычислений!
речь идет о корректном сравнении цен, стопов, лотов
здесь нужна определенная точность