関数は、コンパイル済みの MQL4 モジュール (*.ex4 ファイル) や、オペレーティング システムのモジュール (*.dll ファイル) からインポートされます。モジュール名は、#import 指示で指定されます。インポートされた関数の呼び出して、適切な方法でパラメータを渡すことが出来るように、コンパイラには関数の完全な記述が必要です。関数の記述は、#import [モジュール名] の直後に続けます。新しい #improt コマンド(パラメータなしで可)によって、インポート関数の記述ブロックが完了します。
1 2 3 4 5 6 | #import "file_name" func1 define; func2 define; ... funcN define; #import |
インポートされた関数は、重複しない名前が必要です。同じ名前を持つ関数は、同時に別のモジュールからインポートすることはできません。インポート関数の名前は、組み込み関数のものと同じにしない方がよいです。
インポート関数がコンパイル済みモジュールだと、コンパイラは渡されたパラメータの正当性をチェックできません。これは、実行時エラーを回避する為で、型に遵守した宣言や正確なパラメーターの指示が必要です。インポート関数(EX4、DLLモジュールの両方)に渡されるパラメータを初期値で設定することはできません。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #import "user32.dll" int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType); #import "stdlib.ex4" string ErrorDescription(int error_code); int RGB(int red_value, int green_value, int blue_value); bool CompareDoubles(double number1, double number2); string DoubleToStrMorePrecision(double number, int precision); string IntegerToHexString(int integer_number); #import "ExpertSample.dll" int GetIntValue(int); double GetDoubleValue(double); string GetStringValue(string); double GetArrayItemValue(double arr[], int, int); bool SetArrayItemValue(double& arr[], int,int, double); double GetRatesItemValue(double rates[][6], int, int, int); int SortStringArray(string& arr[], int); int ProcessStringArray(string& arr[], int); #import |
MQL4 プログラムの実行中に関数をインポートするために、いわゆる、遅延結合が使用されます。これは、インポート関数が呼び出されるまでは、対応するモジュール(ex4、dll)が読み込まれないことを意味します。
読み込まれたモジュールで Drive:\Directory\FileName.Ext にある完全修飾名を使用することは推奨できません。MQL4 ライブラリは、terminal_dir\experts\libraries フォルダから読み込まれます。もし、該当するライブラリが見つからない場合は、terminal_dir\experts フォルダからライブラリの読み込みを試みます。