Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте сообщество MQL5,
Кто-нибудь еще сталкивался с такими числами при запуске стратегий в тестере? -1.000000000006551e-005 и 1.000000000006551e-005 (ага, одиннадцать нулей). Это должен быть определенный тип двойного формата, но какой тип двойного формата, хм?
Также, я читаю документацию по MQL5, вроде да, хорошо, хорошо, стандартный тип данных int имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647, тогда да, конечно, есть тип данных unsigned int с минимальным значением 0 и максимальным значением 4 294 967 295 НО ;) нет типа данных int с минимальным значением минус -4 294 967 295 и максимальным значением 0. Я бы подумал, что должен быть тип данных int с такими минимальным и максимальным значениями, но это то, что есть. Предыдущее утверждение может быть применимо и к другим типам данных.
Спасибо
0.00001 - это то же самое, что 1 e-5 - формат экспоненты. Дополнительные цифры в конце, 6551, эквивалентны 0.00000000000000006551, и именно поэтому у нас проблемы со сравнением двоек. . вам нужно прочитать это, и сделать некоторые исследования, если вам нужно, так что вы понимаете, что происходит:Может ли цена != цена?
Саймон,
Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете на это?
Спасибо
Саймон,
Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете по этому поводу?
Спасибо
В контексте вашего сообщения выше сравнение двоек не важно, важно понять, почему нельзя просто сравнить двойки.
Почему? Потому что я думаю, что ценовые значения возвращаются в формате четырех и пяти цифр (с исключениями вроде USDJPY, которая возвращает ценовые значения из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.
Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девять будут брошены в расчеты цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойники нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) вызывают проблемы неравенства.
Спасибо
Почему? Потому что я думаю, что значения цены возвращаются в формате четырех и пяти цифр (за исключением USDJPY, которая возвращает значения цены из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.
Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девяти отбрасываются при вычислении цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойные значения нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) создают проблему неравенства.
Спасибо
Почему?
Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.
Поэтому в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.0000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей точкой.
Проблема с двойками возникает из-за их двоичного представления. Есть двойки, которые не имеют точного двоичного представления, поэтому получаются такие вещи, как 1.000000000006551e-005. Я не вдаюсь в подробное объяснение, если интересно, можете почитать вот это, например.
1.000000000006551e-005 на шестнадцатом месте справа от десятичной дроби - e-005.
Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?
"Я не вдаюсь здесь в подробные объяснения".
Почему нет? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.
"Если интересно, вы можете прочитать это для примера".
Я начал читать.
Спасибо.
"Я не вхожу сюда с подробными объяснениями".
Почему? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.
Шестнадцатое место справа от десятичной дроби в 1.000000000006551e-005 - это e-005.
Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?
Нет. Если бы вы прочитали мою ссылку и/или ссылку RaptorUK, это было бы более ясно для вас. Если нет, прочитайте еще раз :-D
1.000000000006551e-005 - это просто другое обозначение для 0.00001000000000006551.
Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.
Так, в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.00000000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей запятой.
1.57373 (игнорировать)
1.5737300000000001
1.5737299999999999
"Оба значения, округленные до ближайшего 5-го знака, равны"
Оба значения, округленные до ближайшего 5-го знака, равны 1,57373.
"но сравниваемые напрямую не равны"
Да, потому что есть разница.
"так хранятся двойные значения"
Двойные значения, такие как 1.5737300000000001, хранятся как 1.57373 (если используется normalize double, я полагаю). Если normalize double не используется, то двойное значение 1.5737300000000001 сохранит этот формат значения, правильно?
"и часто хранимое значение не совсем совпадает с тем значением, которое, как вы думаете, хранится".
Мое последнее утверждение отвечает и на это утверждение.
Я прочитаю ссылку, которую вы предоставили, спасибо за нее.
Спасибо