Cualquier pregunta de un PROFI a un SUPER PROFI - 1. - página 20

 

Dada:

En la función init() del EA, se inicializa un generador MQL PSP: MathSrand(...). Cuando el terminal se inicia, se cargan varias (para mayor claridad, digamos tres) copias del Asesor Experto desde la plantilla. La carga es rápida, por lo que es muy probable (y casi siempre lo es) que las funciones TimeLocal() y TimeCurrent() devuelvan los mismos valores en todas las copias.

Pregunta:

¿Qué trucos hay para conseguir que el PRNG inicialice números diferentes en distintas copias del EA? En otras palabras, ¿dónde (con un mínimo esfuerzo de programación) conseguir el elemento de aleatoriedad?

 
alsu:

Dada:

En la función init() del EA, se inicializa un generador MQL PSP: MathSrand(...). Cuando el terminal se inicia, se cargan varias (para mayor claridad, digamos tres) copias del Asesor Experto desde la plantilla. La carga es rápida, por lo que es muy probable (y casi siempre lo es) que las funciones TimeLocal() y TimeCurrent() devuelvan los mismos valores en todas las copias.

Pregunta:

¿Qué trucos hay para conseguir que el PRNG inicialice números diferentes en distintas copias del EA? En otras palabras, ¿dónde (con un mínimo esfuerzo de programación) conseguir el elemento de aleatoriedad?

GetTickCount?
 
sergeev:
GetTickCount ?


podría funcionar, pero no es seguro...

Un milisegundo para un programa puede ser una eternidad).

 
alsu:

podría funcionar, pero no es seguro...
opción 2 - utilizar variables globales para crear "semáforos" para inicializar los EAs en secuencia.
 
sergeev:
opción 2 - utilizar variables globales para crear "semáforos" para inicializar a los expertos en secuencia.
Eso está más cerca de la cuestión, gracias.
 

Pregunta sobre la obtención de filas de la dll en mql.

function mysql_fetch_row from libmysql.dll returns type MYSQL_ROW

Este tipo se define como: typedef char** MYSQL_ROW

¿Cómo puedo llegar a esta matriz de cadenas devuelta?

 
 
Zhunko:
¿Se conocen las dimensiones de la matriz?
Sí, el número de líneas es conocido.

pero la longitud de cada fila no lo es.

Hay otra cosa en ese ejemplo de enlace: obtener un puntero de *longitudes.
También resulta ser una matriz... Pero cómo llegar a ella...

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

esto es lo que se obtiene en MQL al pasar el resultado de mysql_fetch_row a la cadena

p0ƒu0ƒ;1;a

donde
p0ƒu0ƒ es la dirección (8 bytes) de la cadena
;1;a son sus datos utilizables


pero si lo pones en int, entonces en lugar de p0ƒ la dirección es 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 el puntero a la cadena no cambia mientras se ejecuta el programa, puede devolver el puntero a la cadena sin copiarlo en el buffer.

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

¿Entonces no hay manera de hacerlo en MQL? ¿Ni siquiera en MQL5?

Zhunko:
Si el puntero a la cadena no cambia mientras se ejecuta el programa, puede devolver el puntero a la cadena sin copiarlo en el buffer.

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