Erros, bugs, perguntas - página 2820

 
Kira27:

O certificado confundiu-me))))

A referência diz sem vírgulas invertidas. Por isso, coloca-se lá dentro.

 
Uma questão de barba. Mas não compreendo este resultado.
void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:
Pergunta barbudo. Mas não compreendo este resultado.

Já foi dito 100 vezes: "não usar comparação exacta de dublagem, usar epsilon". Incluindo na nossa documentação.

Nem mesmo 0,3 ou 0,7 se compararão com as suas percepções. Aceite-o e ultrapasse-o. Ou vá e aprenda (no MTI, por exemplo)

 
Slava:

Já foi dito 100 vezes: "não usar comparação exacta de dublagem, usar epsilon". Incluindo na nossa documentação.

Sei como fazer uma comparação dub, é claro.

Nem mesmo 0,3 ou 0,7 se compararão com as suas percepções. Aceite-o e ultrapasse-o. Ou ir e aprender (no MTI, por exemplo).

Print(NormalizeDouble(0.3, 5) == 0.3); // true
Print(NormalizeDouble(0.7, 5) == 0.7); // true

Print(NormalizeDouble(0.12345, 5) == 0.12345); // true

Não compreende a pergunta.

 
decimal facilitaria as coisas, mas é lento(
 
fxsaber:

Posso fazer uma comparação de dublos, claro.

Não compreende a pergunta.

Existem outras subtilezas.

Um número real multiplicado por 0,5 não se pode comparar com o mesmo número dividido por 2,0

 
Slava:

Existem outras subtilezas.

Um número real multiplicado por 0,5 pode não ser igual ao mesmo número dividido por 2,0

Isso é verdade. Mas a questão era: porque é que o número 1,79435 não está normalizado para 5 casas decimais?


ZS O contexto desta pergunta.

O SL no Testador explodiu. DEAL_PRICE = 1,79435, ORDER_PRICE_OPEN = 0(como em MT5), DEAL_COMMENT = "sl 1,79435".

Queria saber se houve um deslize quando executei o SL ou não? Assim, comparei simplesmente DEAL_PRICE e o preço do comentário. Com os meus olhos vejo que os preços são os mesmos, mas o MQL mostra que não são. Finalmente, chegámos ao fundo da comparação original.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Erros, bugs, perguntas

fxsaber, 2020.08.10 09:04

void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:

Tudo verdade. Mas a questão era: porque é que o número 1,79435 não está normalizado até à 5ª casa decimal?


ZS Antecedentes da pergunta.

O SL no Testador foi accionado. DEAL_PRICE = 1,79435, ORDER_PRICE_OPEN = 0(como em MT5), DEAL_COMMENT = "sl 1,79435".

Queria saber se houve um deslize quando executei o SL ou não? Assim, comparei simplesmente DEAL_PRICE e o preço do comentário. Com os meus olhos vejo que os preços são os mesmos, mas o MQL mostra que não são. Acabou por chegar à comparação original.

Desculpe, mas é um pouco estranho ouvi-lo dizer isso.


 
Alexey Viktorov:

Lamento, mas é um pouco estranho ouvi-lo dizer isso.

Repito a minha pergunta.

fxsaber:

Porque é que o número 1,79435 não está normalizado até à 5ª casa decimal?

void OnStart()
{
  const double Norm = NormalizeDouble(1.79435, 5);
  
  Print((double)(string)Norm == Norm);    // false
  Print((double)(string)Norm == 1.79435); // true
}
 
fxsaber:

Tudo verdade. Mas a questão era, porque é que o número 1,79435 não está normalizado até à 5ª casa decimal?

a normalização não é arredondada.

@Slava escreve que a representação interna do duplo é diferente:

#define  PRINT(EX) Print(#EX," = ",EX)
//+------------------------------------------------------------------+
void OnStart()
{
   union ULONG_DOUBLE
   {
      double d_value;
      ulong ul_value;
   }tmp;
   double NORM_DOUBLE   = NormalizeDouble(1.79435, 5);
   double CONST_DOUBLE  = 1.79435;
   
   PRINT(NORM_DOUBLE);
   tmp.d_value = NORM_DOUBLE;
   PRINT(LongToHex(tmp.ul_value));
   
   tmp.d_value = CONST_DOUBLE;
   PRINT(CONST_DOUBLE);
   PRINT(LongToHex(tmp.ul_value));
}
//+------------------------------------------------------------------+
string LongToHex(const ulong value)
{
   return(StringFormat("%llX", value));
}
//+------------------------------------------------------------------+

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) NORM_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DDA

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) CONST_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD9


SZS: Havia um bom post@Nikolai Semko algures, ele deu uma descrição muito boa de como trabalhar com o dobro, talvez eu encontre o link.

UPD:https://www.mql5.com/ru/forum/1111/page2623#comment_14473837