Qualquer pergunta de um PROFI para um SUPER PROFI - 1. - página 20

 

Dado:

Na função init() do EA, um gerador MQL PSP é inicializado: MathSrand(...). Quando o terminal inicia, várias (para maior clareza, digamos três) cópias do Expert Advisor são carregadas a partir do modelo. O carregamento é rápido, portanto é muito provável (e quase sempre é) que as funções TimeLocal() e TimeCurrent() retornem os mesmos valores em todas as cópias.

Pergunta:

Que truques existem para conseguir que a PRNG rubrique números diferentes em cópias diferentes da EA? Em outras palavras, onde (com o mínimo esforço de programação) obter o elemento de aleatoriedade?

 
alsu:

Dado:

Na função init() do EA, um gerador MQL PSP é inicializado: MathSrand(...). Quando o terminal inicia, várias (para maior clareza, digamos três) cópias do Expert Advisor são carregadas a partir do modelo. O carregamento é rápido, portanto é muito provável (e quase sempre é) que as funções TimeLocal() e TimeCurrent() retornem os mesmos valores em todas as cópias.

Pergunta:

Que truques existem para conseguir que a PRNG rubrique números diferentes em cópias diferentes da EA? Em outras palavras, onde (com o mínimo esforço de programação) obter o elemento de aleatoriedade?

GetTickCount?
 
sergeev:
GetTickCount ?


pode funcionar, mas não com certeza...

Um milissegundo para um programa pode ser uma eternidade).

 
alsu:

pode funcionar, mas não com certeza...
opção 2 - usar variáveis globais para criar "semáforos" para inicializar os EAs em seqüência.
 
sergeev:
opção 2 - usar variáveis globais para criar "semáforos" para rubricar os especialistas em seqüência.
Isso está mais perto do ponto, obrigado.
 

Pergunta sobre a busca de filas da dll em mql.

função mysql_fetch_row da libmysql.dll retorna tipo MYSQL_ROW

Este tipo é definido como: typedef char** MYSQL_ROW

Como chegar a este conjunto de fios devolvidos?

 
As dimensões da matriz são conhecidas?
 
Zhunko:
As dimensões da matriz são conhecidas?
sim, o número de linhas é conhecido.

mas o comprimento de cada fila não é.

Há outra coisa nesse exemplo de link - obter um ponteiro de *comprimento.
Acontece que também é uma matriz... Mas como chegar a ele...

	comprimentos *longos não assinados;comprimentos =  mysql_fetch_lengths(resultado); for(i = 0; i < num_campos; i++) { printf("[%.*s] ", (int) comprimentos[i]
, linha[i] ? linha[i] : "NULL"); }

aqui está o que você recebe na MQL quando apenas passa o resultado de mysql_fetch_row para string

p0ƒu0ƒ;1;a

onde
p0ƒu0ƒ é o endereço (8 bytes) da cadeia
;1;a são seus dados utilizáveis


mas se você definir para int, então ao invés de p0ƒ o endereço é 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 o ponteiro para a corda não mudar enquanto o programa estiver em execução, você pode retornar o ponteiro para a corda sem copiá-lo para o buffer.

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

Então não há como fazer isso na MQL? Nem mesmo na MQL5?

Zhunko:
Se o ponteiro para a corda não mudar enquanto o programa estiver em execução, você pode retornar o ponteiro para a corda sem copiá-lo para o buffer.

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