Xử lý và bộ đếm của các chủ sở hữu chỉ báo
Việc làm việc lập trình với các chỉ báo yêu cầu thao tác với các handle. Có thể so sánh điều này với các bộ mô tả tệp (xem phần Mở và đóng tệp): ở đó chúng ta đã sử dụng hàm File Open
để thông báo cho hệ thống về tên tệp và chế độ mở, sau đó bộ mô tả đóng vai trò như một "vé thông hành" cho tất cả các hàm tệp khác.
Hệ thống bộ mô tả chỉ báo phục vụ nhiều mục đích.
Nó cho phép thông báo trước cho terminal về việc khởi chạy chỉ báo nào và tính toán chuỗi thời gian nào. Vì cần một khoảng thời gian để tải dữ liệu lịch sử ban đầu và tính toán chỉ báo (ít nhất trong lần yêu cầu đầu tiên), cùng với việc phân bổ tài nguyên (bộ nhớ, đồ họa), thời điểm chỉ báo được tạo và thời điểm nó sẵn sàng là khác nhau. Bộ mô tả là cầu nối giữa chúng. Đây là một dạng liên kết đến đối tượng nội bộ của terminal lưu trữ tập hợp các thuộc tính mà chúng ta đặt khi tạo chỉ báo và trạng thái hiện tại của nó.
Tất nhiên, để làm việc với các bộ mô tả, terminal cần duy trì một bảng nhất định của tất cả các chỉ báo được yêu cầu và thuộc tính của chúng. Tuy nhiên, terminal không cung cấp thông tin về số lượng thực trong bảng chung: thay vào đó, mỗi chương trình tạo danh sách riêng của các chỉ báo được yêu cầu từ nó. Các mục trong danh sách này tham chiếu đến các phần tử của bảng chung, và bộ mô tả chỉ là một số trong danh sách.
Do đó, có thể có các chỉ báo hoàn toàn khác nhau đằng sau cùng một bộ mô tả trong các chương trình khác nhau. Vì vậy, việc chuyển giá trị của các bộ mô tả giữa các chương trình là vô nghĩa.
Các bộ mô tả là một phần của hệ thống quản lý tài nguyên terminal vì chúng loại bỏ việc trùng lặp các phiên bản chỉ báo có cùng đặc điểm, khi có thể. Nói cách khác, tất cả các chỉ báo tích hợp và tùy chỉnh được tạo lập trình, thủ công hoặc từ các mẫu tpl đều được lưu vào bộ nhớ đệm.
Trước khi tạo một phiên bản chỉ báo mới, terminal kiểm tra xem có chỉ báo giống hệt nào trong số những chỉ báo trong bộ nhớ đệm hay không. Các tiêu chí sau được áp dụng khi kiểm tra bản sao:
- Khớp ký hiệu và khoảng thời gian
- Khớp các tham số
Đối với các chỉ báo tùy chỉnh, các yếu tố sau cũng phải khớp:
- Đường dẫn trên đĩa (dưới dạng chuỗi, không chuẩn hóa thành dạng tuyệt đối)
- Biểu đồ mà chỉ báo đang chạy (khi tạo chỉ báo từ một chương trình MQL, chỉ báo được tạo kế thừa biểu đồ từ chương trình tạo ra nó)
Các chỉ báo tích hợp được lưu vào bộ nhớ đệm theo ký hiệu và do đó các phiên bản của chúng có thể được phân bổ để sử dụng riêng trên các biểu đồ khác nhau (với cùng ký hiệu/khung thời gian).
Lưu ý rằng bạn không thể tạo hai chỉ báo giống hệt nhau trên cùng một biểu đồ theo cách thủ công. Các phiên bản chương trình khác nhau có thể yêu cầu cùng một chỉ báo, trong trường hợp đó chỉ một bản sao của nó sẽ được tạo và cung cấp cho cả hai chương trình.
Đối với mỗi tổ hợp điều kiện duy nhất, terminal giữ một bộ đếm: sau yêu cầu đầu tiên để tạo một chỉ báo cụ thể, bộ đếm của nó bằng 1, và ở các yêu cầu tiếp theo, nó tăng thêm 1 (bản sao của chỉ báo không được tạo). Khi một chỉ báo được giải phóng, bộ đếm của nó giảm đi 1. Chỉ báo chỉ bị gỡ bỏ khi bộ đếm được đặt lại, tức là khi tất cả các chủ sở hữu của nó từ chối sử dụng nó một cách rõ ràng.
Cần lưu ý rằng nhiều lần gọi hàm xây dựng chỉ báo với cùng tham số (bao gồm ký hiệu/khung thời gian) trong cùng một chương trình MQL không dẫn đến việc tăng nhiều lần bộ đếm tham chiếu — bộ đếm sẽ chỉ tăng một lần. Do đó, đối với mỗi giá trị của handle, một lần gọi hàm giải phóng (IndicatorRelease
) là đủ. Tất cả các cuộc gọi tiếp theo là thừa và trả về lỗi vì không có gì để giải phóng.
Ngoài việc tạo chỉ báo bằng iCustom
và IndicatorCreate
trong MQL5, có thể lấy handle của một chỉ báo bên thứ ba (đã tồn tại). Điều này có thể được thực hiện bằng cách sử dụng hàm ChartIndicatorGet
mà chúng ta sẽ nghiên cứu trong chương về biểu đồ. Điều quan trọng cần lưu ý ở đây là việc lấy handle theo cách này cũng sẽ tăng bộ đếm tham chiếu của nó và ngăn việc gỡ bỏ trừ khi handle sau đó được giải phóng.
Nếu chương trình tạo ra các chỉ báo phụ thuộc, handle của chúng sẽ tự động được giải phóng (bộ đếm giảm đi 1) khi chương trình này được gỡ bỏ, ngay cả khi hàm IndicatorRelease
không được gọi.