Toute question d'un PROFI à un SUPER PROFI - 1. - page 20

 

Étant donné :

Dans la fonction init() de l'EA, un générateur MQL PSP est initialisé : MathSrand(...). Lorsque le terminal démarre, plusieurs (pour plus de clarté, disons trois) copies du conseiller expert sont chargées à partir du modèle. Le chargement est rapide, il est donc très probable (et c'est presque toujours le cas) que les fonctions TimeLocal() et TimeCurrent() renvoient les mêmes valeurs dans toutes les copies.

Question :

Quelles sont les astuces pour que le PRNG initialise des nombres différents dans différentes copies de l'EA ? En d'autres termes, où (avec un effort de programmation minimal) obtenir l'élément de hasard ?

 
alsu:

Étant donné :

Dans la fonction init() de l'EA, un générateur MQL PSP est initialisé : MathSrand(...). Lorsque le terminal démarre, plusieurs (pour plus de clarté, disons trois) copies du conseiller expert sont chargées à partir du modèle. Le chargement est rapide, il est donc très probable (et c'est presque toujours le cas) que les fonctions TimeLocal() et TimeCurrent() renvoient les mêmes valeurs dans toutes les copies.

Question :

Quelles sont les astuces pour que le PRNG initialise des nombres différents dans différentes copies de l'EA ? En d'autres termes, où (avec un effort de programmation minimal) obtenir l'élément de hasard ?

GetTickCount?
 
sergeev:
GetTickCount ?


pourrait fonctionner, mais ce n'est pas sûr...

Une milliseconde pour un programme peut être une éternité).

 
alsu:

pourrait fonctionner, mais ce n'est pas sûr...
option 2 - utiliser des variables globales pour créer des "sémaphores" afin d'initialiser les EA en séquence.
 
sergeev:
option 2 - utiliser des variables globales pour créer des "sémaphores" pour initialiser les experts en séquence.
C'est plus proche de la réalité, merci.
 

Question sur la récupération des lignes de la dll dans mql.

La fonction mysql_fetch_row de libmysql.dll renvoie le type MYSQL_ROW.

Ce type est défini comme suit : typedef char** MYSQL_ROW

Comment puis-je accéder à ce tableau de chaînes retournées ?

 
Lesdimensions du tableau sont-elles connues ?
 
Zhunko:
Les dimensions du tableau sont-elles connues ?
oui, le nombre de lignes est connu.

mais la longueur de chaque ligne ne l'est pas.

Il y a une autre chose dans cet exemple de lien - obtenir un pointeur *lengths.
Il s'avère que c'est aussi un tableau... Mais comment y accéder...

	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") ; }

Voici ce que vous obtenez en MQL lorsque vous passez le résultat de mysql_fetch_row à une chaîne de caractères.

p0ƒu0ƒ;1;a


p0ƒu0ƒ est l'adresse (8 octets) de la chaîne de caractères.
;1;a est sa donnée utilisable


mais si vous le mettez en int, alors au lieu de p0ƒ l'adresse est 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);
 }

Si le pointeur vers la chaîne de caractères ne change pas pendant l'exécution du programme, vous pouvez retourner le pointeur vers la chaîne de caractères sans la copier dans le tampon.

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

Il n'y a donc aucun moyen de le faire dans MQL ? Pas même dans MQL5 ?

Zhunko:
Si le pointeur vers la chaîne de caractères ne change pas pendant l'exécution du programme, vous pouvez retourner le pointeur vers la chaîne de caractères sans la copier dans le tampon.

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