Phát triển và kết nối các thư viện định dạng nhị phân
Ngoài các loại chương trình MQL chuyên biệt − Expert Advisors
(Cố vấn Chuyên gia), indicators
(chỉ báo), kịch bản và dịch vụ — nền tảng MetaTrader 5 cho phép bạn tạo và kết nối các mô-đun nhị phân độc lập với chức năng tùy ý, được biên dịch dưới dạng tệp ex5 hoặc DLL (Thư viện Liên kết Động) thường được sử dụng, tiêu chuẩn cho Windows. Đây có thể là các thuật toán phân tích, trực quan hóa đồ họa, tương tác mạng với các dịch vụ web, điều khiển các chương trình bên ngoài, hoặc chính hệ điều hành. Dù trong trường hợp nào, các thư viện này hoạt động trong terminal không phải như các chương trình MQL độc lập mà kết hợp với một chương trình thuộc bất kỳ loại nào trong 4 loại trên.
Ý tưởng tích hợp thư viện và chương trình chính (cha) là thư viện xuất một số hàm nhất định, tức là khai báo chúng có sẵn để sử dụng từ bên ngoài, và chương trình nhập nguyên mẫu của chúng. Chính mô tả nguyên mẫu — tập hợp tên, danh sách tham số và giá trị trả về — cho phép bạn gọi các hàm này trong mã mà không cần có triển khai của chúng.
Sau đó, trong quá trình khởi động chương trình MQL, liên kết động sớm được thực hiện. Điều này bao gồm việc tải thư viện sau chương trình chính và thiết lập sự tương ứng giữa các nguyên mẫu được nhập và các hàm được xuất có sẵn trong thư viện. Việc thiết lập các tương ứng một-một theo tên, danh sách tham số và kiểu trả về là điều kiện tiên quyết để tải thành công. Nếu không tìm thấy triển khai xuất tương ứng cho mô tả nhập của ít nhất một hàm, việc thực thi chương trình MQL sẽ bị hủy (nó sẽ kết thúc với lỗi ở giai đoạn khởi động).
Sơ đồ thành phần giao tiếp của chương trình MQL với thư viện
Bạn không thể chọn một thư viện được bao gồm khi khởi động chương trình MQL. Liên kết này được nhà phát triển đặt khi biên dịch chương trình chính cùng với các nhập thư viện. Tuy nhiên, người dùng có thể thay thế thủ công một tệp ex5/dll bằng một tệp khác giữa các lần khởi động chương trình (với điều kiện là các nguyên mẫu của các hàm xuất được triển khai phải khớp trong các thư viện). Điều này có thể được sử dụng, ví dụ, để chuyển đổi ngôn ngữ giao diện người dùng nếu các thư viện chứa tài nguyên chuỗi được gắn nhãn. Tuy nhiên, các thư viện thường được sử dụng nhất như một sản phẩm thương mại với một số bí quyết, mà tác giả không sẵn sàng phân phối dưới dạng tệp tiêu đề mở.
Đối với các lập trình viên chuyển sang MQL5 từ các môi trường khác và đã quen thuộc với công nghệ DLL, chúng ta muốn thêm một ghi chú về liên kết động muộn, một trong những lợi thế của DLL. Việc kết nối động hoàn toàn của một chương trình MQL (hoặc mô-đun DLL) với một chương trình MQL khác trong quá trình thực thi là không thể. Hành động tương tự duy nhất mà MQL5 cho phép bạn thực hiện "ngay lập tức" là liên kết một Cố vấn Chuyên gia và một chỉ báo thông qua iCustom
(iCustom) hoặc IndicatorCreate
(IndicatorCreate), nơi chỉ báo đóng vai trò như một thư viện liên kết động (tuy nhiên, việc tương tác lập trình với nó phải được thực hiện qua API chỉ báo, điều này có nghĩa là tăng chi phí cho CopyBuffer
, so với việc gọi hàm trực tiếp qua export/#import
).
Lưu ý rằng trong các trường hợp bình thường, khi một chương trình MQL được biên dịch từ nguồn mà không nhập các hàm bên ngoài, liên kết tĩnh được sử dụng, tức là mã nhị phân được tạo ra trực tiếp tham chiếu đến các hàm được gọi vì chúng đã được biết tại thời điểm biên dịch.
Nói một cách nghiêm ngặt, một thư viện cũng có thể phụ thuộc vào các thư viện khác, tức là nó có thể nhập một số hàm. Về lý thuyết, chuỗi các phụ thuộc như vậy có thể dài hơn: ví dụ, một chương trình MQL bao gồm thư viện A, thư viện A sử dụng thư viện B, và thư viện B, lần lượt, sử dụng thư viện C. Tuy nhiên, các chuỗi như vậy không được khuyến khích vì chúng làm phức tạp việc phân phối và cài đặt sản phẩm, cũng như khiến việc xác định nguyên nhân của các vấn đề khởi động tiềm ẩn trở nên khó khăn hơn. Do đó, các thư viện thường được kết nối trực tiếp với chương trình MQL cha.
Trong chương này, chúng ta sẽ mô tả quá trình tạo thư viện trong MQL5, xuất và nhập hàm (bao gồm các hạn chế đối với các kiểu dữ liệu được sử dụng trong chúng), cũng như kết nối các DLL bên ngoài (sẵn có). Việc phát triển DLL nằm ngoài phạm vi của cuốn sách này.