Tham số tùy chọn
MQL5 cung cấp cơ hội để chỉ định các giá trị mặc định cho các tham số khi mô tả một hàm. Để làm điều này, cú pháp khởi tạo được sử dụng, tức là một hằng số của kiểu tương ứng ở bên phải tham số, sau dấu '='. Ví dụ:
void function(int value = 0);
Khi gọi hàm, các đối số cho các tham số như vậy có thể được bỏ qua. Khi đó, giá trị của chúng sẽ được đặt thành giá trị mặc định. Các tham số như vậy được gọi là tùy chọn (optional).
Các tham số tùy chọn phải xuất hiện ở cuối danh sách tham số. Nói cách khác, nếu tham số thứ i
được khai báo với khởi tạo, thì tất cả các tham số tiếp theo cũng phải có nó. Nếu không, sẽ xuất hiện lỗi biên dịch "missing default value for parameter" (thiếu giá trị mặc định cho tham số). Dưới đây là mô tả của một hàm có vấn đề như vậy.
double Largest(const double v1, const double v2 = -DBL_MAX,
const double v3);
2
Có hai giải pháp: hoặc tham số v3
cũng phải có giá trị mặc định, hoặc tham số v2
phải trở thành bắt buộc.
Bạn chỉ có thể bỏ qua các đối số tùy chọn khi gọi hàm từ phải sang trái. Nghĩa là, nếu hàm có hai tham số và cả hai đều là tùy chọn, thì khi gọi, bạn không thể bỏ qua tham số đầu tiên mà chỉ định tham số thứ hai. Giá trị đơn được truyền sẽ được khớp với tham số đầu tiên, và tham số thứ hai sẽ được coi là bị bỏ qua. Nếu cả hai đối số đều thiếu, dấu ngoặc rỗng vẫn cần thiết.
Xem xét hàm tìm số lớn nhất trong ba số. Tham số đầu tiên là bắt buộc, hai tham số cuối là tùy chọn và mặc định bằng số nhỏ nhất có thể của kiểu double
. Do đó, mỗi tham số trong số chúng, khi không có giá trị được truyền rõ ràng, chắc chắn sẽ nhỏ hơn (hoặc trong trường hợp cực đoan, bằng) tất cả các tham số khác.
double Largest(const double v1, const double v2 = -DBL_MAX,
const double v3 = -DBL_MAX)
{
return v1 > v2 ? (v1 > v3 ? v1 : v3) : (v2 > v3 ? v2 : v3);
}
2
3
4
5
Đây là cách bạn có thể gọi nó:
Print(Largest(1)); // ok: 1
Print(Largest(0, -2)); // ok: 0
Print(Largest(1, 2, 3)); // ok: 3
2
3
Với sự trợ giúp của các tham số tùy chọn, MQL5 triển khai khái niệm về các hàm với số lượng tham số biến đổi trong các hàm tùy chỉnh.
MQL5 không hỗ trợ cú pháp dấu ba chấm để định nghĩa các hàm với số lượng tham số biến đổi, như C++ làm. Đồng thời, có các hàm tích hợp trong API MQL5 được mô tả bằng dấu ba chấm và chấp nhận số lượng tham số tùy ý biến đổi. Ví dụ, đó là hàm Print
. Nguyên mẫu của nó trông như thế này: void Print(argument, ...). Do đó, chúng ta có thể gọi nó với tối đa 64 đối số phân tách bằng dấu phẩy (ngoại trừ mảng) và nó sẽ hiển thị chúng trong nhật ký.