Luồng
Dưới dạng đơn giản hóa, một chương trình có thể được biểu diễn như một chuỗi các câu lệnh mà nhà phát triển đã tạo ra cho máy tính. Bộ phận thực thi chính của các câu lệnh trong máy tính là bộ xử lý trung tâm. Các máy tính hiện đại thường được trang bị bộ xử lý với nhiều lõi, điều này tương đương với việc có nhiều bộ xử lý. Tuy nhiên, số lượng chương trình mà người dùng có thể muốn chạy song song là gần như không giới hạn. Do đó, số lượng chương trình luôn nhiều lần vượt quá số lõi/bộ xử lý có sẵn. Vì lý do này, mỗi lõi thực sự chia thời gian làm việc của nó giữa nhiều chương trình khác nhau: nó sẽ phân bổ 1 mili giây để thực thi các câu lệnh của một chương trình, sau đó 1 mili giây cho các câu lệnh của chương trình khác, rồi đến chương trình thứ ba, và cứ tiếp tục như vậy, theo vòng tròn. Vì việc chuyển đổi diễn ra rất nhanh, người dùng không nhận thấy điều này, vì có vẻ như tất cả các chương trình được thực thi song song và đồng thời.
Để bộ xử lý có thể tạm dừng việc thực thi các câu lệnh của một chương trình và sau đó tiếp tục công việc từ vị trí trước đó (sau khi nó lặng lẽ chuyển sang các câu lệnh của các chương trình "song song" khác), nó phải có khả năng lưu và khôi phục trạng thái trung gian của mỗi chương trình: câu lệnh hiện tại, các biến, có thể là các tệp đang mở, kết nối mạng, v.v. Toàn bộ tập hợp tài nguyên và dữ liệu mà một chương trình cần để chạy bình thường, cùng với vị trí hiện tại của nó trong chuỗi các câu lệnh, được gọi là ngữ cảnh thực thi của chương trình. Hệ điều hành, thực tế, được thiết kế để tạo ra các ngữ cảnh như vậy cho mỗi chương trình theo yêu cầu của người dùng (hoặc các chương trình khác). Mỗi ngữ cảnh hoạt động như vậy được gọi là một luồng. Nhiều chương trình yêu cầu nhiều luồng cho chính chúng vì chức năng của chúng liên quan đến việc duy trì nhiều hoạt động song song. MetaTrader 5 cũng yêu cầu nhiều luồng để tải báo giá cho nhiều ký hiệu, vẽ biểu đồ và phản hồi các hành động của người dùng. Hơn nữa, các luồng riêng biệt cũng được phân bổ cho các chương trình MQL.
Môi trường thực thi chương trình MQL phân bổ không quá một luồng cho mỗi chương trình. Expert Advisors, scripts và services mỗi loại nhận được chính xác một luồng. Đối với các chỉ báo, một luồng được phân bổ cho tất cả các chỉ báo hoạt động trên một công cụ tài chính. Hơn nữa, cùng một luồng chịu trách nhiệm hiển thị các biểu đồ của ký hiệu tương ứng, vì vậy không nên chiếm dụng nó bằng các tính toán nặng. Nếu không, giao diện người dùng sẽ trở nên không phản hồi: các hành động của người dùng sẽ được xử lý với độ trễ, hoặc cửa sổ thậm chí sẽ không phản hồi. Các luồng của tất cả các loại chương trình MQL khác không bị ràng buộc với giao diện và do đó có thể tải bộ xử lý với bất kỳ nhiệm vụ phức tạp nào.
Một trong những thuộc tính quan trọng của luồng xuất phát từ định nghĩa và mục đích của nó: Nó chỉ hỗ trợ thực thi tuần tự các câu lệnh được chỉ định từng cái một. Chỉ một câu lệnh được thực thi trong một luồng tại một thời điểm. Nếu một vòng lặp vô hạn được viết trong chương trình, luồng sẽ bị kẹt trong câu lệnh này và không bao giờ đến được các câu lệnh bên dưới nó. Các tính toán dài cũng có thể tạo ra hiệu ứng của một vòng lặp vô tận: chúng sẽ tải bộ xử lý và ngăn các hành động khác được thực hiện, mà người dùng có thể mong đợi kết quả từ đó. Đó là lý do tại sao các tính toán hiệu quả trong các chỉ báo rất quan trọng để giao diện đồ họa hoạt động mượt mà.
Tuy nhiên, trong các loại chương trình MQL khác, cần chú ý đến cách sắp xếp luồng. Trong các phần tiếp theo, chúng ta sẽ làm quen với các hàm xử lý sự kiện đặc biệt, là các điểm vào của các chương trình MQL. Một mô hình đơn luồng có nghĩa là trong khi xử lý một sự kiện, chương trình không bị ảnh hưởng bởi các sự kiện khác có thể xảy ra cùng lúc. Do đó, terminal tổ chức một hàng đợi sự kiện cho mỗi chương trình. Chúng ta sẽ đề cập chi tiết hơn về điểm này trong phần tiếp theo.
Để trải nghiệm các hiệu ứng của đơn luồng trong thực tế, chúng ta sẽ xem xét một ví dụ đơn giản trong phần Giới hạn và lợi ích của chỉ báo (IndBarIndex.mq5
). Chúng ta đã chọn chỉ báo cho mục đích này vì chúng không chỉ chia sẻ một luồng cho mỗi ký hiệu mà còn hiển thị kết quả trực tiếp trên biểu đồ, điều này làm cho vấn đề tiềm ẩn trở nên rõ ràng nhất.