Pregunta a los maestros del MQL4. De nuevo sobre la doble comparación. - página 4

 
Integer:
VBAG echa un vistazo a este script
Y tú también trabajas de noche, gracias por el apoyo, ahora tengo que digerirlo todo.
 
Integer:

precio = 1,1111

ma = 1,11110001

Cuando se normaliza a 8 dígitos, el precio es correcto. La normalización a menos dígitos dará como resultado igual - incorrecto. Así se consigue la máxima precisión.

Es una broma, ¿no? :)
En general, sin normalizar ma > precio es también lo correcto. ¿Por qué conseguir la máxima precisión cuando ya está ahí, y ya se sabe que es mayor de lo que se puede conseguir?

La normalización a 9 dígitos no funciona. Es como si el precio tuviera 9 dígitos y el indicador 8 o viceversa (no lo recuerdo), en definitiva está cubierto por el misterio de lo desconocido.


Sí, lo más probable es que esté en el propio NormalizeDouble que sólo cuenta hasta 8 dígitos. Te digo que es una función ridícula, no importa cómo lo hagas.
 
komposter:

Y en forma simplificada funciona tan rápido como ComparePrice:
2007.09.10 03:19:24 CheckCompareDoubleSpeed GBPUSD,Daily: ComparePrice: 20922, equal: 20453
Y en su forma original es sólo una canción :)
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: ComparePrice: 23843, igual: 178704
¡Eh, pero komposter tiene un coche mejor!
 
Irtron:
Y en su forma original, es sólo una canción :)
Pues sí, hay que pagar por la versatilidad.
¿O también sirve ComparePrice para comparar cualquier número con cualquier precisión?
 
komposter:

¿O también sirve ComparePrice para comparar cualquier número con cualquier precisión?
¡Claro que sí! Si se conoce la exactitud, que es el caso cuando se trabaja con valores comerciales. Punto fijo.
 
Irtron:
Por supuesto. Si se conoce la precisión, como es el caso de los valores comerciales. Punto fijo.
Estoy de acuerdo.
Sólo hay que explicarlo a numerosos autores de temas "sobre comparación de dobles".
Por eso propuse una forma _universal_ (pero lejos de ser óptima) de comparar.
Y funciona. De forma lenta pero fiable. Y en todos los casos.

Y cuando aparezca un tema "Sobre la optimización de la comparación de dobles" podremos desarrollarlo ;)
 

¿Es necesario normalizar los precios en algún lugar?

En la documentación está escrito que los precios de las solicitudes comerciales deben estar normalizados.

En la rama "Historial no normalizado y posiciones de apertura ", dice lo siguiente:

Renat 16.02.2007 10:01
Hemos añadido deliberadamente el precio normalizado a las solicitudes de negociación para evitar el envío involuntario de precios erróneos al servidor.
 
Me gustaría dar las gracias a todos los profesionales por sus conocimientos.

Irtron, he elegido tu variante, me ha gustado mucho. Lo he corregido un poco para casos generales y lo he comprobado:

int CompararPrecio(double a, double b, double digit)
{
a -= b;
b = dígito;
si (a > b)
volver (1);
si (a < -b)
devolver (-1);
retorno (0);
}
Gracias.
 
Con digit=0 habrá problemas. Además la función es más lenta que una sola llamada a NormalizeDouble()
 
Integer:
Dígito=0 causará problemas.

Cualquier dígito causará problemas. No entiendo qué es el dígito y qué sentido tiene la modificación.

Entero:
Además, la función es más lenta que una sola llamada aNormalizeDouble().
También será más lento que MathAbs, 2+3, etc. :)

¿Cuál es el tema de comparar funciones con diferente funcionalidad? Una se simplificó (sin embargo, es inviable), ahora es NormalizeDouble.
¿Qué y a quién quieres demostrar con una actitud tan descarada... (inserte la palabra que desee)?