mt5 strategia tester ticks - pagina 11

 
RaptorUK:

Voglio essere in grado di controllare i dati storici che uso in modo da poter ripetere i test (Strategy Tester) in condizioni controllate.

Quali condizioni controllate?

Grazie, grazie

 
WhooDoo22:

Quali condizioni controllate?

Grazie.

Le condizioni che scelgo io, non le condizioni che sceglie il mio Broker. Come altro proponi di fare i test? un insieme di condizioni casuali per ogni test? ma non andiamo fuori tema.
 
RaptorUK:
Le condizioni che scelgo io, non quelle che sceglie il mio Broker. Come altro proponi di testare? Un insieme di condizioni casuali per ogni test? Ma non andiamo fuori tema.

Ho capito.

Grazie, grazie.

 
angevoyageur:

No. Se leggete il mio link e/o quello di RaptorUK, questo vi sarebbe più chiaro. Se no, rileggi :-D

1.000000000006551e-005 è semplicemente un'altra notazione per 0.000010000000006551.

Ciao angevoyageur,

1.000000000006551e-005

0.00001000000000006551

Il decimale del secondo doppio è spostato a sinistra cinque volte MA ;) non può essere restituito nel tester in questo formato perché i doppi restituiscono un valore massimo di sedici cifre (cifre significative) a destra di un decimale.



Moderatore
1651
angevoyageur 2013.04.14 09:39
WhooDoo22:

Ciao comunità MQL5,

https://www.mql5.com/en/docs/common/comment

"Idati di tipo doppio sono emessi con la precisione fino a 16 cifre dopo la virgola, e possono essere emessi sia in formato tradizionale che in formato scientifico, a seconda di quale notazione sarà più compatta. I dati di tipo float vengono emessi con 5 cifre dopo la virgola. Per emettere numeri reali con un'altra precisione o in un formato predefinito, usate la funzione DoubleToString()".

Larappresentazione del prezzo di USDJPY in 98.370 è un dato di tipo float (uscita a 5 cifre dopo il decimale).

La rappresentazione del prezzo di USDJPY in -0.0019999999995339 è un dato di tipo double, formato tradizionale (output fino a 16 cifre dopo il decimale).

Perché il doppio -0.00199999999999533[9] restituisce una diciottesima cifra dopo il decimale se un output doppio è solo fino a 16 cifre dopo il decimale?

Grazie per l'aiuto.

I prezzi sono sempre doppi, 98.370 è un doppio. Ci sono 16 cifre significative. Gli zeri non sono significativi.


Se gli zeri non sono significativi, perché il valore 0.00001000000000006551 non potrebbe essere restituito nel tester invece di 1.000000000006551e-005? Preferirei fare i calcoli in formato 0.00001000000000006551 !

Grazie, grazie

 
WhooDoo22:


Se gli zeri non sono significativi, perché il valore 0.00001000000000006551 non potrebbe essere restituito nel tester invece di 1.000000000006551e-005? Preferirei fare i calcoli in formato 0.00001000000000006551 !

Un numero in virgola mobile (doppio) è sempre tenuto internamente in questo formato... 1.000000000006551e-005, hai letto e capito le informazioni ai link indicati?

Da qui:numeri in virgola mobile

"Un float IEEE-754 (4 byte) o un double (8 byte) ha tre componenti (c'è anche un analogo formato a 96 bit a precisione estesa sotto IEEE-854): un bit di segno che dice se il numero è positivo o negativo, un esponente che dà il suo ordine di grandezza, e una mantissa che specifica le cifre reali del numero. Usando i float a singola precisione come esempio, ecco la disposizione dei bit:"

3 parti

SegnoMantissaEsponente
+1.000000000006551-005

Se volete vedere 0.00001000000000xyz allora usate DoubleToStr() per formattare l'output a vostro piacimento.

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
RaptorUK:

Un numero in virgola mobile (doppio) è sempre tenuto internamente in questo formato... 1.000000000006551e-005, hai letto e capito le informazioni ai link indicati?

Da qui:numeri in virgola mobile

"Un float IEEE-754 (4 byte) o un double (8 byte) ha tre componenti (c'è anche un analogo formato a 96 bit a precisione estesa sotto IEEE-854): un bit di segno che dice se il numero è positivo o negativo, un esponente che dà il suo ordine di grandezza, e una mantissa che specifica le cifre reali del numero. Usando i float a singola precisione come esempio, ecco la disposizione dei bit:"

3 parti

SegnoMantissaEsponente
+1.000000000006551-005

Se volete vedere 0.00001000000000xyz allora usate DoubleToStr() per formattare l'output a vostro piacimento.

Sì, ho letto tutti i tuoi link forniti e li ho trovati utili, grazie ancora per averli forniti. Il mio gusto sarebbe quello di incorporare DoubleToString e scegliere il valore del penultimo posto del doppio (esempio:CADJPY 95.9[5]9) come secondo parametro di DoubleToString. Non credo che questo problema "can price!=price" sia troppo difficile da risolvere! Cosa ne dite di questo?

Grazie a voi

 
WhooDoo22:

Sì, ho letto tutti i tuoi link forniti e li ho trovati utili, grazie ancora per averli forniti. Mi piacerebbe incorporare DoubleToString e scegliere il valore del penultimo posto del doppio (esempio:CADJPY 95.9[5]9) come secondo parametro di DoubleToString. Non credo che questo problema "can price!=price" sia troppo difficile da risolvere! Cosa ne dici di questo?

Intendi qualcosa del genere?

double value = 95.959;

Print("Value: ", DoubleToStr(value, _Digits - 1) );

Può il prezzo != prezzo è un problema diverso, ma leggermente collegato. Non può essere veramente risolto, prima devi capire qual è il problema . . . poi ci lavori intorno.

 
RaptorUK:

Quindi intendi qualcosa del genere?

Can price != price è un problema diverso, ma leggermente collegato. Non può essere veramente risolto, prima devi capire qual è il problema. . . poi ci lavori intorno.

double value=95.959;

Print("value returns ",DoubleToString(value,2));//value's expected print return is 95.95.

Quali sono i tuoi pensieri su cosa sia questo problema "can price != price"?

Grazie a tutti

 

WhooDoo22:

...

I prezzi sono sempre doppi, 98,370 è un doppio. Ci sono 16 cifre significative. Gli zeri non sono significativi.

Se gli zeri non sono significativi, perché il valore 0.00001000000000006551 non potrebbe essere restituito nel tester invece di 1.000000000006551e-005? Preferirei fare i calcoli in formato 0.00001000000000006551 !

Grazie

Potrebbe essere, è solo una scelta di formattazione del valore di uscita.

Tutti gli equivalenti
0.00001000000000006551
0.0001000000000006551e-001
0.001000000000006551e-002
0.01000000000006551e-003
0.1000000000006551e-004
1.000000000006551e-005

È proprio perché gli zeri non sono significativi

WhooDoo22:

Sì, ho letto tutti i tuoi link forniti e li ho trovati utili, grazie ancora per averli forniti. Il mio gusto sarebbe quello di incorporare DoubleToString e scegliere il valore del penultimo posto del doppio (esempio:CADJPY 95.9[5]9) come secondo parametro di DoubleToString. Non credo che questo problema "can price!=price" sia troppo difficile da risolvere! Cosa ne dite di questo?

Grazie.

Scusa ma non capisco questa frase.
 
angevoyageur:

Potrebbe essere, è solo una scelta di formattazione del valore di uscita.

Tutti gli equivalenti
0.00001000000000006551
0.0001000000000006551e-001
0.001000000000006551e-002
0.01000000000006551e-003
0.1000000000006551e-004
1.000000000006551e-005

È proprio perché gli zeri non sono significativi

Scusa ma non capisco questa frase.

"Scusa ma non capisco questa frase".

double value=95.959;

Print("value returns ",DoubleToString(value,2));//value's expected print return is 95.95.

Grazie.