![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Obsoleto
A biblioteca padrão tem uma função de normalização de preço granular
A biblioteca padrão tem uma função de normalização de preço granular
Eu estava começando a adivinhar que NormalizeDouble(new_lot-sum_lots,Lots_Digits); ele não sai exatamente 0 e armazena alguma cauda
Se as variáveis new_lot e sum_lots são iguais, então a diferença é exatamente 0. Mas não se sabe como calculá-las, elas podem de fato ser desiguais quando calculadas, daí a diferença não-zero. Faça a mesma coisa assim:
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits).
Se as variáveis forem iguais dentro de um número especificado de dígitos, então a diferença será estritamente 0.
Se as variáveis new_lot e sum_lots são iguais, então a diferença é exatamente 0. Mas não se sabe como calculá-las, elas podem de fato ser desiguais quando calculadas, daí a diferença não-zero. Faça a mesma coisa assim:
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits).
Se as variáveis forem iguais dentro do número especificado de dígitos, a diferença será estritamente 0.
Novamente sobre arredondamento......
Por favor, informe sobre a situação (não jogue tomates, eu sou um humanitário),
existe tal variável:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
O delta é originalmente normalizado,
A OrderLots provavelmente deveria retornar dublagens normalizadas,
mas de alguma forma, às vezes, em raras ocasiões eu recebo números como 2,77555557561561562891e-17
Portanto, é quase zero, mas não zero.......
primeira pergunta - isto é normal?
...
Li novamente com atenção. Não é normal. Se NormalizarDa operação de função dupla:
- A parte inteira é selecionada - I
- A parte fracionária é selecionada - F
- F = F * 10^digits
- F = F (+ ou - dependendo do sinal) 0,5
- F = (parte inteira de F) / 10^digitos
- resultado = I + F
então também o resultadoNormalizeDouble(new_lot - sum_lots, Lots_Digits) deve ser estritamente zero se new_lot e sum_lots forem iguais dentro do número especificado de dígitos. Em casos raros pode haver uma diferença de 1 no último dígito (o motivo está nos itens 4 e 5), mas o resultado 2,775557561561562891e-17 é estranho, não deveria ser.Eu escrevi um pequeno código tutorial (eu estava interessado em me espreitar) que revela as entranhas de um número flutuante. Se alguém estiver interessado, você pode executá-lo (código C++, você pode usar algum compilador online. Aqui https://goo.gl/tP691X, por exemplo)
A saída a f == 0,5 + 1/(2^24). 1/(2^24) é o dígito menos significativo da mantissa em um determinado grau:
Grau = 126 - 127 = -1
mantissa = 1.0000000000000000000000001
Deslocar a mantissa para o grau -1 = 0,1000000000000000000001 = 1^(-1) + 1^(-24) = 1/(2^1) + 1/(2^24) = 0,5 + 0,00000005960464478 = 0,50000005960464478
Como uma teoria https://habrahabr.ru/post/112953/.
SZZ: este compilador online é mais agradável que http://rextester.com/l/cpp_online_compiler_gcc
Eu escrevi um pequeno código tutorial (eu estava interessado em me espreitar) que revela as entranhas de um número flutuante. Se alguém estiver interessado, você pode executá-lo (código C++, você pode usar algum compilador online. Aqui https://www.tutorialspoint.com/compile_cpp11_online.php, por exemplo)
Você também pode executá-lo em MQL5 - substitua c[Pos] por _R(f)[(char)Pos] (ou _R(f).Bytes[Pos]) conectando esta biblioteca.
SZ
Resultado
O que aconteceu com a mantissa?
32 é o código ascii do problema. Parece que a biblioteca com o erro não tem uma versão em char. Acho que precisamos remover os problemas entre os valores da mantissa. Ou talvez ao invés de '' escrever ''?
O que aconteceu com a mantissa?
32 é o código ascii do problema. Parece uma biblioteca com um bug. Acho que precisamos remover os problemas entre os valores da mantissa. Ou talvez ao invés de '' escrever ''?
O fmtprntl.mqh não é meu, portanto, não posso dizer com certeza.
Não quero incomodar, portanto, para seus valores de bytes impressos
Um efeito colateral relacionado.
Acabou se revelando conveniente. Mas não se destinava originalmente a ser usado desta forma.
Existem funções especiais para imprimir números reais com a precisão necessária.
Diga-me por que você precisa arredondar números reais no processo de cálculo? Porque, neste caso, você perde a precisão do cálculo!
Estamos falando sobre a correta comparação de preços, paradas, lotes
Você precisa de uma certa precisão aqui.