Errori, bug, domande - pagina 1932

 
Комбинатор:

In generale, il tipo decimale sarebbe utile, è una cosa comoda.

Sì, la sua assenza nel software che lavora con i prezzi è stata confusa, per non dire altro, dall'inizio dell'esistenza di MT.

PS. Ora, con l'esistenza del linguaggio OOP, MQ probabilmente pensa che chi vuole può scrivere una classe per se stesso. Solo che non puoi metterlo in una struttura semplice dopo - dovresti serializzarlo/deserializzarlo in qualcosa di semplice come ulong.
 
Slava:

Le sono davvero molto grato per aver risposto in modo così dettagliato. La normalizzazione è usata per generare richieste di scambio.

// Point = 0.001, Digits = 3
OrderSend(8274 * Point);
OrderSend(NormalizeDouble(8274 * Point, Digits));

In questo esempio sembrerebbe che vengano inviati prezzi diversi in questi due OrderSend.

Si è sempre supposto che moltiplicare un intero per un Punto non richieda una normalizzazione aggiuntiva (è così che sono stati impostati SL e TP, per esempio).

Quindi quale delle due linee causerà un errore?

 
Stanislav Korotky:

Sì, la sua assenza nel software che lavora con i prezzi è stata imbarazzante dall'inizio dell'esistenza di MT, per non dire altro.

Non può essere che nessuno abbia scritto nella SD
 
fxsaber:

Le sono davvero molto grato per aver risposto in modo così dettagliato. La normalizzazione è usata per generare richieste di scambio.

In questo esempio sembrerebbe che vengano inviati prezzi diversi in questi due OrderSend.

Si è sempre supposto che moltiplicare un intero per un Punto non richieda una normalizzazione aggiuntiva (è così che sono stati impostati SL e TP, per esempio).

Quindi quale delle due linee causerà l'errore?

Cool

#include <MT4Orders.mqh>

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);  
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
  
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Num, 0, 0, 0);
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Norm, 0, 0, 0);
}

Risultato

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

Entrambe le query con prezzi diversi, ma eseguite senza problemi per lo stesso prezzo. Come mai?

 
fxsaber:

Cool

Risultato

Entrambe le query con prezzi diversi, ma eseguite senza problemi allo stesso prezzo. Come può essere?

Molto semplicemente, dal punto di vista del doppio, questi numeri sono identici, perché il doppio memorizza 52 bit di mantissa o 15 cifre decimali. Le differenze di più o meno nei bit successivi non contano. Ecco un articolo su hubra.

 
Stanislav Korotky:

Molto semplicemente, dal punto di vista del doppio, questi numeri sono uguali perché il doppio memorizza 52 bit della mantissa o 15 cifre decimali. Le differenze di più o meno nelle cifre successive non contano. Ecco un articolo su hubra.

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber, 2017.07.19 13:00

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}

И?

 

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

Bug, bug, domande

fxsaber, 2017.07.17 21:49

Se si clicca su "Stop" durante una singola esecuzione, OnDeinit e i distruttori non vengono chiamati.

È un difetto o un bug?

In questo momento, premere il pulsante "Stop" provoca una dura disconnessione con l'agente. Così difficile che è impossibile vedere il rapporto senza aspettare il completamento di una singola corsa.

In MT4 è sempre possibile vedere la storia del trading di un singolo trade incompleto. Ma in MT5 non c'è modo.

È possibile non terminare la connessione duramente, ma inviare un flag all'agente che potrebbe essere catturato ed eseguire OnDeinit su di esso?

 
Stanislav Korotky:

И?

Stanislav Korotky:

Molto semplicemente, dal punto di vista del doppio, questi numeri sono uguali perché il doppio memorizza 52 bit di mantissa o 15 cifre decimali. Le differenze di più o meno nei bit successivi non contano. Ecco un articolo su hubra.

La differenza è maggiore di 1e-15. Inoltre, Num != Norm. Sono numeri diversi, non lo stesso.
 
Stanislav Korotky:

И?

In realtà sono d'accordo, se impostiamo un letterale, sarebbe logico che la sua rappresentazione doppia sia normalizzata dal numero di cifre nel letterale