Errori, bug, domande - pagina 108

 
Interesting:

Più affidabile? Perché ottenere gli handle all'inizializzazione non è affidabile? Perché è inaffidabile controllare i dati necessari? E ancora di più, perché la presenza di controlli non è affidabile?

Per i principianti può non essere così facile, ma con il tempo tutto diventerà chiaro...

Infatti, sto cercando di capirlo subito, non dopo... Non voglio semplicemente copiare alcune azioni senza capirne il significato. Se ho il codice come una funzione integrata come in MQL4, probabilmente aggiungerò qualche parametro extra con il numero di barre.

 

Perché si carica?

 
simpleton:

I "numeri ordinari" sono espressioni costanti, che hanno anche un tipo. In questo caso è il tipo int.

Un'espressione che consiste in una moltiplicazione di due sottoespressioni, ciascuna di tipo int, è anche di tipo int. È qui che si verifica l'overflow.

E solo allora la conversione implicita dal tipo dell'espressione int al tipo long avviene durante l'inizializzazione della variabile long.

Qui è tutto chiaro. A proposito, non è necessario lanciare ciascuno degli operandi a long in questo caso. Possiamo semplicemente lanciarne uno e lanciare implicitamente il secondo.

Questo è quello che stavo cercando di dire, ma usando un linguaggio meno accademico. La cosa principale è mettere in guardia gli altri cercatori.

La domanda è diversa. Dove in quale Talmud si dice che :

I "numeri ordinari" sono espressioni costanti che hanno anche un tipo. In questo caso è il tipo int.

Per esempio, se X è impostato a 10000000000, allora diventa di tipo lungo? E perché non ulong o datetime o anche stringa?

Qual è il tipo di numero 255uchar oshort?

 
gumgum:

Perché si carica?

Probabilmente perché GBPJPY crosspair e ci sono calcoli di margine da qualche parte nel codice. IMHO
 
simpleton:

Sembra che ci sia una confusione tra il registro e il codice. Il codice di cui sopra funziona "pulito". E, per ottenere un tale registro, ho dovuto rendere le variabili A e B di tipo int o uint, e la variabile X di tipo uint:

Ed ecco il lavoro del codice originale:

Build 314 (20 agosto 2010).

Ho citato un codice diverso

long A = AccountInfoInteger(ACCOUNT_LOGIN);  // 661701
long B = A;
long C = 661701;

Print(" A=",A,"  B=",B,"  C=",C);

long X =(long)10000;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print(" L1=",L1,"   L2=",L2,"   L3=",L3);

Prestate particolare attenzione alla prima riga, il vostro account potrebbe avere un numero diverso. Cercatelo e mettetelo nel lungo C =

Controllato di nuovo il risultato

2010.08.25 20:23:12     Servis (EURUSD,H1)       L1=2322042704   L2=2322042704   L3=6617010000
2010.08.25 20:23:12     Servis (EURUSD,H1)       A=661701  B=661701  C=661701

Build 314 (20 agosto 2010).

 
Per favore ditemi perché la funzione SymbolInfoDouble(_Symbol,SYMBOL_POINT) dà un valore di cinque cifre di 0,00001 dopo il punto decimale per USDCHF, quando il valore accettato per questa coppia è 0,0001?
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
  • www.mql5.com
Получение рыночной информации / SymbolInfoDouble - Документация по MQL5
 
rut_:
Per favore ditemi perché la funzione SymbolInfoDouble(_Symbol,SYMBOL_POINT) della coppia USDCHF produce un punto di cinque cifre dopo il punto decimale 0.00001, quando questa coppia è accettata per il valore del punto 0.0001?

perché pensate che ci siano 4 cifre in questo strumento, il terminale mostra chiaramente che le citazioni sono a 5 cifre
 
sergey1294:
Cosa ti fa pensare che ci siano 4 cifre in questo strumento, il terminale mostra chiaramente che le citazioni sono 5 cifre

Questa funzione può restituire diversi valori di punti anche in conti con cinque cifre, tutto dipende dalle impostazioni che saranno accettate dal broker.

Per esempio, una società di intermediazione ha il seguente commento

1 pips (пункт) равен:

для валютных пар с 5 знаками после запятой - минимальному изменению 4-го знака после запятой (0,0001);
для валютных пар с 3 знаками после запятой - минимальному изменению 2-го знака после запятой (0,01).

e un altro ha 1 pip uguale alla quinta cifra.

 
SHOOTER777:

È quello che stavo cercando di dire, ma in termini meno accademici. E soprattutto per mettere in guardia gli altri cercatori.

La domanda è diversa. Dove in quale Talmud si dice che :

I "numeri ordinari" sono espressioni costanti, che hanno anche un tipo. In questo caso è il tipo int.

Per esempio, se X è impostato a 10000000000, allora diventa di tipo lungo? E perché non ulong o datetime o anche stringa?

Qual è il tipo di numero 255uchar oshort?

La costante 10000000000 è già di tipo long.

Come devo metterlo? I linguaggi normali hanno suffissi-modificatori che permettono di specificare il tipo di costante senza usare una conversione di tipo esplicita. Per MQL5, l'ho trovato solo per float. Pertanto, è impossibile definire costanti di tipo uchar, ushort, uint, ulong, char, short e long (se il valore della costante rientra nel tipo int) senza conversione esplicita del tipo.

La costante 255 ha un tipo int. Potete trovare qualcosa nelle descrizioni dei tipi, per esempio, le costanti di carattere sono dichiarate di tipo ushort. Ci sono anche informazioni sulle costanti di tipo datetime, colore, bool, doppio e stringa.

Si può provare a stampare la dimensione del tipo di costante, a condizione che venga introdotta l'operazione sizeof (ma perché viene introdotta, spiegatelo a uno degli sviluppatori):

void OnStart()
{
  Print("sizeof true                = ", sizeof true);
  Print("sizeof 'a'                 = ", sizeof 'a');
  Print("sizeof 255                 = ", sizeof 255);
  Print("sizeof 200000000           = ", sizeof 20000000);
  Print("sizeof 10000000000         = ", sizeof 10000000000);
  Print("sizeof C'128,128,128'      = ", sizeof C'128,128,128');
  Print("sizeof D'2004.01.01 00:00' = ", sizeof D'2004.01.01 00:00');
  Print("sizeof 1.0f                = ", sizeof 1.0 f);
  Print("sizeof 1.0                 = ", sizeof 1.0);
  Print("sizeof \"Xa!\"               = ", sizeof "Xa!");
  Print("sizeof \"Xa-xa-xa!!!\"       = ", sizeof "Xa-xa-xa!!!");
}

/* Вывод в лог (хронология - сверху вниз):
GF      0       1 (EURUSD,M15)  02:03:23        sizeof true                = 1
IS      0       1 (EURUSD,M15)  02:03:23        sizeof 'a'                 = 2
LF      0       1 (EURUSD,M15)  02:03:23        sizeof 255                 = 4
JI      0       1 (EURUSD,M15)  02:03:23        sizeof 200000000           = 4
EQ      0       1 (EURUSD,M15)  02:03:23        sizeof 10000000000         = 8
DG      0       1 (EURUSD,M15)  02:03:23        sizeof C'128,128,128'      = 4
JN      0       1 (EURUSD,M15)  02:03:23        sizeof D'2004.01.01 00:00' = 8
GE      0       1 (EURUSD,M15)  02:03:23        sizeof 1.0f                = 4
GR      0       1 (EURUSD,M15)  02:03:23        sizeof 1.0                 = 8
QJ      0       1 (EURUSD,M15)  02:03:23        sizeof "Xa!"               = 12
ER      0       1 (EURUSD,M15)  02:03:23        sizeof "Xa-xa-xa!!!"       = 12
*/

In generale, tra i suffissi solo f funziona per le costanti doppie, modificandole in float, che può essere visto dalla dimensione del tipo di tale costante.

Qui, l'unico uso sensato dell'operazione sizeof che ho potuto trovare. :)

 
SHOOTER777:

Ti ho dato un codice diverso

Prestate particolare attenzione alla prima riga, potrebbe esserci un numero diverso sul vostro conto. Cercatelo e mettetelo nel lungo C =

Controllato di nuovo il risultato

Build 314 (20 agosto 2010).

No, non ho lo stesso effetto che hai tu. Devo solo controllare le versioni bit di MT5. Io ho la versione a 64 bit, qual è la vostra?

A proposito, il codice modificato che ho testato vi dà i miei stessi risultati?

Se sì, allora quello che vedo è molto simile a quel bug sull'"origine" di un valore - cioè il codice può comportarsi diversamente (sia correttamente che erroneamente) a seconda della provenienza del valore su cui si basano gli ulteriori calcoli.