Dữ liệu đầu vào
Cách cơ bản để truyền dữ liệu vào chương trình MQL là sử dụng tham số đầu vào. Chúng tương tự như các hàm và chỉ các biến, về nhiều mặt, đặc biệt là về cú pháp mô tả và các nguyên tắc sử dụng chúng trong mã.
Hơn nữa, mô tả tham số đầu vào có một số khác biệt cần thiết:
- Nó được đặt trong văn bản bên ngoài tất cả các khối (chúng ta mới chỉ tìm hiểu về các khối tạo nên thân hàm, nhưng chúng ta sẽ tìm hiểu về các khối khác sau) hay nói cách khác, bên ngoài bất kỳ cặp dấu ngoặc nhọn nào;
- Nó bắt đầu bằng từ khóa
input
; và - Nó được khởi tạo bằng giá trị mặc định.
Người ta thường khuyên nên đặt tham số đầu vào ở đầu mã nguồn.
Ví dụ, để xác định tham số đầu vào cho việc nhập số giờ vào tập lệnh của chúng ta, chuỗi tiếp theo phải được thêm ngay vào bộ ba lệnh #property
:
input int GreetingHour = 0;
Bản ghi này có nhiều ý nghĩa.
- Đầu tiên, có biến
GreetingHour
trong tập lệnh hiện tại, có sẵn từ bất kỳ nơi nào của mã nguồn, bao gồm từ bên trong bất kỳ hàm nào. Định nghĩa này được gọi là định nghĩa cấp toàn cục, do thực hiện mục 1 từ danh sách ở trên. - Thứ hai, sử dụng từ khóa
input
làm cho biến như vậy hiển thị bên trong chương trình và trong giao diện người dùng, trong hộp thoại thuộc tính chương trình MQL5, mở ra khi chương trình bắt đầu. Do đó, khi bắt đầu chương trình, người dùng đặt giá trị cần thiết của các tham số (trong trường hợp của chúng ta, một tham sốGreetingHour
), và chúng trở thành giá trị của các biến tương ứng trong quá trình thực thi chương trình.
Chúng ta hãy lưu ý lại rằng giá trị mặc định mà chúng ta đã chỉ định trong mã sẽ được hiển thị cho người dùng trong hộp thoại. Tuy nhiên, người dùng sẽ có thể thay đổi nó. Trong trường hợp này, đó là giá trị mới được nhập thủ công sẽ được đưa vào chương trình (không phải giá trị khởi tạo).
Giá trị ban đầu của các tham số đầu vào bị ảnh hưởng bởi cả quá trình khởi tạo trong mã và lựa chọn tương tác của người dùng khi khởi chạy chúng, cũng như loại chương trình MQL5 và cách khởi chạy. Vấn đề là các loại chương trình MQL5 khác nhau có vòng đời khác nhau sau khi được khởi chạy trên biểu đồ. Do đó, khi được đặt một lần trên biểu đồ, indicators
và Experts
sẽ được đăng ký trong đó mãi mãi, cho đến khi người dùng xóa chúng một cách rõ ràng. Do đó, thiết bị đầu cuối ghi nhớ các cài đặt mới nhất đã chọn và tự động sử dụng chúng, ví dụ, khi thiết bị đầu cuối khởi động lại. Tuy nhiên, các tập lệnh (scripts
) không được lưu trong biểu đồ giữa các phiên thiết bị đầu cuối. Do đó, chỉ có thể hiển thị giá trị mặc định cho chúng ta khi chúng ta khởi chạy tập lệnh.
Thật không may, vì một số lý do, mô tả tham số đầu vào không đảm bảo gọi hộp thoại cài đặt khi bắt đầu scripts
(scripts là loại chương trình MQL5 độc lập). Để điều này xảy ra, cần phải thêm một chỉ thị #property
cụ thể cho tập lệnh vào mã:
#property script_show_inputs
Chỉ thị này không bắt buộc đối với các loại chương trình MQL5 khác.
Chúng ta cần GreetingHour
chuyển giá trị của nó vào hàm Greeting
. Để làm như vậy, chỉ cần chèn nó vào lệnh gọi hàm Greeting
, thay vì 0:
void OnStart()
{
Print(Greeting(GreetingHour), ", ", Symbol());
}
2
3
4
Xem xét những thay đổi chúng ta đã thực hiện để mô tả tham số đầu vào, hãy lưu phiên bản tập lệnh mới trong tệp GoodTime1.mq5
. Nếu chúng ta biên dịch và khởi động nó, chúng ta sẽ thấy hộp thoại nhập dữ liệu:
Ví dụ, nếu chúng ta chỉnh sửa giá trị GreetingHour
thành 10, thì tập lệnh sẽ hiển thị lời chào sau:
GoodTime1 (EURUSD,H1) Good afternoon, EURUSD
2
Đây là kết quả đúng và nằm trong dự đoán.
Giả sử chạy lại tập lệnh và nhập 100. Thay vì bất kỳ phản hồi có ý nghĩa nào, chúng ta sẽ nhận được:
GoodTime1 (EURUSD,H1) array out of range in 'GoodTime1.mq5' (19,18)
Chúng ta vừa gặp phải một hiện tượng mới, tức là lỗi thời gian chạy. Trong trường hợp này, thiết bị đầu cuối thông báo rằng ở vị trí 18 của chuỗi 19, tập lệnh của chúng ta đã cố gắng đọc giá trị của một phần tử mảng có chỉ mục không tồn tại (vượt quá kích thước mảng).
Vì lỗi là người bạn đồng hành thường xuyên và cần thiết của một lập trình viên và chúng ta phải học cách sửa chúng, chúng ta hãy nói chi tiết hơn về chúng.