Double vs FLOAT - errore MathFloor poco chiaro - pagina 6

 
fxsaber:
Sì.
Grazie
 
Vladislav Andruschenko:
Grazie
C'era una soluzione nella prima pagina... è già a pagina 6.
 
fxsaber:
Allora perché funziona senza normalizzazione e MathFloor?
Se l'input è 0,95?
 
Dmitry Fedoseev:
Se l'input è 0,95?
Non capisco.
 
Vladislav Andruschenko:
Forse non sono sicuro di cosa prendere, ma guardate questa opzione
void OnStart()
{
double ask2 = 1.55557, ask3 = 1.55558, bid = 1.55555;
  Print("(ask2 + bid)/2 = ", (ask2 + bid)/2);
   Print("(ask3 + bid)/2 = ", (ask3 + bid)/2);
    int avPrice_2 = (int)NormalizeDouble((ask2/_Point + bid/_Point)/2, 0);
   int avPrice_3 = (int)NormalizeDouble((ask3/_Point + bid/_Point)/2, 0);
  Print("avPrice_2 = ", avPrice_2);
Print("avPrice_3 = ", avPrice_3);
}/*******************************************************************/
risultato
2017.02.27 00:03:54.453 00 (EURUSD.m,H1)        (ask2 + bid)/2 = 1.55556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        (ask3 + bid)/2 = 1.555565
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_2 = 155556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_3 = 155557
 

"Prendi Ask e Bid e calcola il prezzo medio. Se lo spread è dispari (3,5,7,9, ecc.) allora equipara il prezzo medio più vicino al Bid".

Il compito non è impostato:

- Cosa significa uno spread strano. 1,3,...,9 volte Punto o 1,3,...,17,57 volte Punto? Gli arrotondamenti funzionano all'interno dei segmenti di unità...

- cosa significa "più vicino al Bid"? Soprattutto se lo spread è 43 volte Punto, per esempio. Stiamo parlando di equiparare il Bid a cosa?

Bisogna prima fare chiarezza sul problema, solo allora si può prendere una decisione senza ambiguità.

Allo stesso tempo, dato che stiamo parlando di numeri pari/dispari, sarebbe logico passare ai numeri interi, dove questo concetto ha senso.

double Ask,Bid,Middle; // Уже известные курсы Ask и Bid, вычисляемый средний курс
int Mash,Spr; // Множитель перехода к целым числам. Для 4-разрядного EURUSD 10000. И целочисленный спред

Mash=MathRound(1.0/_Point);
Spr=MathRound((Ask-Bid)*Mash); // Целочисленный спред
// Придаем конкретность среднему курсу.  Предполагаем, что "ближе к Бид" значит "ближайший меньший среднего арифметического Ask и Bid, кратный Point"
Spr=Spr >> 1; // Целочисленный спред, деленный на 2 с отбрасыванием остатка
Middle=Bid+Spr*_Point;


// Если предположение неверно, канва последующих разборов такая
if ((Spr &  1)  != 0)) {  // Спред нечетный
  }
else {  // Спред четный
  }

 
Ho avuto qualcosa di simile in un compito molto semplice - lo script ha letto il prezzo di apertura EURUSD dalla serie temporale in un array raddoppiato e poi ha scritto l'array in un file. Finché il prezzo era maggiore di uno, tutto andava bene. Ma quando in un anno zero il prezzo era più basso di 1, a volte non molto spesso, circa 20 volte all'anno, alcune cose strane cominciarono ad accadere - da qualche parte alla quindicesima posizione decimale l'1 fu tagliato e tutti i precedenti, naturalmente, si trasformarono in 9. Non è un grosso problema, ma non è bello. La normalizzazione l'ha fatto ovunque e dopo la lettura e prima di scrivere sul file e durante la registrazione, e la conversione da un array all'altro con la normalizzazione - niente ha funzionato. Se aggiungevo 1 quando leggevo dalle serie temporali, tutto era ok. Alla fine mi sono stufato, ho cambiato il dowble in float e mi sono calmato.
 
Vladimir:

"Prendi Ask e Bid e calcola il prezzo medio. Se lo spread è dispari (3,5,7,9, ecc.) allora equipara il prezzo medio più vicino al Bid".

Il compito non è impostato:

In effetti, il compito sembra essere semplice e può essere fatto da uno scolaro? :-) L'ho pensato anch'io.

Ma nella determinazione dei prezzi dal server, nella normalizzazione dei dati e nel resto - ci sono angoli bui che non si intendono nemmeno.

Ho programmato in mql per 9 anni - e non ho mai avuto un problema con la normalizzazione perché l'ho fatta bene. e la precisione a 1 millipoint ha sempre funzionato correttamente.

Ma ci sono compiti che richiedono un'alta precisione.

E ci sono delle condizioni.

Vale a dire:

  1. Prendiamo il prezzo ASC e BID - calcoliamo il suo prezzo medio = facile? ok.
  2. Di conseguenza, se lo spread è dispari (3 punti per esempio) allora non possiamo dividere senza un resto, giusto?

Quindi, dobbiamo normalizzare il prezzo in modo tale che se c'è un residuo (e ce ne sarà uno anche con uno spread pari! :-)) allora facciamo la media del prezzo più vicino al punto basso, cioè al Bid.

Per esempio:

  • asc = 1,23455 bid = 1,23457 spread = 2 Prezzo medio: 1,23456
  • Ask = 1.23455 Bid = 1.23458 Spread = 3 Prezzo medio: 1.23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Prezzo medio: 1,23457

E tutto sembra essere semplice? Tutto dovrebbe funzionare e io sono un pazzo? e sono rimasto seduto per 2 giorni sperando di non essere un pazzo. Capire di code e dabble e tribbles e bibbles..................

Ma con la stessa formula, con spread pari e spread dispari - in alcune situazioni - la formula non ha funzionato . (vedi sopra) .

Compreso, può funzionare sulle valute e non funzionare sul petrolio.

Potrebbe funzionare su JPY e non funzionare su USD ad un certo punto.

Forse sta guardando l'influenza della luna? Il tempo in Africa .................

Ma, quando si è sicuri che la formula funziona, non si nota che 1 millipunto. e si lavora su..... e poi "Bang, bang, bang, bang" e quel millipunto, decide di scappare, o chiamare il secondo millipunto, che si mette in mezzo.

IMHO.

Potete pensare a me come a uno sciocco, un sottoprogrammatore, uno scolaro.... e così via.

Ma il fatto rimane.

Si verifica un errore con diverse combinazioni di valori doppi. Allo stesso tempo, tutto è chiaro con il galleggiante.

Non l'ho ancora capito. L'aiuto è molto buono e lo chiedo sempre, è normale. E potrei chiedere aiuto alla comunità tra 10 anni. Questo è normale. E rispondo a una richiesta di aiuto se conosco le insidie - è normale.

Naturalmente, dopo questi test, farò delle "indagini supplementari" per capire da solo il perché di questa situazione.

Grazie a tutti per la vostra reattività e il vostro aiuto.

 
Vladislav Andruschenko:

In effetti, il compito sembra essere semplice e può essere fatto da uno scolaro? :-) L'ho pensato anch'io.

Ma ci sono angoli così oscuri nei prezzi ottenuti dal server, nella normalizzazione dei dati e nel resto - che non si intende nemmeno.

Ho programmato in mql per 9 anni - e non ho mai avuto un problema con la normalizzazione perché l'ho fatta bene. e la precisione a 1 millipoint ha sempre funzionato correttamente.

Ma con la stessa formula, con spread pari e spread dispari - in alcune situazioni - la formula non ha funzionato . (vedi sopra) .

Con combinazioni diverse - con valori doppi si verifica un errore. Allo stesso tempo con il galleggiante tutto è chiaro.

Cosa c'entra comunque la versione di Metakvotes della normalizzazione dei dati? Questo termine significa diverse cose per i programmatori e non arrotonda affatto. Leggete lo standard IEEE 754, per esempio, qui:http://www.softelectro.ru/ieee754.html. I numeri reali non normalizzati vanno fino a 1.17549421*10^(-38) in caso di lunghezza di 4 byte e fino a 4....*10^(-324) in caso di lunghezza di 8 byte, li incontriamo molto raramente e certamente non nei calcoli del corso. Se avete bisogno di chiamare OrderSend, allora arrotondate secondo i requisiti di questa funzione. Non c'è bisogno di usare l'arrotondamento finché il compito non lo richiede.

Gli errori non si verificano nel formato doppio o float, ma nelle operazioni utilizzate. Il fatto che la formula non abbia risolto il compito vi dice che non è adatta al compito. Non più di questo. Ditemi quali errori si verificano in un calcolo normale senza normalizzazione (questo è il pezzo del mio post sopra):

Spr=MathRound((Ask-Bid)/_Point); Spr=Spr >> 1; Middle=Bid+Spr*_Point;

IEEE 754 - стандарт двоичной арифметики с плавающей точкой
  • Yashkardin Vladimir
  • www.softelectro.ru
double-precision длина числа, бит 32 64 смещенная экспонента (E), бит 8 11 остаток от мантиссы (M), бит 23 52 смещение 127 1023 двоичное денормализованое число (-1)S∙0,M∙exp2-127 ,где M-бинарное (-1)S∙0,M∙exp2-1023 ,где M-бинарное двоичное нормализованое число (-1)S∙1,M∙exp2(E-127) ,где M-бинарное (-1)S∙1,M∙exp2(E-1023) ,где M-бинарное...
 
Vladislav Andruschenko:

In effetti, il compito sembra semplice e può essere fatto da uno scolaro? :-) L'ho pensato anch'io.

Ma ci sono angoli così oscuri nei prezzi ottenuti dal server, nella normalizzazione dei dati e nel resto - che non si intende nemmeno.

Ho programmato in mql per 9 anni - e non ho mai avuto un problema con la normalizzazione perché l'ho fatta bene. e la precisione a 1 millipoint ha sempre funzionato correttamente.

Ma ci sono compiti che richiedono un'alta precisione.

E ci sono delle condizioni.

Vale a dire:

  1. Prendiamo il prezzo ASC e BID - calcoliamo il suo prezzo medio = facile? ok.
  2. Di conseguenza, se lo spread è dispari (3 punti per esempio) allora non possiamo dividere senza un resto, giusto?

Quindi, dobbiamo normalizzare il prezzo in modo tale che se c'è un residuo (e ce ne sarà uno anche con uno spread pari! :-)) allora facciamo la media del prezzo più vicino al punto basso, cioè al Bid.

Per esempio:

  • asc = 1,23455 bid = 1,23457 spread = 2 Prezzo medio: 1,23456
  • Ask = 1.23455 Bid = 1.23458 Spread = 3 Prezzo medio: 1.23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Prezzo medio: 1,23457

E tutto sembra essere semplice? Tutto dovrebbe funzionare e io sono un pazzo? e sono rimasto seduto per 2 giorni sperando di non essere un pazzo. Capire di code e dabble e tribbles e bibbles..................

Ma con la stessa formula, con spread pari e spread dispari - in alcune situazioni - la formula non ha funzionato . (vedi sopra) .

Compreso, può funzionare sulle valute e non funzionare sul petrolio.

Potrebbe funzionare su JPY e non funzionare su USD ad un certo punto.

Forse sta guardando l'influenza della luna? Il tempo in Africa .................

Ma, quando si è sicuri che la formula funziona, non si nota che 1 millipunto. e si lavora su..... e poi "Bang, bang, bang, bang" e quel millipunto, decide di scappare, o chiama il secondo millipunto, che si mette in mezzo.

IMHO.

Potete pensare a me come a uno sciocco, un sottoprogrammatore, uno scolaro.... e così via.

Ma il fatto rimane.

Si verifica un errore con diverse combinazioni di valori doppi. Allo stesso tempo, tutto è chiaro con il galleggiante.

Non l'ho ancora capito. L'aiuto è molto buono e io chiedo sempre aiuto, è normale. E potrei chiedere aiuto alla comunità tra 10 anni. Questo è normale. E rispondo a una richiesta di aiuto se conosco le insidie. è normale.

Naturalmente, dopo tali test, farò delle "indagini supplementari" per capire da solo il perché di questa situazione.

Grazie a tutti per la vostra reattività e il vostro aiuto.

A seconda dei vostri obiettivi, a volte vale la pena di passare ai numeri interi. Risparmia un sacco di nervi :-) Una volta ho avuto un compito in cui dovevo segnare accuratamente molti, molti livelli, all'inizio ho lottato con il doppio, ma poi ho convertito tutto in punti interi da 0 e tutto è diventato facile, semplice e senza errori.