Errori, bug, domande - pagina 2820

 
Kira27:

Il certificato mi ha confuso)))

Il riferimento dice senza virgolette. Quindi ti ci metti anche tu.

 
Una domanda con la barba. Ma non capisco questo risultato.
void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:
Domanda con la barba. Ma non capisco questo risultato.

È stato detto 100 volte: "non usare il paragone esatto, usa l'epsilon". Incluso nella nostra documentazione.

Nemmeno lo 0,3 o lo 0,7 si confronta con le vostre percezioni. Accettatelo e superatelo. O andare a imparare (al MTI, per esempio)

 
Slava:

È stato detto 100 volte: "non usare il confronto esatto dei dub, usa l'epsilon". Incluso nella nostra documentazione.

So come fare un confronto di dub, naturalmente.

Nemmeno lo 0,3 o lo 0,7 sarà paragonabile alle vostre percezioni. Accettatelo e superatelo. O andare a imparare (al MTI, per esempio).

Print(NormalizeDouble(0.3, 5) == 0.3); // true
Print(NormalizeDouble(0.7, 5) == 0.7); // true

Print(NormalizeDouble(0.12345, 5) == 0.12345); // true

Lei non capisce la domanda.

 
decimale lo renderebbe più facile, ma è lento(
 
fxsaber:

Posso fare un confronto del dub, naturalmente.

Lei non capisce la domanda.

Ci sono altre sottigliezze.

Un numero reale moltiplicato per 0,5 potrebbe non essere paragonabile allo stesso numero diviso per 2,0

 
Slava:

Ci sono altre sottigliezze.

Un numero reale moltiplicato per 0,5 può non essere uguale allo stesso numero diviso per 2,0

Questo è vero. Ma la domanda era: perché il numero 1,79435 non è normalizzato con 5 cifre decimali?


ZS Lo sfondo di questa domanda.

L'SL nel Tester si è spento. DEAL_PRICE = 1,79435, ORDER_PRICE_OPEN = 0(come in MT5), DEAL_COMMENT = "sl 1,79435".

Volevo sapere se c'è stato uno slittamento quando ho eseguito SL o no? Quindi ho semplicemente confrontato DEAL_PRICE e il prezzo del commento. Con i miei occhi vedo che i prezzi sono gli stessi ma MQL mostra che non lo sono. Finalmente sono arrivato in fondo al confronto originale.

Forum sul trading, sistemi di trading automatico e test di strategia

Errori, bug, domande

fxsaber, 2020.08.10 09:04

void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:

Tutto vero. Ma la domanda era perché il numero 1,79435 non è normalizzato alla quinta cifra decimale?


ZS Sfondo della domanda.

L'SL nel Tester è stato attivato. DEAL_PRICE = 1,79435, ORDER_PRICE_OPEN = 0(come in MT5), DEAL_COMMENT = "sl 1,79435".

Volevo sapere se c'è stato uno slittamento quando ho eseguito SL o no? Quindi ho semplicemente confrontato DEAL_PRICE e il prezzo del commento. Con i miei occhi vedo che i prezzi sono gli stessi ma MQL mostra che non lo sono. Ho finito per arrivare al confronto originale.

Scusa, ma è un po' strano sentirti dire questo.


 
Alexey Viktorov:

Mi dispiace, ma è un po' strano sentirti dire questo.

Ripeto la mia domanda.

fxsaber:

Perché il numero 1,79435 non è normalizzato alla quinta cifra decimale?

void OnStart()
{
  const double Norm = NormalizeDouble(1.79435, 5);
  
  Print((double)(string)Norm == Norm);    // false
  Print((double)(string)Norm == 1.79435); // true
}
 
fxsaber:

Tutto vero. Ma la domanda era: perché il numero 1,79435 non è normalizzato alla quinta cifra decimale?

la normalizzazione non è l'arrotondamento.

@Slava scrive che la rappresentazione interna del doppio è diversa:

#define  PRINT(EX) Print(#EX," = ",EX)
//+------------------------------------------------------------------+
void OnStart()
{
   union ULONG_DOUBLE
   {
      double d_value;
      ulong ul_value;
   }tmp;
   double NORM_DOUBLE   = NormalizeDouble(1.79435, 5);
   double CONST_DOUBLE  = 1.79435;
   
   PRINT(NORM_DOUBLE);
   tmp.d_value = NORM_DOUBLE;
   PRINT(LongToHex(tmp.ul_value));
   
   tmp.d_value = CONST_DOUBLE;
   PRINT(CONST_DOUBLE);
   PRINT(LongToHex(tmp.ul_value));
}
//+------------------------------------------------------------------+
string LongToHex(const ulong value)
{
   return(StringFormat("%llX", value));
}
//+------------------------------------------------------------------+

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) NORM_DOUBLE = 1,79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DDA

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) CONST_DOUBLE = 1,79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD9


SZS: C'era un buon post di@Nikolai Semko da qualche parte, ha dato una descrizione molto buona di come lavorare con il doppio, forse troverò il link.

UPD:https://www.mql5.com/ru/forum/1111/page2623#comment_14473837