Qualsiasi domanda da un PROFI a un SUPER PROFI - 1. - pagina 20

 

Dato:

Nella funzione init() dell'EA, viene inizializzato un generatore MQL PSP: MathSrand(...). Quando il terminale si avvia, diverse (per chiarezza, diciamo tre) copie dell'Expert Advisor vengono caricate dal modello. Il caricamento è veloce, quindi è molto probabile (e lo è quasi sempre) che le funzioni TimeLocal() e TimeCurrent() restituiscano gli stessi valori in tutte le copie.

Domanda:

Quali trucchi ci sono per far sì che il PRNG inizializzi numeri diversi in diverse copie dell'EA? In altre parole, dove (con il minimo sforzo di programmazione) ottenere l'elemento di casualità?

 
alsu:

Dato:

Nella funzione init() dell'EA, viene inizializzato un generatore MQL PSP: MathSrand(...). Quando il terminale si avvia, diverse (per chiarezza, diciamo tre) copie dell'Expert Advisor vengono caricate dal modello. Il caricamento è veloce, quindi è molto probabile (e lo è quasi sempre) che le funzioni TimeLocal() e TimeCurrent() restituiscano gli stessi valori in tutte le copie.

Domanda:

Quali trucchi ci sono per far sì che il PRNG inizializzi numeri diversi in diverse copie dell'EA? In altre parole, dove (con il minimo sforzo di programmazione) ottenere l'elemento di casualità?

GetTickCount?
 
sergeev:
GetTickCount ?


potrebbe funzionare, ma non per certo...

Un millisecondo per un programma può essere un'eternità).

 
alsu:

potrebbe funzionare, ma non per certo...
Opzione 2 - usare variabili globali per creare "semafori" per inizializzare gli EA in modo sequenziale.
 
sergeev:
opzione 2 - usare variabili globali per creare "semafori" per inizializzare gli esperti in sequenza.
Questo è più vicino al punto, grazie.
 

Domanda sul recupero di righe da dll in mql.

la funzione mysql_fetch_row da libmysql.dll restituisce il tipo MYSQL_ROW

Questo tipo è definito come: typedef char** MYSQL_ROW

Come si arriva a questo array di stringhe restituito?

 
Ledimensioni dell'array sono note?
 
Zhunko:
Le dimensioni dell'array sono note?
sì, il numero di linee è noto.

ma la lunghezza di ogni riga non lo è.

C'è un'altra cosa in quell'esempio di link - ottenere un puntatore *lengths.
Risulta essere anche un array... Ma come arrivarci...

	unsigned long *lengths;lengths =  mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++) { printf("[%.*s] ", (int) lengths[i
], row[i] ? row[i] : "NULL"); }

Ecco cosa si ottiene in MQL quando si passa solo il risultato di mysql_fetch_row alla stringa

p0ƒu0ƒ;1;a

dove
p0ƒu0ƒ è l'indirizzo (8 byte) della stringa
;1;a è il suo dato utilizzabile


ma se lo impostate su int, allora invece di p0ƒ l'indirizzo è 42152040


	          
 
declspec (dllexport) char* WINAPI Func(const char* szBufString,
                                       const int   nSizeBuf)
 {
  MYSQL_ROW aszString; 
  memcpy_s(szBufString, nSizeBuf + 1, aszString[номер ячейки], strlen(aszString[номер ячейки]));
  return(szBufString);
 }

Se il puntatore alla stringa non cambia durante l'esecuzione del programma, potete restituire il puntatore alla stringa senza copiarlo nel buffer.

declspec (dllexport) char* WINAPI Func()
 {
  MYSQL_ROW aszString;
  return(aszString[номер ячейки]);
 }
 

Quindi non c'è modo di farlo in MQL, nemmeno in MQL5?

Zhunko:
Se il puntatore alla stringa non cambia durante l'esecuzione del programma, potete restituire il puntatore alla stringa senza copiarlo nel buffer.

Semplicemente
return aszString[номер ячейки]