PROFIからSUPER PROFIへの質問-1. - ページ 20

 

与えられた。

EAのinit()関数では、MQL PSPジェネレータが初期化されます:MathSrand(...)です。ターミナルが起動すると、テンプレートから Expert Advisor のコピーが複数(わかりやすいように 3 つとします)読み込まれます。読み込みが速いので、TimeLocal() とTimeCurrent()関数が すべてのコピーで同じ値を返す可能性が非常に高い(ほとんどそうである)。

質問です。

EAのコピーごとに異なる数値をPRNGに初期化させるには、どのような仕掛けがあるのでしょうか?つまり、ランダム性の要素をどこで(最小限のプログラミングで)得るか?

 
alsu:

与えられた。

EAのinit()関数では、MQL PSPジェネレータが初期化されます:MathSrand(...)です。ターミナルが起動すると、テンプレートから Expert Advisor のコピーが複数(わかりやすいように 3 つとします)読み込まれます。読み込みが速いので、TimeLocal()とTimeCurrent()関数がすべてのコピーで同じ値を返す可能性が非常に高い(ほとんどそうである)。

質問です。

EAのコピーごとに異なる数値をPRNGに初期化させるには、どのような仕掛けがあるのでしょうか?つまり、ランダム性の要素をどこで(最小限のプログラミングで)得るか?

GetTickCount?
 
sergeev:
GetTickCount ?


が効くかもしれませんが、確実ではありません...。

プログラムにとっては1ミリ秒が永遠になることもある)。

 
alsu:

が効くかもしれませんが、確実ではありません...。
オプション 2 -グローバル変数を使って「セマフォ」を作成し、EA を順番に初期化する。
 
sergeev:
オプション 2 - グローバル変数を使って「セマフォ」を作成し、エキスパートを順番に初期化する。
その方が近いですね、ありがとうございます。
 

mqlでdllから行をフェッチすることについての質問です。

libmysql.dll の関数mysql_fetch_rowMYSQL_ROW 型を返します。

この型は次のように定義される: typedef char** MYSQL_ROW

この返された文字列の配列にアクセスするにはどうすればよいのでしょうか?

 
配列の寸法は 既知ですか?
 
Zhunko:
配列の寸法は既知ですか?
はい、行数はわかっています。

が、各行の長さはそうではない。

そのリンクの 例にはもう一つ、*lengthsポインタを取得することがあります。
それも配列であることが判明し...。でも、どうやって行くのか...。

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

MQLでmysql_fetch_rowの 結果を文字列に渡すと、以下のようになります。

p0ƒu0ƒ;1;a

どこ
p0ƒu0ƒ は文字列のアドレス(8バイト)です。
1;aは使用可能なデータです。


が、intにすると、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);
 }

プログラム実行中に文字列へのポインタが変化しない場合は、バッファにコピーすることなく文字列へのポインタを返すことができます。

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

では、MQLではどうしようもないのですか? MQL5でもだめなのですか?

Zhunko:
プログラム実行中に文字列へのポインタが変化しない場合は、バッファにコピーすることなく文字列へのポインタを返すことができます。

単純に
return aszString[номер ячейки]