Nhập hàm (#import)
Các hàm được nhập từ các mô-đun MQL5 đã biên dịch (.ex5) và từ các mô-đun hệ điều hành (.dll). Tên mô-đun được chỉ định trong chỉ thị #import
. Để trình biên dịch có thể tạo đúng lời gọi hàm được nhập và tổ chức truyền tham số chính xác, cần mô tả đầy đủ các hàm. Mô tả hàm ngay lập tức theo sau chỉ thị #import "module name". Lệnh mới
#import` (có thể không có tham số) hoàn thành khối mô tả hàm được nhập.
#import "file_name"
func1 define;
func2 define;
...
funcN define;
#import
2
3
4
5
6
Các hàm được nhập có thể có bất kỳ tên nào. Các hàm có cùng tên nhưng từ các mô-đun khác nhau có thể được nhập cùng lúc. Các hàm được nhập có thể có tên trùng với tên của các hàm tích hợp. Hoạt động của phạm vi giải quyết xác định hàm nào sẽ được gọi.
Thứ tự tìm kiếm tệp được chỉ định sau từ khóa #import
được mô tả trong Gọi hàm được nhập.
Vì các hàm được nhập nằm ngoài mô-đun đã biên dịch, trình biên dịch không thể xác minh tính hợp lệ của các tham số được truyền. Do đó, để tránh lỗi thời gian chạy, cần mô tả chính xác thành phần và thứ tự các tham số được truyền cho các hàm được nhập. Các tham số truyền cho các hàm được nhập (từ cả EX5 và mô-đun DLL) có thể có giá trị mặc định.
Các tham số sau không thể được sử dụng trong các hàm được nhập:
Các lớp, mảng chuỗi hoặc các đối tượng phức tạp chứa chuỗi và/hoặc mảng động của bất kỳ kiểu nào không thể được truyền làm tham số cho các hàm nhập từ DLL.
Ví dụ:
#import "stdlib.ex5"
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
2
3
4
5
6
7
8
9
10
11
12
13
14
Để nhập hàm trong quá trình thực thi chương trình mql5, liên kết sớm được sử dụng. Điều này có nghĩa là thư viện được tải trong quá trình tải chương trình sử dụng chương trình ex5 của nó.
Không nên sử dụng tên đầy đủ của mô-đun có thể tải dưới dạng Drive:\Directory\FileName.Ext
. Thư viện MQL5 được tải từ thư mục terminal_dir\MQL5\Libraries
.
Nếu hàm được nhập có các phiên bản gọi khác nhau cho Windows 32-bit và 64-bit, cả hai phiên bản cần được nhập và phiên bản hàm đúng cần được gọi rõ ràng bằng biến _IsX64.
Ví dụ:
#import "user32.dll"
//--- Cho hệ thống 32-bit
int MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- Cho hệ thống 64-bit
int MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//| MessageBox_32_64_bit uses the proper version of MessageBoxW() |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
{
int res=-1;
//--- Nếu chúng ta đang sử dụng Windows 64-bit
if(`_IsX64`)
{
ulong hwnd=0;
res=MessageBoxW(hwnd,"64-bit MessageBoxW call example","MessageBoxW 64 bit",`MB_OK`|`MB_ICONINFORMATION`);
}
else // Chúng ta đang sử dụng Windows 32-bit
{
uint hwnd=0;
res=MessageBoxW(hwnd,"32-bit MessageBoxW call example","MessageBoxW 32 bit",`MB_OK`|`MB_ICONINFORMATION`);
}
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void `OnStart`()
{
//---
int ans=MessageBox_32_64_bit();
`PrintFormat`("MessageBox_32_64_bit returned %d",ans);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Nhập hàm từ thư viện .NET
Để làm việc với các hàm thư viện .NET, chỉ cần nhập DLL mà không cần định nghĩa các hàm cụ thể. MetaEditor tự động nhập tất cả các hàm có thể làm việc với:
- Cấu trúc đơn giản (POD, plain old data) — cấu trúc chỉ chứa các kiểu dữ liệu đơn giản.
- Các hàm tĩnh công khai có tham số, trong đó chỉ sử dụng các kiểu đơn giản và cấu trúc POD hoặc mảng của chúng.
Để gọi hàm từ thư viện, chỉ cần nhập nó:
#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void `OnStart`()
{
int x=41;
TestClass::Inc(x);
`Print`(x);
}
2
3
4
5
6
7
8
9
10
Mã C# của hàm Inc của TestClass như sau:
public class TestClass
{
public static void Inc(ref int x)
{
x++;
}
}
2
3
4
5
6
7
Kết quả thực thi, script trả về giá trị 42.
Xem thêm