Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 9

 
Mesaoria:

Não era nada disso que eu estava falando. A idéia de converter um duble em uma corda para que você possa então contar os caracteres da corda é um completo absurdo. Não importa o que você faça.

Qual é o problema? Até agora, esta opção é a mais rápida, mais funcional e correta garantida. Quais são suas opções?

 
Alexandr Sokolov:
Sim, minha variante provavelmente não é a melhor, mas como nunca encontrei nada sobre ela antes, é a melhor que encontrei por conta própria, comentei acima, embora você não tenha sugerido sua própria variante.

Eu comparei estas variantes:

int ds(double v){
   string s=(string)v;
   int l=StringLen(s);
   int n=l-StringFind(s,".",0)-1;
   if(StringSubstr(s,l-1,1)=="0")n--;
   return(n);
}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

A variante de cordas é ligeiramente mais rápida, e não está limitada a 8 dígitos como d(). E a garantia de exatidão está contando pela forma como o terminal exibe o número.

Eu escolho a variante com conversão em string.

 
Dmitry Fedoseev:

Qual é o problema? Até agora, esta opção é a mais rápida, a mais funcional, garantida de ser a opção certa. Quais são suas opções?

Você pode citar pelo menos um caso de aplicação do algoritmo acima?

 
Mesaoria:

Você pode citar pelo menos um caso de aplicação do algoritmo acima?

Houve um caso em que o painel de negociação produziu o tamanho do lote com o número correto de casas decimais no campo de texto. Este é o único caso.

 
Dmitry Fedoseev:

Houve um caso em que o painel de negociação produziu o tamanho do lote com o número correto de casas decimais na caixa de texto. Este é o único caso.

Isto é, produz "1" no caso de 1 lote e "0,01" no caso de 0,01 lote?

 
Mesaoria:

Então, ele produz "1" no caso de 1 lote e "0,01" no caso de 0,01 lotes?

Não exatamente. Depende do lote mínimo e do passo do lote. Se o lote mínimo for 0,01, então 1 é exibido como 1,00

 
Dmitry Fedoseev:

Na verdade, não. Dependendo do lote mínimo e do incremento do lote. Se o lote mínimo for 0,01, então 1 é exibido como 1,00

O.o.

Então acontece que você não está usando sua função, mas ainda exibindo algo como DoubleToString(LotSize, <algum valor constante>), não?

 
Mesaoria:

O.o

Então acontece que você não usa sua função, mas ainda produz algo como DoubleToString(LotSize, <algum valor constante>), não?

Sim. Mas é preciso saber quantas casas decimais para produzir.

 
Dmitry Fedoseev:

Sim. Mas é preciso saber quantas casas decimais para produzir.

Em outras palavras, você usa o lote mínimo (ou incremento de lote) inserido pelo usuário para determinar quantas casas decimais esse valor tem, e depois o guarda para normalizar os valores futuros?

 
Mesaoria:

Ou seja, você determina a partir do lote mínimo (ou incremento de lote) digitado pelo usuário quantos dígitos após o ponto decimal há nesse valor, e depois o salva para normalizar os valores futuros?

O que você não entende? O preço tem dígitos(), enquanto o volume não tem. É assim que é calculado.

Por que você precisa de dígitos de volume? Pela mesma razão que precisamos dos dígitos do preço!