Ghi và đọc biến toàn cục
API MQL5 cung cấp 2 hàm để ghi và đọc biến toàn cục: GlobalVariableSet
và GlobalVariableGet
(có hai phiên bản).
datetime GlobalVariableSet(const string name, double value)
Hàm này đặt một giá trị mới value
cho biến toàn cục có tên name
. Nếu biến chưa tồn tại trước khi hàm được gọi, nó sẽ được tạo. Nếu biến đã tồn tại, giá trị trước đó sẽ được thay thế bằng value
.
Nếu thành công, hàm trả về thời gian sửa đổi của biến (thời gian hiện tại của máy tính). Trong trường hợp có lỗi, chúng ta nhận được 0.
double GlobalVariableGet(const string name)
bool GlobalVariableGet(const string name, double &value)
Hàm này trả về giá trị của biến toàn cục có tên name
. Kết quả của việc gọi phiên bản đầu tiên chỉ chứa giá trị của biến (nếu thành công) hoặc 0 (nếu có lỗi). Vì biến có thể chứa giá trị 0 (giống như chỉ báo lỗi), tùy chọn này yêu cầu phân tích mã lỗi nội bộ _LastError
nếu nhận được 0, để phân biệt phiên bản tiêu chuẩn với phiên bản không tiêu chuẩn. Cụ thể, nếu cố gắng đọc một biến không tồn tại, lỗi nội bộ 4501 (GLOBALVARIABLE_NOT_FOUND
) sẽ được tạo ra.
Phiên bản này của hàm thuận tiện để sử dụng trong các thuật toán mà việc nhận được 0 là một sự thay thế phù hợp cho việc khởi tạo mặc định cho một biến chưa tồn tại trước đó (xem ví dụ dưới đây). Nếu sự vắng mặt của biến cần được xử lý theo cách đặc biệt (đặc biệt là để tính toán một giá trị bắt đầu khác), bạn nên kiểm tra sự tồn tại của biến trước bằng hàm GlobalVariableCheck
và tùy thuộc vào kết quả của nó, thực thi các nhánh mã khác nhau. Tùy chọn, bạn có thể sử dụng phiên bản thứ hai.
Phiên bản thứ hai của hàm trả về true
hoặc false
tùy thuộc vào sự thành công của việc thực thi. Nếu thành công, giá trị của biến toàn cục của terminal được đặt vào biến nhận value
, được truyền bằng tham chiếu làm tham số thứ hai. Nếu không có biến, chúng ta nhận được false
.
Trong script thử nghiệm GlobalsRunCount.mq5
, chúng ta sử dụng một biến toàn cục để đếm số lần nó chạy. Tên của biến là tên của tệp nguồn.
const string gv = __FILE__;
Nhớ rằng macro tích hợp __FILE__
(xem Hằng số định sẵn) được trình biên dịch mở rộng thành tên của tệp được biên dịch, tức là trong trường hợp này là GlobalsRunCount.mq5
.
Trong hàm OnStart
, chúng ta sẽ cố gắng đọc biến toàn cục đã cho và lưu kết quả vào biến cục bộ count
. Nếu chưa có biến toàn cục, chúng ta nhận được 0, điều này là ổn đối với chúng ta (chúng ta bắt đầu đếm từ 0).
Trước khi lưu giá trị vào count
, cần ép kiểu nó sang (int
), vì hàm GlobalVariableGet
trả về double
, và nếu không có ép kiểu, trình biên dịch sẽ tạo cảnh báo về khả năng mất dữ liệu (nó không biết rằng chúng ta chỉ định lưu trữ số nguyên).
void OnStart()
{
int count = (int)PRTF(GlobalVariableGet(gv));
count++;
PRTF(GlobalVariableSet(gv, count));
Print("This script run count: ", count);
}
2
3
4
5
6
7
Sau đó, chúng ta tăng bộ đếm lên 1 và ghi lại nó vào biến toàn cục bằng GlobalVariableSet
. Nếu chúng ta chạy script nhiều lần, chúng ta sẽ nhận được các mục nhật ký tương tự như sau (dấu thời gian của bạn sẽ khác):
GlobalVariableGet(gv)=0.0 / GLOBALVARIABLE_NOT_FOUND(4501)
GlobalVariableSet(gv,count)=2021.08.29 16:04:40 / ok
This script run count: 1
GlobalVariableGet(gv)=1.0 / ok
GlobalVariableSet(gv,count)=2021.08.29 16:05:00 / ok
This script run count: 2
GlobalVariableGet(gv)=2.0 / ok
GlobalVariableSet(gv,count)=2021.08.29 16:05:21 / ok
This script run count: 3
2
3
4
5
6
7
8
9
Điều quan trọng cần lưu ý là trong lần chạy đầu tiên, chúng ta nhận được giá trị 0, và cờ lỗi nội bộ 4501 được tạo ra. Tất cả các lần gọi tiếp theo được thực thi mà không có vấn đề gì vì biến đã tồn tại (có thể thấy trong cửa sổ "Global Variables" của terminal). Những ai muốn có thể đóng terminal, khởi động lại và thực thi script một lần nữa: bộ đếm sẽ tiếp tục tăng từ giá trị trước đó.