тики тестер стратегии мт5 - страница 9

 
WhooDoo22:

Здравствуйте сообщество 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, и именно поэтому у нас возникают проблемы при сравнении двоек. . вам нужно прочитать это, и сделать некоторые исследования, если вам нужно, чтобы вы поняли, что происходит:Может ли цена != цена ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001 - это то же самое, что 1 e-5 - формат экспоненты. Дополнительные цифры в конце, 6551, эквивалентны 0.00000000000000006551, и именно поэтому у нас проблемы со сравнением двоек. . вам нужно прочитать это, и сделать некоторые исследования, если вам нужно, так что вы понимаете, что происходит:Может ли цена != цена?

Саймон,

Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете на это?

Спасибо

 
WhooDoo22:

Саймон,

Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете по этому поводу?

Спасибо

В контексте вашего сообщения выше сравнение двоек не важно, важно понять, почему вы не можете просто сравнить двойки.
 
RaptorUK:
В контексте вашего сообщения выше сравнение двоек не важно, важно понять, почему нельзя просто сравнить двойки.

Почему? Потому что я думаю, что ценовые значения возвращаются в формате четырех и пяти цифр (с исключениями вроде USDJPY, которая возвращает ценовые значения из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.

Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девять будут брошены в расчеты цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойники нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) вызывают проблемы неравенства.

Спасибо

 
WhooDoo22:

Почему? Потому что я думаю, что значения цены возвращаются в формате четырех и пяти цифр (за исключением USDJPY, которая возвращает значения цены из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.

Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девяти отбрасываются при вычислении цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойные значения нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) создают проблему неравенства.

Спасибо

Проблема с двойными числами возникает из-за их двоичного представления. Есть двойки, которые не имеют точного двоичного представления, поэтому получаются такие вещи, как 1.000000000006551e-005. Я не вдаюсь в подробные объяснения, если интересно, можете почитать, например, это.
Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:

Почему?

Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.

Поэтому в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.0000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей точкой.

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
angevoyageur:
Проблема с двойками возникает из-за их двоичного представления. Есть двойки, которые не имеют точного двоичного представления, поэтому получаются такие вещи, как 1.000000000006551e-005. Я не вдаюсь в подробное объяснение, если интересно, можете почитать вот это, например.

1.000000000006551e-005 на шестнадцатом месте справа от десятичной дроби - e-005.

Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?


"Я не вдаюсь здесь в подробные объяснения".

Почему нет? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.


"Если интересно, вы можете прочитать это для примера".

Я начал читать.

Спасибо.

Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:


"Я не вхожу сюда с подробными объяснениями".

Почему? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.


Помните, мы обсуждали основные фундаментальные вещи, которые вы должны знать, если хотите уметь правильно кодировать? Числа с плавающей запятой - одна из них...ДОР, там есть много информации, найдите ее, прочитайте, поймите ее, тогда вы сможете кодировать немного лучше.
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

Шестнадцатое место справа от десятичной дроби в 1.000000000006551e-005 - это e-005.

Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?


Нет. Если бы вы прочитали мою ссылку и/или ссылку RaptorUK, это было бы более ясно для вас. Если нет, прочитайте еще раз :-D

1.000000000006551e-005 - это просто другое обозначение для 0.00001000000000006551.

 
RaptorUK:

Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 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 сохранит этот формат значения, правильно?


"и часто хранимое значение не совсем совпадает с тем значением, которое, как вы думаете, хранится".

Мое последнее утверждение отвечает и на это утверждение.


Я прочитаю ссылку, которую вы предоставили, спасибо за нее.

Спасибо

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