Pergunta para os mestres da MQL4. Novamente sobre Double Compare. - página 4

 
Integer:
VBAG dê uma olhada neste roteiro
E você também trabalha à noite, obrigado pelo apoio, agora eu tenho que digerir tudo.
 
Integer:

preço = 1.1111

ma = 1.11110001

Quando normalizado a 8 dígitos ma>preço está correto. A normalização para menos dígitos resultará em igual - incorreto. É assim que se obtém a máxima precisão.

É uma piada, não é? :)
Em geral, sem normalizar o ma > preço também é a coisa certa a fazer. Por que obter a máxima precisão quando ela já está lá e já é conhecida por ser maior do que o possível?

A normalização para 9 dígitos não funciona. A impressão é que o preço é uma espécie de 9 dígitos e o acusador tem 8 ou vice versa (não me lembro), em suma, é coberto pelo mistério do desconhecido.


Sim, o mais provável é que em NormalizeDouble em si mesmo conte apenas até 8 dígitos. Estou lhe dizendo, é uma função ridícula, não importa como você a gire.
 
komposter:

E de forma simplificada, funciona tão rápido quanto o ComparePrice:
2007.09.10 03:19:24 CheckCompareDoubleSpeed GBPUSD,Daily: ComparePreço: 20922, igual: 20453
E em sua forma original é apenas uma canção :)
int start()
{
    double a, b;
    int start1, start2, end, c;
    
    a = 1.23450001;
    b = 1.23449999;
    
    start1 = GetTickCount();
    
    for (c = 100000000; c > 0; c--)
        ComparePrice(a, b);
    
    start2 = GetTickCount();
    
    for (c = 100000000; c > 0; c--)
        equal(a, b);
    
    end = GetTickCount();
 
    Print("ComparePrice: ", start2 - start1, ", equal: ", end - start2);
 
    return(0);
}
 
int ComparePrice(double a, double b)
{
    a -= b;
    b = Point / 2.;
    if (a > b)
        return (1);
    if (a < -b)
        return (-1);
    return (0);
}
 
bool equal(double value1, double value2, int precision = 8)
{
    return (NormalizeDouble(MathAbs(NormalizeDouble(value1, precision) - NormalizeDouble(value2, precision)), precision) < NormalizeDouble(MathPow(0.1, precision), precision));
}
2007.09.10 02:39:57 testScript USDJPYm,H4: ComparePreço: 23843, igual: 178704
Eh, mas o komposter tem um carro melhor!
 
Irtron:
E em sua forma original, é apenas uma canção :)
Bem, sim, você tem que pagar pela versatilidade.
Ou o ComparePrice também é adequado para comparar qualquer número com uma determinada precisão?
 
komposter:

Ou o ComparePrice também é adequado para comparar qualquer número com uma determinada precisão?
É claro que sim! Se a precisão for conhecida, que é o caso quando se trabalha com valores comerciais. Ponto fixo.
 
Irtron:
É claro! Se a precisão for conhecida, que é o caso dos valores comerciais. Ponto fixo.
Eu concordo.
Somente é necessário explicá-lo a numerosos autores de temas "sobre a comparação de duplas".
É por isso que propus uma forma _universal_ (mas longe de ser ótima) de comparação.
E funciona. De forma lenta, mas confiável. E em todos os casos.

E quando um tópico "Sobre otimização de comparação de duplas" aparecer, poderemos desenvolvê-lo ;)
 

A normalização dos preços é necessária em qualquer lugar?

Está escrito na documentação que os preços nos pedidos comerciais devem ser normalizados.

No ramo "História não normalizada e posições de abertura", diz o seguinte:

Renat 16.02.2007 10:01
Adicionamos deliberadamente o preço normalizado aos pedidos comerciais a fim de evitar enviar preços inadvertidamente errados para o servidor.
 
Eu gostaria de agradecer a todos os profissionais por sua visão!

Irtron, eu escolhi sua variante, eu gostei muito. Corrigi-o um pouco para casos gerais e verifiquei-o:

int Comparação Preço (duplo a, duplo b, duplo dígito)
{
a -= b;
b = dígito;
se (a > b)
retornar (1);
se (a < -b)
retorno (-1);
retorno (0);
}
Obrigado.
 
Com dígito=0 haverá problemas. Também a função é mais lenta do que uma única chamada para NormalizarDuplo()
 
Integer:
Digit=0 causará problemas.

Qualquer dígito causará problemas. Eu não entendo o que é dígito e qual é o objetivo da modificação.

Inteiro:
Também a função é mais lenta do que uma única chamada paraNormalizarDuplo().
Também será mais lento que o MathAbs, 2+3 etc. :)

Qual é o tema da comparação de funções com diferentes funcionalidades? Uma simplificada (impraticável, no entanto), agora é a NormalizeDouble.
O que e a quem você quer provar com tanta gritaria... (insira você mesmo)?