Đặc điểm của mảng
Trước khi tìm hiểu về cú pháp cụ thể của việc khai báo mảng trong MQL5 và cách làm việc với chúng, chúng ta hãy xem xét một số khái niệm cơ bản về việc xây dựng mảng.
Đặc điểm cốt lõi của một mảng là số chiều.
Trong một mảng một chiều, các phần tử của nó được đặt từng cái một, giống như một hàng lính, và chỉ cần một số (chỉ số) là đủ để tham chiếu đến chúng. Giá từng thanh khi mở một công cụ tài chính theo độ sâu lịch sử nhất định có thể được lưu trong một mảng như vậy.
Trong một mảng hai chiều, các phần tử của nó phân kỳ theo hai hướng vuông góc logic, tạo thành một dạng hình vuông (hoặc hình chữ nhật, trong trường hợp chung), hai chỉ số được yêu cầu cho mỗi phần tử, tức là một chỉ số ở mỗi chiều. Một mảng như vậy có thể được sử dụng để lưu trữ các ô giá (Mở, Cao, Thấp và Đóng) cho mỗi thanh lịch sử. Số thanh sẽ được đếm bằng chiều thứ nhất, trong khi chiều thứ hai được sử dụng cho các số từ 0 đến 3, biểu thị một trong các loại giá.
Mảng ba chiều tương đương với một khối lập phương (hoặc, nghiêm ngặt hơn về mặt hình học, là khối hộp vuông góc) có ba trục. Tiếp tục ví dụ với mảng giá theo từng thanh, chúng ta có thể thêm vào đó chiều thứ ba chịu trách nhiệm lặp lại các công cụ tài chính từ Market Watch.
Đối với mỗi chiều, mảng có một độ dài (kích thước) nhất định thiết lập phạm vi các chỉ mục có thể. Nếu lịch sử được cho là được tải cho 1.000 thanh và 10 dụng cụ, chúng ta sẽ có một mảng có kích thước 1.000 phần tử trong chiều thứ nhất, 4 phần tử trong chiều thứ hai (OHLC) và 10 phần tử trong chiều thứ ba.
Tích của các kích thước trong tất cả các chiều cung cấp tổng số phần tử của mảng; trong trường hợp của chúng ta, con số này là 40.000. Trong MQL5, con số này không được vượt quá 2147483647
(tối đa cho int
).
Thật khó để hình dung ra một hình dạng rắn cho một mảng 4 chiều vì chúng ta đang sống trong thế giới 3 chiều. Tuy nhiên, MQL5 cho phép tạo ra các mảng có tối đa bốn chiều.
Cần lưu ý rằng bạn luôn có thể sử dụng mảng một chiều thay vì mảng nhiều chiều với số chiều ngẫu nhiên, bao gồm nhiều hơn 4. Đây chỉ là vấn đề sắp xếp việc tính toán lại một số chỉ mục thành một chỉ mục liên tục. Ví dụ, nếu một mảng hai chiều có 10 cột (chiều 1, trục X) và 5 hàng (chiều 2, trục Y), thì nó có thể được chuyển đổi thành một mảng một chiều với cùng số lượng phần tử, tức là 50. Trong trường hợp này, chỉ mục phần tử sẽ được tính theo công thức sau:
index = Y * N + X
Tại đây, N
là số phần tử trong chiều đầu tiên, trong trường hợp của chúng ta là 10
; đây là kích thước của mỗi hàng; Y
là số hàng (0..4); và X là số cột (0..9) trong hàng.
Kích thước trên các chiều là một đặc điểm khác phân biệt một mảng với một biến. Do đó, số chiều và kích thước trong mỗi chiều phải được chỉ định theo một cách nào đó trong phần mô tả, cùng với tên mảng và kiểu dữ liệu (xem phần sau).
WARNING
Bạn nên phân biệt giữa kích thước của một biến (phần tử mảng) tính bằng byte và kích thước của một mảng tính bằng số phần tử trong đó. Về mặt lý thuyết, kích thước mảng đầy đủ tính theo bộ nhớ mà nó tiêu thụ phải là tích của kích thước của một phần tử (tùy thuộc vào kiểu dữ liệu) và số phần tử. Tuy nhiên, công thức này không phải lúc nào cũng đúng trong thực tế. Đặc biệt, vì các chuỗi có thể có độ dài khác nhau nên khá khó để đánh giá dung lượng bộ nhớ mà một mảng chuỗi tiêu thụ.
Theo phương pháp phân bổ bộ nhớ, mảng có thể có kích thước động hoặc cố định.
Một mảng có kích thước cố định được mô tả trong mã với kích thước chính xác ở mọi chiều. Không thể thay đổi kích thước sau này. Tuy nhiên, các tác vụ thực tế thường xảy ra, trong đó lượng dữ liệu cần xử lý là tùy thuộc và do đó, việc thay đổi kích thước mảng trong quá trình hoạt động của thuật toán là điều mong muốn. Mảng động tồn tại cho mục đích cụ thể này. Như chúng ta sẽ thấy thêm, chúng được mô tả mà không chỉ định kích thước chiều thứ nhất và sau đó có thể được "kéo dài" hoặc "nén" bằng các hàm API MQL5 đặc biệt.
Tài liệu MQL5 sử dụng thuật ngữ mơ hồ gọi mảng có kích thước cố định là tĩnh. Khái niệm này cũng được sử dụng cho bộ điều chỉnh 'tĩnh' có thể được áp dụng cho mảng. Nếu một mảng như vậy được khai báo là động, thì nó đồng thời không tĩnh về mặt phân bổ bộ nhớ và tĩnh về mặt bộ điều chỉnh 'tĩnh'. Để loại trừ sự mơ hồ, ký tự tĩnh trong trang web nàysẽ chỉ có nghĩa là thuộc tính khai báo.
Cùng với các mảng động và cố định, có các mảng đặc biệt trong MQL5 để lưu trữ các trích dẫn và bộ đệm của các chỉ báo kỹ thuật. Các mảng như vậy được gọi là mảng chuỗi thời gian vì các chỉ số của chúng tương ứng với thời gian. Trên thực tế, các mảng này là một chiều và động. Tuy nhiên, không giống như các mảng động khác, bản thân thiết bị đầu cuối phân bổ bộ nhớ cho chúng. Chúng ta sẽ xem xét chúng trong các phần liên quan đến chuỗi thời gian và các chỉ báo.