Domanda ai maestri di MQL4. Di nuovo a proposito di Double Compare. - pagina 4

 
Integer:
VBAG dai un'occhiata a questo script
E anche tu lavori di notte, grazie per il supporto, ora devo digerire il tutto.
 
Integer:

prezzo = 1,1111

ma = 1,11110001

Quando è normalizzato a 8 cifre, il prezzo è corretto. Normalizzando a meno cifre si otterrà un risultato uguale - errato. Questo è il modo in cui si ottiene la massima precisione.

È uno scherzo, vero? :)
In generale, senza normalizzare ma > il prezzo è anche la cosa giusta da fare. Perché raggiungere la massima precisione quando è già presente, e già si sa che è maggiore di quella ottenibile?

La normalizzazione a 9 cifre non funziona. L'impressione è che il prezzo sia una specie di 9 cifre e l'indicatore ne abbia 8 o viceversa (non ricordo), insomma è coperto dal mistero dell'ignoto.


Sì, molto probabilmente, è in NormalizeDouble stesso conta solo fino a 8 cifre. Ti dico che è una funzione ridicola, non importa come la giri.
 
komposter:

E in forma semplificata funziona velocemente come ComparePrice:
2007.09.10 03:19:24 CheckCompareDoubleSpeed GBPUSD,Daily: ComparePrice: 20922, equal: 20453
E nella sua forma originale è solo una canzone :)
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, equal: 178704
Eh, ma komposter ha una macchina migliore!
 
Irtron:
E nella sua forma originale, è solo una canzone :)
Ebbene sì, bisogna pagare per la versatilità.
O ComparePrice è anche adatto a confrontare qualsiasi numero con qualsiasi precisione?
 
komposter:

O ComparePrice è anche adatto a confrontare qualsiasi numero con qualsiasi precisione?
Certo che lo fa! Se la precisione è nota, cosa che accade quando si lavora con i valori di scambio. Punto fisso.
 
Irtron:
Certo! Se la precisione è nota, come nel caso dei valori di scambio. Punto fisso.
Sono d'accordo.
Solo è necessario spiegarlo a numerosi autori di argomenti "sul confronto dei doppi".
Ecco perché ho proposto un modo _universale_ (ma tutt'altro che ottimale) di confrontare.
E funziona. Lentamente ma in modo affidabile. E in tutti i casi.

E quando apparirà un argomento "Sull'ottimizzazione del confronto dei doppi" potremo svilupparlo ;)
 

La normalizzazione dei prezzi è necessaria da qualche parte?

È scritto nella documentazione che i prezzi nelle richieste commerciali devono essere normalizzati.

Nel ramo 'Storia non normalizzata e posizioni di apertura', dice quanto segue:

Renat 16.02.2007 10:01
Abbiamo deliberatamente aggiunto il prezzo normalizzato alle richieste di trading per evitare di inviare inavvertitamente prezzi sbagliati al server.
 
Vorrei ringraziare tutti i professionisti per le loro intuizioni!

Irtron, ho scelto la tua variante, mi è piaciuta molto. L'ho corretto un po' per i casi generali e l'ho controllato:

int ComparePrice(double a, double b, double digit)
{
a -= b;
b = cifra;
se (a > b)
ritorno (1);
se (a < -b)
ritorno (-1);
ritorno (0);
}
Grazie.
 
Con digit=0 ci saranno problemi. Inoltre la funzione è più lenta di una singola chiamata a NormalizeDouble()
 
Integer:
Cifra=0 causerà problemi.

Qualsiasi cifra causerà problemi. Non capisco cosa sia la cifra e a cosa serva la modifica.

Intero:
Inoltre la funzione è più lenta di una singola chiamata aNormalizeDouble().
Inoltre sarà più lento di MathAbs, 2+3 ecc. :)

Qual è l'argomento del confronto tra funzioni con funzionalità diverse? Una semplificata (inattuabile, però), ora è NormalizeDouble.
Cosa e a chi vuoi dimostrare con una così palese... (inserisci la tua parola)?