関数は、コンパイルされたMQL4モジュール(.mq4ファイル)とOSのモジュール(.dll)
からインポート出来ます。
インポートするモジュール名は、#importで指定します。
コンパイラがインポートした関数を呼び出し正しく使用出来るようにする為に、
適切なパラメータと関数の完全な記述が必要です。
関数は#import "モジュール名"の直後に記述します。
新しい#importコマンド(パラメータ無しで可能)はインポートされた関数の記述のブロック完了を意味します。
書式:
#import "ファイル名"
関数名(引数) ;
関数名(引数) ;
#import
インポートされた関数は、任意の名前を持つ事が出来ます。
異なるモジュールからでは無く、同じ名前を持つ関数を同時にインポートする事が出来ます。
インポートされた関数は、組み込み関数の名前と一致する名前を持つ事が出来ます。
スコープ定義演算子を使って呼びたい関数を指定します。
#importの後に指定したファイルを検索する順番は
"インポート関数の呼び出し"に記載しています。
インポートした関数は、コンパイルされたモジュールなので、コンパイラは渡された引数の妥当性を検証する事は出来ません。
その為、ランタイムエラーを回避する為に、引数の構成と順序を正確に記述する必要があります。
インポート関数(.ex4と.dllの両方共)に渡される引数はデフォルト値を持つ事が出来ます。
インポート関数の引数へ渡せないもの
・ポインタ(*)
・動的配列
DLLからのインポート関数は、
クラス・文字列配列・複雑なオブジェクト(文字列・動的配列)を引数として渡す事は出来ません。
サンプルソース:
#import "user32.dll"
int MessageBoxW(uint hWnd,string lpText,string lpCaption,uint 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);
#import
MQL4プログラムのインポート関数の実行は事前事前バインディングが使用されます。
これはex4プログラムのロード時にライブラリをロードする事を意味します。
ロードモジュールを絶対パス("G:\Program Files\FXCM MetaTrader 4\MQL4\Libraries"等)付きで記述する事はお勧めしません。
MQL4ライブラリは"ターミナルディレクトリ\MQL4\Libraries"フォルダからロードされます。