Các khía cạnh kỹ thuật của việc tổ chức và lưu trữ chuỗi thời gian
Trước khi tiến hành các vấn đề thực tế về việc sử dụng các hàm API MQL5 được thiết kế để làm việc với chuỗi thời gian, chúng ta nên xem xét các cơ sở kỹ thuật của việc nhận dữ liệu báo giá từ máy chủ và lưu trữ chúng trong MetaTrader 5.
Trước khi dữ liệu giá có sẵn trong terminal để hiển thị trên biểu đồ và truyền đến các chương trình MQL, chúng được tải xuống từ máy chủ và chuẩn bị theo một cách đặc biệt. Cơ chế truy cập máy chủ để lấy dữ liệu không phụ thuộc vào cách yêu cầu được khởi tạo — bởi người dùng khi điều hướng qua biểu đồ hay bằng lập trình thông qua ngôn ngữ MQL5.
Dữ liệu đến từ máy chủ ở định dạng nén: đây là các khối thanh phút được đóng gói tiết kiệm, tuy nhiên, chúng không phải là các thanh M1 thông thường.
Dữ liệu nhận được từ máy chủ được tự động giải nén và lưu ở định dạng trung gian đặc biệt HCC. Dữ liệu cho mỗi ký hiệu được ghi vào một thư mục riêng {terminal_dir}/bases/{server_name}/history/{symbol_name}
. Ví dụ, dữ liệu về EURUSD từ máy chủ giao dịch MetaQuotes-Demo có thể nằm trong thư mục C:/Program Files/MetaTrader 5/bases/MetaQuotes-Demo/history/EURUSD/
.
Dữ liệu được ghi vào các tệp có phần mở rộng *.hcc: mỗi tệp lưu trữ dữ liệu của các thanh phút cho một năm. Ví dụ, tệp 2021.hcc trong thư mục EURUSD chứa các thanh phút EURUSD cho năm 2021. Các tệp này được sử dụng để chuẩn bị dữ liệu giá cho tất cả các khung thời gian và không được thiết kế để truy cập trực tiếp.
Các tệp dịch vụ ở định dạng HCC đóng vai trò là nguồn dữ liệu để vẽ dữ liệu giá cho các khung thời gian cụ thể. Chúng chỉ được tạo ra khi có yêu cầu từ biểu đồ hoặc chương trình MQL và được lưu để sử dụng tiếp theo trong các tệp có phần mở rộng *.hc.
Đối với mỗi khung thời gian, dữ liệu được chuẩn bị độc lập với các khung thời gian khác. Quy tắc tạo và tính sẵn có của dữ liệu là như nhau cho tất cả các khung thời gian, bao gồm cả M1. Điều đó có nghĩa là, mặc dù đơn vị lưu trữ dữ liệu trong định dạng HCC là thanh phút, sự hiện diện của chúng không có nghĩa là sự hiện diện và tính sẵn có của dữ liệu khung thời gian M1 ở cùng khối lượng trong định dạng HC.
Để tiết kiệm tài nguyên, dữ liệu khung thời gian chỉ được tải và lưu trữ trong RAM khi cần thiết: nếu không có truy cập dữ liệu trong thời gian dài, chúng sẽ được giải phóng khỏi RAM (nhưng vẫn còn trong tệp). Điều này có thể dẫn đến tăng thời gian thực thi của yêu cầu chuỗi thời gian tiếp theo nếu nó chưa được sử dụng trong thời gian dài. Tất cả các chuỗi thời gian phổ biến, đặc biệt là những chuỗi mà biểu đồ đang mở, có sẵn gần như ngay lập tức nếu máy tính có đủ tài nguyên.
Việc nhận dữ liệu mới từ máy chủ gây ra việc cập nhật tự động dữ liệu giá đã sử dụng trong định dạng HC cho tất cả các khung thời gian và tính toán lại tất cả các chỉ báo phụ thuộc.
Khi một chương trình MQL truy cập dữ liệu cho một ký hiệu và khung thời gian cụ thể, có khả năng chuỗi thời gian cần thiết chưa được tạo hoặc đồng bộ hóa với máy chủ giao dịch (ví dụ, giá cập nhật đã xuất hiện trên đó). Trong trường hợp này, bạn nên thực hiện việc chờ sẵn sàng dữ liệu dưới một hình thức nào đó.
Đối với scripts, giải pháp duy nhất là sử dụng vòng lặp, vì chúng không có lựa chọn nào khác do thiếu xử lý sự kiện. Đối với chỉ báo, các thuật toán như vậy, cũng như bất kỳ chu kỳ chờ nào khác, đều không được khuyến nghị tuyệt đối, vì chúng dẫn đến việc tạm dừng tính toán của tất cả các chỉ báo và xử lý dữ liệu giá khác cho ký hiệu đã cho.
Đối với Expert Advisors và chỉ báo, tốt hơn là sử dụng mô hình xử lý sự kiện. Nếu khi xử lý một sự kiện OnTick
hoặc OnCalculate
, bạn không thể lấy được tất cả dữ liệu cần thiết của chuỗi thời gian yêu cầu, thì bạn nên thoát khỏi trình xử lý sự kiện và chờ chúng xuất hiện trong các lần gọi tiếp theo của trình xử lý.
Số lượng thanh tối đa
Cần lưu ý rằng số lượng thanh tối đa sẽ được tính toán cho mỗi cặp ký hiệu/khung thời gian được yêu cầu không vượt quá giá trị của tham số
Max. bars in chart
trong hộp thoạiOptions
của terminal. Do đó, tham số này áp đặt hạn chế không chỉ trên các biểu đồ của bất kỳ khung thời gian nào mà còn trên tất cả các chương trình MQL.Hạn chế này chủ yếu nhằm mục đích tiết kiệm tài nguyên. Khi đặt giá trị lớn cho tham số này, cần nhớ rằng nếu có lịch sử dữ liệu giá đủ sâu cho các khung thời gian thấp hơn, mức tiêu thụ bộ nhớ để lưu trữ chuỗi thời gian và bộ đệm chỉ báo có thể lên đến hàng trăm megabyte và chiếm toàn bộ RAM.
Việc thay đổi giới hạn thanh chỉ có hiệu lực sau khi khởi động lại terminal khách hàng. Nó ảnh hưởng đến lượng dữ liệu được yêu cầu từ máy chủ để xây dựng số lượng thanh cần thiết của các khung thời gian làm việc.
Giới hạn được đặt bởi tham số không phải là cứng và có thể vượt quá trong một số trường hợp. Ví dụ, nếu vào đầu phiên, lịch sử báo giá cho một khung thời gian cụ thể đủ để chọn toàn bộ giới hạn, thì khi các thanh mới hình thành, số lượng của chúng có thể lớn hơn giá trị hiện tại của tham số. Số lượng thanh thực tế có sẵn được trả về bởi các hàm
Bars/iBars
.