Kiểm tra trạng thái biểu tượng
Trước đây chúng ta đã xem xét một số hàm liên quan đến trạng thái của một biểu tượng. Hãy nhớ rằng hàm SymbolExist
được sử dụng để kiểm tra sự tồn tại của một biểu tượng, và hàm SymbolSelect
được sử dụng để kiểm tra việc bao gồm hoặc loại trừ khỏi danh sách Market Watch
. Trong số các thuộc tính của biểu tượng, có một số cờ có mục đích tương tự, việc sử dụng chúng có cả ưu điểm và nhược điểm so với các hàm trên.
Cụ thể, thuộc tính SYMBOL_SELECT
cho phép bạn tìm hiểu xem biểu tượng được chỉ định có được chọn trong Market Watch
hay không, trong khi hàm SymbolSelect
thay đổi thuộc tính này.
Hàm SymbolExist
, không giống với thuộc tính tương tự SYMBOL_EXIST
, còn bổ sung thêm việc điền vào biến đầu ra với chỉ báo rằng biểu tượng đó là do người dùng tự định nghĩa. Khi truy vấn các thuộc tính, cần phải phân tích hai thuộc tính này riêng lẻ, vì thuộc tính của biểu tượng tùy chỉnh được lưu trong một thuộc tính khác, SYMBOL_CUSTOM
. Tuy nhiên, trong một số trường hợp, chương trình có thể chỉ cần một thuộc tính, và khi đó khả năng truy vấn riêng lẻ trở thành một ưu điểm.
Tất cả các cờ đều là giá trị boolean, được lấy thông qua hàm SymbolInfoInteger
.
Định danh | Mô tả |
---|---|
SYMBOL_EXIST | Cho biết một biểu tượng với tên đã cho có tồn tại hay không |
SYMBOL_SELECT | Cho biết biểu tượng được chọn trong Market Watch |
SYMBOL_VISIBLE | Cho biết biểu tượng được chỉ định được hiển thị trong Market Watch |
Đặc biệt đáng chú ý là SYMBOL_VISIBLE
. Sự thật là một số biểu tượng (thường là các tỷ giá chéo cần thiết để tính toán yêu cầu ký quỹ và lợi nhuận bằng đồng tiền gửi) được chọn tự động trong Market Watch
và không hiển thị trong danh sách mà người dùng có thể thấy. Những biểu tượng như vậy phải được chọn rõ ràng (bởi người dùng hoặc bằng lập trình) để được hiển thị. Do đó, chính thuộc tính SYMBOL_VISIBLE
cho phép xác định liệu một biểu tượng có hiển thị trong cửa sổ hay không: nó có thể bằng false
đối với một số phần tử của danh sách, được lấy bằng cặp hàm SymbolsTotal
và SymbolName
với tham số selected
bằng true
.
Hãy xem xét một kịch bản đơn giản (SymbolInvisible.mq5
), kịch bản này tìm kiếm trong terminal các biểu tượng được chọn ngầm, tức là những biểu tượng không được hiển thị trong Market Watch
(SYMBOL_VISIBLE
bị đặt lại) trong khi SYMBOL_SELECT
của chúng bằng true
.
#define PUSH(A,V) (A[ArrayResize(A, ArraySize(A) + 1) - 1] = V)
void OnStart()
{
const int n = SymbolsTotal(false);
int selected = 0;
string invisible[];
// lặp qua tất cả các biểu tượng có sẵn
for(int i = 0; i < n; ++i)
{
const string s = SymbolName(i, false);
if(SymbolInfoInteger(s, SYMBOL_SELECT))
{
selected++;
if(!SymbolInfoInteger(s, SYMBOL_VISIBLE))
{
// thu thập các biểu tượng được chọn nhưng không hiển thị vào một mảng
PUSH(invisible, s);
}
}
}
PrintFormat("Symbols: total=%d, selected=%d, implicit=%d",
n, selected, ArraySize(invisible));
if(ArraySize(invisible))
{
ArrayPrint(invisible);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Hãy thử biên dịch và chạy kịch bản trên các tài khoản khác nhau. Tình huống khi một biểu tượng được chọn ngầm không phải lúc nào cũng xảy ra. Chẳng hạn, nếu trong Market Watch
các mã chứng khoán của các blue chip Nga được định giá bằng rúp được chọn, và tài khoản giao dịch sử dụng một loại tiền tệ khác (ví dụ: đô la hoặc euro, nhưng không phải rúp), thì biểu tượng USDRUB
sẽ được chọn tự động. Tất nhiên, điều này假 định rằng nó chưa được thêm vào Market Watch
một cách rõ ràng trước đó. Khi đó, chúng ta nhận được kết quả sau trong nhật ký:
Symbols: total=50681, selected=49, implicit=1
"USDRUB"
2