Gọi các hàm nhập khẩu
Để nhập khẩu các hàm trong quá trình thực thi một chương trình MQL5, terminal client sử dụng liên kết sớm. Điều này có nghĩa là nếu một chương trình có lời gọi hàm nhập khẩu, mô-đun tương ứng (ex5 hoặc dll) sẽ được tải trong quá trình tải chương trình. Thư viện MQL5 và DLL được thực thi trong luồng của mô-đun gọi.
Không nên sử dụng tên đầy đủ của mô-đun cần tải như Drive:\Directory\FileName.Ext
. Các thư viện MQL5 được tải từ thư mục terminal_dir\MQL5\Libraries
. Nếu thư viện không được tìm thấy, terminal client sẽ cố gắng tải nó từ thư mục terminal_dir\experts
.
Các thư viện hệ thống (DLL) được tải theo quy tắc của hệ điều hành. Nếu thư viện đã được tải (ví dụ, bởi một Expert Advisor khác, thậm chí từ một terminal client khác chạy song song), thì nó sẽ sử dụng các yêu cầu đến thư viện đã tải. Nếu không, nó sẽ thực hiện tìm kiếm theo thứ tự sau:
- Thư mục mà từ đó mô-đun nhập khẩu dll được khởi động. Mô-đun ở đây là Expert Advisor, script, chỉ báo hoặc thư viện EX5;
- Thư mục
terminal_data_directory\MQL5\Libraries
(TERMINAL_DATA_PATH\MQL5\Libraries); - Thư mục mà từ đó terminal client MetaTrader 5 được khởi động;
- Thư mục hệ thống;
- Thư mục Windows;
- Thư mục hiện tại;
- Các thư mục được liệt kê trong biến hệ thống PATH.
Nếu thư viện DLL sử dụng một DLL khác trong hoạt động của nó, DLL đầu tiên không thể được tải nếu không có DLL thứ hai.
Trước khi một Expert Advisor (script, chỉ báo) được tải, một danh sách chung của tất cả các mô-đun thư viện EX5 sẽ được hình thành. Danh sách này sẽ được sử dụng cả từ Expert Advisor (script, chỉ báo) đã tải và từ các thư viện trong danh sách này. Do đó, chỉ cần tải một lần các mô-đun thư viện EX5 được sử dụng nhiều lần. Các thư viện sử dụng biến định sẵn của Expert Advisor (script, chỉ báo) mà chúng được gọi bởi.
Thư viện EX5 nhập khẩu được tìm kiếm theo thứ tự sau:
- Thư mục mà đường dẫn được đặt tương đối với thư mục của Expert Advisor (script, chỉ báo) nhập khẩu EX5;
- Thư mục
terminal_directory\MQL5\Libraries
; - Thư mục
MQL5\Libraries
trong thư mục chung của tất cả các terminal client MetaTrader 5 (Common\MQL5\Libraries
).
Các hàm nhập khẩu DLL vào một chương trình MQL5 phải đảm bảo thỏa thuận gọi Windows API. Để đảm bảo thỏa thuận này, trong mã nguồn của chương trình viết bằng C hoặc C++, sử dụng từ khóa __stdcall
, đặc trưng cho các trình biên dịch Microsoft(r). Thỏa thuận này được đặc trưng bởi:
- Người gọi (trong trường hợp này là chương trình MQL5) phải "nhìn thấy" nguyên mẫu của hàm được gọi (nhập khẩu từ DLL), để kết hợp chính xác các tham số vào ngăn xếp;
- Người gọi (trong trường hợp này là chương trình MQL5) đặt các tham số vào ngăn xếp theo thứ tự ngược, từ phải sang trái - theo thứ tự này hàm nhập khẩu đọc các tham số được truyền cho nó;
- Các tham số được truyền theo giá trị, trừ những tham số được truyền rõ ràng theo tham chiếu (trong trường hợp này là chuỗi);
- Hàm nhập khẩu tự dọn dẹp ngăn xếp bằng cách đọc các tham số được truyền cho nó.
Khi mô tả nguyên mẫu của một hàm nhập khẩu, có thể sử dụng các tham số mặc định.
Nếu thư viện tương ứng không thể tải, hoặc có lệnh cấm sử dụng DLL, hoặc hàm nhập khẩu không được tìm thấy - Expert Advisor sẽ dừng hoạt động với thông báo thích hợp "Expert Advisor stopped" trong Nhật ký (tệp log). Trong trường hợp này, Expert Advisor sẽ không chạy cho đến khi được khởi tạo lại. Expert Advisor có thể được khởi tạo lại sau khi được biên dịch lại hoặc sau khi bảng thuộc tính của nó được mở và nhấn OK.
Truyền tham số
Tất cả các tham số của loại đơn giản được truyền theo giá trị trừ khi được chỉ định rõ ràng rằng chúng được truyền theo tham chiếu. Khi một chuỗi được truyền, địa chỉ của bộ đệm của chuỗi được sao chép sẽ được truyền; nếu chuỗi được truyền theo tham chiếu, địa chỉ của bộ đệm của chuỗi này mà không sao chép sẽ được truyền cho hàm nhập khẩu từ DLL.
Cấu trúc chứa mảng động, chuỗi, lớp, các cấu trúc phức tạp khác, cũng như mảng tĩnh hoặc mảng động của các đối tượng liệt kê, không thể được truyền làm tham số cho hàm nhập khẩu.
Khi truyền một mảng đến DLL, địa chỉ của đầu bộ đệm dữ liệu luôn được truyền (bất kể cờ AS_SERIES). Hàm bên trong DLL không biết gì về cờ AS_SERIES
, mảng được truyền là mảng tĩnh có độ dài không xác định; cần sử dụng một tham số bổ sung để chỉ định kích thước mảng.