carrapatos do testador de estratégia mt5 - página 9

 
WhooDoo22:

Olá comunidade MQL5,

Alguém mais encontrou números como estes ao executar estratégias no testador? -1,000000000006551e-005 e 1,000000000006551e-005 (sim, são onze zeros). Deve ser um tipo específico de formato duplo, mas que tipo de formato duplo, hmm?

Também, estou lendo a documentação da MQL5 como sim, ok, ok, o tipo de dados int padrão tem um valor mínimo de -2 147 483 648 e um valor máximo de 2 147 483 647 então sim, claro que há o tipo de dados int não assinado com um valor mínimo de 0 e um valor máximo de 4 294 967 295 MAS ;) não há o tipo de dados int com um valor mínimo de -4 294 967 295 e um valor máximo de 0. A afirmação anterior também poderia se aplicar a tipos de dados adicionais.

Obrigado.

0,00001 é o mesmo um 1 e-5 é um formato expoente. Os dígitos extras no final, o 6551 são equivalentes a 0,00000000000000006551 e é por isso que temos problemas para comparar as duplas . . você precisa ler isto, e fazer alguma pesquisa se necessário, para que você entenda o que está acontecendo:Can price != preço ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0,00001 é o mesmo um 1 e-5 é um formato expoente. Os dígitos extras no final, o 6551 são equivalentes a 0,00000000000000006551 e é por isso que temos problemas para comparar as duplas. . você precisa ler isto, e fazer alguma pesquisa se necessário, para que você entenda o que está acontecendo:Can price != preço ?

Simon,

Muito obrigado, estou lendo o fio e acredito que a solução geral dos cartazes de fio mql4 envolvidos para dupla comparação foi descobrir e utilizar um método para arredondar estas duplas apropriadamente para retornar valores corretos. O que você diz a isto?

Obrigado

 
WhooDoo22:

Simon,

Muito obrigado, estou lendo o fio e acredito que a solução geral dos cartazes de fio mql4 envolvidos para dupla comparação foi descobrir e utilizar um método para arredondar estas duplas apropriadamente para retornar valores corretos. O que você diz a isto?

Muito obrigado.

No contexto de seu posto acima comparações de duplas não é importante, compreender por que você não pode simplesmente comparar duplas é o que é importante.
 
RaptorUK:
No contexto de seu posto acima comparações de duplas não é importante, o que é importante é entender porque não se pode simplesmente comparar duplas.

Por quê? Porque acho que os valores de preços são devolvidos em um formato de quatro e cinco dígitos (com exceções como USDJPY que retorna valores de preços de dois e três dígitos). Vou tentar decompor de uma vez por todas porque não quero arrastar isto por mais tempo do que o necessário.

O preço de oferta do USDCHF é atualmente 0,92909 e acredito que o MetaTrader5 mais distante calcula estes valores de preço em dezesseis casas à direita da casa decimal, se este for o caso, então há onze casas depois que o último dígito nove é lançado nos cálculos do preço do USDCHF de 0,9290900000000000. Penso que a razão pela qual as duplas não podem ser simplesmente comparadas é porque o resto das casas à direita do decimal de um preço (não as legíveis no terminal mas as não legíveis no terminal) causam problemas de desigualdade.

Obrigado.

 
WhooDoo22:

Por quê? Porque acho que os valores dos preços são devolvidos em um formato de quatro e cinco dígitos (com exceções como USDJPY que retorna valores de preços de dois e três dígitos). Vou tentar quebrá-lo de uma vez por todas porque não quero arrastar isto por mais tempo do que o necessário.

O preço de oferta do USDCHF é atualmente 0,92909 e acredito que o MetaTrader5 mais distante calcula estes valores de preço em dezesseis casas à direita da casa decimal, se este for o caso, então há onze casas após o último dígito de nove ter sido lançado nos cálculos do preço do USDCHF de 0,9290900000000000. Penso que a razão pela qual as duplas não podem ser simplesmente comparadas é porque o resto das casas à direita do decimal de um preço (não as legíveis no terminal mas as não legíveis no terminal) causam um problema de desigualdade.

Obrigado.

O problema com o dobro vem de sua representação binária. Há o dobro que não tem uma representação binária exata, então você obtém coisas como 1.000000000006551e-005. Eu não entro aqui com explicações detalhadas, se estiver interessado você pode ler isto, por exemplo.
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:

Por quê?

Está tudo explicado na primeira página do tópico ao qual dei um link, em essência; um valor de 1,57373 pode na verdade ser mantido como um valor duplo de 1,5737300000000001 enquanto NormalizeDouble(1,57373, 5) pode produzir um valor duplo de 1.5737299999999999 ambos os valores arredondados para o 5º dígito mais próximo são iguais mas comparados diretamente não são iguais ... é assim que valores duplos são armazenados, eles são números de ponto flutuante (procure números de ponto flutuante, leia e entenda) e muitas vezes o valor mantido não é exatamente o mesmo que o valor que você acha que está sendo mantido.

Portanto, seu comentário mostra uma subtração de duas duplas e você vê a diferença como 1,0000000000xyz -e5 isto é porque é assim que as duplas são armazenadas - números de ponto flutuante.

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:
O problema com o dobro vem de sua representação binária. Há o dobro que não tem uma representação binária exata, então você obtém coisas como 1.000000000006551e-005. Eu não entro aqui com explicações detalhadas, se estiver interessado você pode ler isto, por exemplo.

1.000000000006551e-005 a décima sexta casa à direita do decimal é e-005.

Você está dizendo que 1.000000000006551e-005 não tem uma representação binária exata porque seu décimo sexto lugar à direita do decimal não é um número inteiro, seu e-005?


"Eu não entro aqui com uma explicação detalhada".

Por que não? Se você deseja escrever uma explicação detalhada, então, por todos os meios, faça-o.


"se estiver interessado, você pode ler isto, por exemplo".

Já comecei a lê-lo.

Obrigado.

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:


"Eu não entro aqui com explicações detalhadas".

Por que não? Se você deseja escrever uma explicação detalhada, então, por todos os meios, faça-o.


Você se lembra de uma discussão que tivemos sobre as coisas fundamentais básicas que você deve saber se quer ser capaz de codificar corretamente ? números de ponto flutuante é um deles ...DYOR, há muita informação lá fora, encontre-a, leia-a, entenda-a, então você será capaz de codificar um pouco melhor.
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

1.000000000006551e-005 a décima sexta casa à direita do decimal é e-005.

Você está dizendo que 1.000000000006551e-005 não tem uma representação binária exata porque seu décimo sexto lugar à direita do decimal não é um número inteiro, seu e-005?


Não. Se você ler meu link e/ou o do RaptorUK, isso será mais claro para você. Se não, leia novamente :-D

1.000000000006551e-005 é simplesmente outra notação para 0.00001000000000006551.

 
RaptorUK:

Tudo está explicado na primeira página do tópico ao qual dei um link, em essência; um valor de 1,57373 pode na verdade ser mantido como um valor duplo de 1,5737300000000001 enquanto que NormalizeDouble(1,57373, 5) pode produzir um valor duplo de 1.5737299999999999 ambos os valores arredondados para o 5º dígito mais próximo são iguais mas comparados diretamente não são iguais ... é assim que valores duplos são armazenados, eles são números de ponto flutuante (procure números de ponto flutuante, leia e entenda) e muitas vezes o valor mantido não é exatamente o mesmo que o valor que você acha que está sendo mantido.

Portanto, seu comentário mostra uma subtração de duas duplas e você vê a diferença como 1,0000000000xyz -e5 isto é porque é assim que as duplas são armazenadas - números de ponto flutuante.

1.57373 (ignorar)

1.5737300000000001

1.5737299999999999

"ambos os valores arredondados para o 5º dígito mais próximo são iguais"

Ambos os valores arredondados para o 5º igual mais próximo 1,57373.


"mas comparados diretamente não são iguais".

Sim, porque há uma diferença.


"é assim que os valores duplos são armazenados"

Valores duplos como 1,5737300000000001 são armazenados como 1,57373 (se normalizar o dobro é usado, presumo). Se normalizar o dobro não for usado, o valor duplo 1,5737300000000001 manteria este formato de valor, correto?


"e muitas vezes o valor mantido não é exatamente o mesmo que o valor que você pensa que está sendo mantido".

Minha última declaração também responde a esta afirmação.


Vou ler o link que você forneceu, obrigado por isso.

Obrigado.