Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 154

 
paladin800:
Cioè dovete convertire 1,33182 in 1,3318? Si dovrebbe semplicemente tagliare la quinta cifra dopo la virgola o arrotondare fino alla quarta cifra, ad esempio, si avrebbe 1,3318 o 1,3319 da 1,33186?

La mia domanda è se c'è un bug o no. Quando si converte da double a int nel mio esempio, il risultato è uno in meno. Per favore, controllate voi stessi.

   double max=NormalizeDouble(1.33182,4);  
   //double max=1.3318;
   Alert(int(max*10000));
Alert dovrebbe dare 13318, ma dà 13317. Se non è arrotondato a int, darà correttamente 13318.0.
 

Ditemi se c'è una differenza nelle espressioni:

if(bufferclose[1]<=MaxLine(1)-m_open_bar_error*ticksize && bufferopen[1]<=MaxLine(1)-m_open_bar_error*ticksize)

и

if(( bufferclose[1]<=MaxLine(1)-m_open_bar_error*ticksize) && ( bufferopen[1]<=MaxLine(1)-m_open_bar_error*ticksize))
 
sgreen:

Ditemi se c'è una differenza nelle espressioni:

и

Se avete il sospetto che qualcosa non vada bene, fate in modo che sia così:

if(bufferclose[1]<= (  MaxLine(1)-m_open_bar_error*ticksize ) && bufferopen[1]<= (  MaxLine(1)-m_open_bar_error*ticksize ) )
 
Rorschach:

La mia domanda è se c'è un bug o no. Quando si converte da double a int nel mio esempio, il risultato è uno in meno. Per favore, controllate con voi stessi.

Alert dovrebbe dare 13318, ma dà 13317. Così, se non si riduce a int, allora dà correttamente 13318.0
Alert non dà un errore. Il punto è che la normalizzazione porta il numero alla forma binaria, che è più vicina all'analogo decimale richiesto, mentre può non coincidere con esso in più o meno (nel tuo caso) lato. Poiché ciò che è espresso da frazione decimale finita, non sempre può essere espresso da binario finito. Espressione
int(max*10000)

causa lo scarto della parte frazionaria invece dell'arrotondamento (cioè simile a MathFloor() piuttosto che MathRound()), e nel vostro caso, il numero normalizzato potrebbe benissimo essere uguale a 13318 esattamente, ma dire 13317,9999999999999999997

che, quando viene emesso in forma frazionaria con un numero limitato di cifre, causa l'arrotondamento al risultato corretto (previsto), e quando la parte frazionaria di.... viene scartata vedi tu stesso.

Spero di essermi spiegato chiaramente.

 
pronych:
c'è un analogo del parziale di Sharp? o come farlo?

Non c'è un analogo. potete incorporare un pezzo di definizione usando #include <partial_class_code.mqh>.

Alcune persone imitano anche l'eredità multipla in questo modo. // Io non lo faccio, mi sono abituato a farne a meno. :)

 
paladin800:

Se sospettate che ci sia qualcosa che non va, fate in modo che sia così:

L'ho già fatto. Sono solo curioso.
 
sgreen:
L'ho già fatto. Sono solo curioso.

Capisco. Ritornando alla sua domanda precedente, l'essenza del disco può essere disegnata a questo confronto:

if (A<=B && C<=D)     // 1
if ((A<=B) && (C<=D)) // 2

Non c'è differenza tra queste voci. Allo stesso tempo, vi raccomando di mettere tra parentesi i calcoli matematici all'interno degli if-os:

if (A<=(B1+B2*B3) && C<=(D1-D2*D3))
Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network
 
MetaDriver:
L'avviso non produce un errore. Il punto è che la normalizzazione porta un numero a una forma binaria, che è più vicina all'analogo decimale richiesto, mentre può non coincidere con esso in una direzione maggiore o minore (nel tuo caso). Poiché ciò che è espresso da una frazione decimale finita, non sempre può essere espresso da una frazione binaria finita . Espressione

risulta nello scartare la parte frazionaria piuttosto che arrotondare (cioè assomiglia più a MathFloor() che a MathRound()), e nel tuo caso il numero normalizzato potrebbe essere 13317.99999999999999997 piuttosto che 13318 esattamente.

che, quando viene emesso in forma frazionaria con un numero limitato di cifre, causa l'arrotondamento al risultato corretto (previsto), e quando la parte frazionaria di.... viene scartata vedi tu stesso.

Spero di essermi spiegato chiaramente.

Grazie, capisco.

Un'altra domanda, come posso combattere questo se non posso fare a meno di convertire in int?

 
Puoi dirmi come prendere in considerazione la commissione del broker quando si testa un EA?
 
Rorschach:

Grazie, capisco.

Un'altra domanda, come si fa ad affrontare questo se non si può fare a meno di trasferire a int?

e aggiungi un paio di epsilon.

DBL_EPSILON

Il numero più piccolo per il quale è soddisfatta la condizione 1.0+DBL_EPSILON != 1.0


Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов - Документация по MQL5