Alle Fragen von einem PROFI an einen SUPER PROFI - 1. - Seite 20

 

Gegeben:

In der init()-Funktion des EA wird ein MQL-PSP-Generator initialisiert: MathSrand(...). Beim Starten des Terminals werden mehrere (der Übersichtlichkeit halber sagen wir drei) Kopien des Expert Advisors aus der Vorlage geladen. Das Laden erfolgt schnell, so dass es sehr wahrscheinlich ist (und fast immer der Fall ist), dass die Funktionen TimeLocal() und TimeCurrent() in allen Kopien die gleichen Werte zurückgeben.

Frage:

Welche Tricks gibt es, um den PRNG dazu zu bringen, verschiedene Zahlen in verschiedenen Kopien des EA zu initialisieren? Mit anderen Worten: Woher soll (mit minimalem Programmieraufwand) das Element des Zufalls kommen?

 
alsu:

Gegeben:

In der init()-Funktion des EA wird ein MQL-PSP-Generator initialisiert: MathSrand(...). Beim Starten des Terminals werden mehrere (der Übersichtlichkeit halber sagen wir drei) Kopien des Expert Advisors aus der Vorlage geladen. Das Laden erfolgt schnell, so dass es sehr wahrscheinlich ist (und fast immer der Fall ist), dass die Funktionen TimeLocal() und TimeCurrent() in allen Kopien die gleichen Werte zurückgeben.

Frage:

Welche Tricks gibt es, um den PRNG dazu zu bringen, verschiedene Zahlen in verschiedenen Kopien des EA zu initialisieren? Mit anderen Worten: Woher soll (mit minimalem Programmieraufwand) das Element des Zufalls kommen?

GetTickCount?
 
sergeev:
GetTickCount ?


könnte funktionieren, ist aber nicht sicher...

Eine Millisekunde kann für ein Programm eine Ewigkeit sein.)

 
alsu:

könnte funktionieren, ist aber nicht sicher...
Option 2 - Verwendung globaler Variablen zur Erstellung von "Semaphoren", um EAs nacheinander zu initialisieren.
 
sergeev:
Option 2 - Verwendung globaler Variablen zur Erstellung von "Semaphoren", um die Experten nacheinander zu initialisieren.
Das kommt der Sache schon näher, danke.
 

Frage zum Abrufen von Zeilen aus dll in mql.

Funktion mysql_fetch_row aus libmysql.dll gibt Typ MYSQL_ROW zurück

Dieser Typ ist definiert als: typedef char** MYSQL_ROW

Wie erreiche ich dieses zurückgegebene String-Array?

 
 
Zhunko:
Sind die Abmessungen des Feldes bekannt?
ja, die Anzahl der Zeilen ist bekannt.

aber die Länge der einzelnen Zeilen ist es nicht.

In diesem Link-Beispiel gibt es noch etwas anderes - einen *Längen-Zeiger zu erhalten.
Es stellt sich heraus, dass es auch ein Array ist... Aber wie kommt man dorthin...

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

Hier ist, was Sie in MQL erhalten, wenn Sie einfach das Ergebnis von mysql_fetch_row an string übergeben

p0ƒu0ƒ;1;a

wobei
p0ƒu0ƒ ist die Adresse (8 Bytes) der Zeichenkette
;1;a sind seine verwertbaren Daten


aber wenn Sie es auf int einstellen, dann lautet die Adresse statt p0ƒ 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);
 }

Wenn sich der Zeiger auf die Zeichenkette nicht ändert, während das Programm läuft, können Sie den Zeiger auf die Zeichenkette zurückgeben, ohne ihn in den Puffer zu kopieren.

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

Es gibt also keine Möglichkeit, dies in MQL zu tun, nicht einmal in MQL5?

Zhunko:
Wenn sich der Zeiger auf die Zeichenkette nicht ändert, während das Programm läuft, können Sie den Zeiger auf die Zeichenkette zurückgeben, ohne ihn in den Puffer zu kopieren.

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