Biến toàn cục của terminal máy khách
Trong chương trước, chúng ta đã nghiên cứu các hàm MQL5 làm việc với tệp. Chúng cung cấp các tùy chọn rộng rãi, linh hoạt để ghi và đọc dữ liệu bất kỳ. Tuy nhiên, đôi khi một chương trình MQL cần một cách đơn giản hơn để lưu và khôi phục trạng thái của một thuộc tính giữa các lần chạy.
Ví dụ, chúng ta muốn tính toán một số số liệu thống kê nhất định: chương trình được khởi chạy bao nhiêu lần, có bao nhiêu phiên bản của chương trình được thực thi song song trên các biểu đồ khác nhau, v.v. Việc tích lũy thông tin này trong chính chương trình là không thể. Phải có một loại lưu trữ dài hạn bên ngoài nào đó. Nhưng việc tạo một tệp cho mục đích này sẽ tốn kém, mặc dù điều đó cũng khả thi.
Nhiều chương trình được thiết kế để tương tác với nhau, tức là chúng phải trao đổi thông tin theo một cách nào đó. Nếu chúng ta đang nói về việc tích hợp với một chương trình bên ngoài terminal, hoặc về việc truyền một lượng lớn dữ liệu, thì thực sự khó thực hiện mà không sử dụng tệp. Tuy nhiên, khi dữ liệu cần gửi không nhiều, và tất cả các chương trình được viết bằng MQL5 và chạy bên trong MetaTrader 5, việc sử dụng tệp dường như là dư thừa. Terminal cung cấp một công nghệ đơn giản hơn cho trường hợp này: biến toàn cục.
Biến toàn cục là một vị trí được đặt tên trong bộ nhớ chung của terminal. Nó có thể được tạo, sửa đổi hoặc xóa bởi bất kỳ chương trình MQL nào, nhưng không thuộc về chương trình đó một cách độc quyền và có sẵn cho tất cả các chương trình MQL khác. Tên của biến toàn cục là bất kỳ chuỗi duy nhất (trong số tất cả các biến) nào không quá 63 ký tự. Chuỗi này không cần phải đáp ứng các yêu cầu đối với định danh biến trong MQL5, vì các biến toàn cục của terminal không phải là biến theo nghĩa thông thường. Lập trình viên không định nghĩa chúng trong mã nguồn theo cú pháp mà chúng ta đã học trong Biến, chúng không phải là một phần không thể thiếu của chương trình MQL, và bất kỳ hành động nào với chúng chỉ được thực hiện bằng cách gọi một trong những hàm đặc biệt mà chúng ta sẽ mô tả trong chương này.
Các biến toàn cục chỉ cho phép lưu trữ các giá trị kiểu double
. Nếu cần, bạn có thể đóng gói/chuyển đổi các giá trị của các kiểu khác sang double
hoặc sử dụng một phần của tên biến (theo sau một tiền tố nhất định, chẳng hạn) để lưu trữ chuỗi.
Trong khi terminal đang chạy, các biến toàn cục được lưu trữ trong RAM và có sẵn gần như ngay lập tức: chi phí duy nhất liên quan đến việc gọi hàm. Điều này chắc chắn mang lại lợi thế cho biến toàn cục so với việc sử dụng tệp, vì khi xử lý tệp, việc lấy handle là một quá trình tương đối chậm, và chính handle cũng tiêu tốn một số tài nguyên bổ sung.
Khi kết thúc phiên terminal, các biến toàn cục được dỡ vào một tệp đặc biệt (gvariables.dat
) và sau đó được khôi phục từ đó vào lần chạy terminal tiếp theo.
Một biến toàn cục cụ thể sẽ tự động bị terminal xóa nếu nó không được yêu cầu trong vòng 4 tuần. Hành vi này dựa trên việc theo dõi và lưu trữ thời gian sử dụng cuối cùng của biến, trong đó sử dụng đề cập đến việc đặt một giá trị mới hoặc đọc một giá trị cũ (nhưng không phải kiểm tra sự tồn tại hoặc lấy thời gian sử dụng cuối cùng).
Lưu ý
Lưu ý rằng các biến toàn cục không được liên kết với một tài khoản, hồ sơ hoặc bất kỳ đặc điểm nào khác của môi trường giao dịch. Do đó, nếu chúng được dùng để lưu trữ thứ gì đó liên quan đến môi trường (ví dụ, một số giới hạn chung cho một tài khoản cụ thể), tên biến nên được xây dựng có tính đến tất cả các yếu tố ảnh hưởng đến thuật toán và việc ra quyết định. Để phân biệt giữa các biến toàn cục của nhiều phiên bản của cùng một Expert Advisor (EA), bạn có thể cần thêm ký hiệu đang hoạt động, khung thời gian hoặc "số ma thuật" từ cài đặt EA vào tên.
Ngoài các chương trình MQL, biến toàn cục cũng có thể được người dùng tạo thủ công. Danh sách các biến toàn cục hiện có, cũng như các phương tiện quản lý tương tác của chúng, có thể được tìm thấy trong hộp thoại mở trong terminal bằng lệnh Tools -> Global Variables
(F3).
Bằng cách sử dụng các nút tương ứng ở đây, bạn có thể Add
và Delete
biến toàn cục, và nhấp đúp vào các cột Variable
hoặc Meaning
cho phép bạn chỉnh sửa tên hoặc giá trị của một biến cụ thể. Các phím nóng sau hoạt động từ bàn phím: F2 để chỉnh sửa tên, F3 để chỉnh sửa giá trị, Ins để thêm biến mới, Del để xóa biến được chọn.
Một chút sau, chúng ta sẽ nghiên cứu hai loại chương trình MQL chính — Expert Advisors và Indicators. Đặc điểm đặc biệt của chúng là khả năng chạy trong tester, nơi các hàm cho biến toàn cục cũng hoạt động. Tuy nhiên, các biến toàn cục được tạo, lưu trữ và quản lý bởi tester agent trong tester. Nói cách khác, danh sách các biến toàn cục của terminal không có sẵn trong tester, và những biến được tạo bởi chương trình đang thử nghiệm thuộc về một agent cụ thể, và thời gian sống của chúng bị giới hạn trong một lần chạy thử nghiệm. Tức là, các biến toàn cục của agent không thể nhìn thấy từ các agent khác và sẽ bị xóa khi kết thúc lần chạy thử nghiệm. Đặc biệt, nếu EA được tối ưu hóa trên nhiều agent, nó có thể thao tác với các biến toàn cục để "giao tiếp" với các chỉ báo mà nó sử dụng trong cùng bối cảnh của agent đó vì chúng được thực thi cùng nhau ở đó, nhưng trên các agent song song, các bản sao khác của EA sẽ tạo danh sách biến riêng của chúng.
INFO
Trao đổi dữ liệu giữa các chương trình MQL bằng biến toàn cục không phải là cách duy nhất có sẵn, và không phải lúc nào cũng là cách phù hợp nhất. Đặc biệt, EA và chỉ báo là các loại chương trình MQL tương tác có thể tạo và chấp nhận sự kiện trên biểu đồ. Bạn có thể truyền các loại thông tin khác nhau trong tham số sự kiện. Ngoài ra, các mảng dữ liệu tính toán có thể được chuẩn bị và cung cấp cho các chương trình MQL khác dưới dạng bộ đệm chỉ báo. Các chương trình MQL nằm trên biểu đồ có thể sử dụng đối tượng đồ họa giao diện người dùng để truyền và lưu trữ thông tin.
Về mặt kỹ thuật, số lượng tối đa biến toàn cục chỉ bị giới hạn bởi tài nguyên của hệ điều hành. Tuy nhiên, đối với số lượng lớn phần tử, nên sử dụng các phương tiện phù hợp hơn: tệp hoặc cơ sở dữ liệu.