mt4 (MetaTrader4)使い倒シストレ

メタトレーダー、自作インジケータ、自作EAで完全自動売買。使えるものは何でも使え。
インジケーター、EA(自動売買システム)製作のご依頼はこちらへ
Googolyen FX Factory
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


にほんブログ村 為替ブログ FX システムトレード派へ
--/--/--(--) --:--:-- | スポンサー広告 | Trackback(-) | Comment(-)
Imported functions call (インポート関数呼び出し)
MQL4プログラムが実行されている間に関数をインポートする時、いわゆる遅延結合が行われる。
つまりインポート関数が呼び出されるまで該当するモジュール (ex4かdll)は読み込まれない。
MQL4とDLLライブラリはモジュールスレッドが呼ばれて実行される。

Drive:\Directory\FileName.Extの様に読み込まれたモジュール名は完全に制限されるべきではない。
MQL4ライブラリはterminal_dir\experts\librariesフォルダから読み込まれる。
もしライブラリがなければ、terminal_dir\expertsフォルダから読み込もうと試みる。

システムライブラリ達 (DLL達)はOSのルールによって読み込まれる。
例えば、他のエキスパート、同時に動作した他のクライアント端末でもう既に読み込まれていた場合、読み込まれているライブラリを参照する。
その他の場合、以下のフォルダから検索する。
  1. terminal_dir\experts\librariesディレクトリ
  2. 動作しているクライアント端末のterminal_dirディレクトリ
  3. 現在のディレクトリ
  4. windows_dir\SYSTEM32システムディレクトリ (Windows98の場合はwindows_dir\SYSTEM)
  5. インストールされたOSのwindows_dirディレクトリ
  6. PATH環境システム変数で設定されたディレクトリ
もしDLLの動作中に他のDLLが使われ、他のDLLが使えなかった場合、動作中のDLLも読み込まれない。

システムライブラリと違ってカスタムライブラリ (MQL4)は全てのモジュールを別々に読み込み、他のモジュールで読み込まれたライブラリであろうとなかろうと、独立して読み込む。
例えば、caller.ex4モジュールがlib1.ex4とlib2.ex4ライブラリから関数を呼び出し、 lib1.ex4ライブラリはlib2.ex4ライブラリから関数を呼び出したとする。
この場合、同じcaller.ex4モジュールから呼び出したにも関わらず、 lib1.ex4ライブラリ1回と、lib2.ex4ライブラリが2回読まれる。
DLLからmql4プログラムへとインポートされた関数は、Windows API関数に応じたリンケージ規約を守らなければならない。
このような規約に基づくためには、CやC++で書かれたソースプログラム内でマイクロソフト社のコンパイラ特有の__stdcallキーワードを利用する。
上記のリンケージ規約は以下のように決められている。

  • 関数の呼び出し (この場合mql4プログラム)は、適切な方法でスタックにパラメータを設定する為に、 呼ばれた (DLLからインポートされた)関数のプロトタイプを宣言しなければならない。
  • 関数の呼び出し (この場合mql4プログラム)は逆の順序 (右から左)にスタックへと変数を設定する。順序とは関数に渡された変数を読み込む順序である。
  • 明確な関連付けによって渡された場合 (この場合、1行)を除き、変数は変数値として渡さなければならない。
  • 渡された変数を読む時、インポート関数はスタックを解放しなければならない。
インポート関数プロトタイプの説明にあるように、インポート関数へは明確に全ての変数を渡さなければならないので、デフォルト引数を用いることはできない。

もしインポート関数の呼び込みが失敗した場合 (エキスパートがDLLインポートを許可していない設定や何かしらの理由によって該当するライブラリが読み込めなかった)、エキスパートは動作を中断し、"Expert stopped"ログに該当するメッセージを吐き出す。
更にエキスパートは再初期化されるまで動作しない。
エキスパートは再コンパイルした時、エキスパートプロパティテーブルを開いた時、OKボタンを押した時に再初期化される。

にほんブログ村 為替ブログ FX システムトレード派へ
Trackback
この記事のトラックバックURL
≪この記事へのトラックバック≫
Designed by aykm.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。