Lấy danh sách ký hiệu có sẵn và Market Watch
API MQL5 có một số hàm để thao tác với các ký hiệu. Sử dụng chúng, bạn có thể tìm tổng số ký hiệu có sẵn, số ký hiệu được chọn trong Market Watch
, cũng như tên của chúng. Như bạn đã biết, danh sách tổng quát các ký hiệu có sẵn trong terminal được biểu thị dưới dạng cấu trúc phân cấp trong hộp thoại Symbols
, mà người dùng có thể mở bằng lệnh View -> Symbols
, hoặc từ menu ngữ cảnh của Market Watch
. Danh sách này bao gồm cả các ký hiệu do nhà môi giới cung cấp và ký hiệu tùy chỉnh được tạo cục bộ. Bạn có thể sử dụng hàm SymbolsTotal
để tìm tổng số ký hiệu.
int SymbolsTotal(bool selected)
Tham số selected
chỉ định liệu chỉ yêu cầu các ký hiệu trong Market Watch
(true
) hay tất cả các ký hiệu có sẵn (false
).
Hàm SymbolName
thường được sử dụng cùng với SymbolsTotal
. Nó trả về tên của ký hiệu theo chỉ số của nó (việc nhóm lưu trữ ký hiệu thành các thư mục logic không được tính đến ở đây, xem thuộc tính SYMBOL_PATH).
string SymbolName(int index, bool selected)
Tham số index
chỉ định chỉ số của ký hiệu được yêu cầu. Giá trị Index
phải nằm trong khoảng từ 0 đến số lượng ký hiệu, tùy thuộc vào ngữ cảnh yêu cầu được chỉ định bởi tham số thứ hai selected
: true
giới hạn việc liệt kê trong các ký hiệu được chọn trong Market Watch
, trong khi false
khớp với tất cả các ký hiệu hoàn toàn (tương tự như SymbolsTotal
). Do đó, khi gọi SymbolName
, hãy đặt tham số selected
giống với giá trị trong lệnh gọi SymbolsTotal
trước đó, được sử dụng để xác định phạm vi chỉ số.
Trong trường hợp xảy ra lỗi, đặc biệt nếu chỉ số yêu cầu nằm ngoài phạm vi danh sách, hàm sẽ trả về chuỗi rỗng, và mã lỗi sẽ được ghi vào biến _LastError
.
Cần lưu ý rằng khi tùy chọn
selected
được kích hoạt, cặp hàmSymbolsTotal
vàSymbolName
trả về thông tin cho danh sách ký hiệu thực sự được terminal cập nhật, tức là các ký hiệu được đồng bộ hóa liên tục với máy chủ và có lịch sử báo giá khả dụng cho các chương trình MQL. Danh sách này có thể lớn hơn danh sách hiển thị trongMarket Watch
, nơi các phần tử được thêm vào một cách rõ ràng: bởi người dùng hoặc bởi chương trình MQL (để tìm hiểu cách thực hiện, xem phần Chỉnh sửa danh sách trongMarket Watch
). Các ký hiệu như vậy, không hiển thị trong cửa sổ, được terminal tự động kết nối khi cần thiết để tính toán tỷ giá chéo. Trong số các thuộc tính ký hiệu, có hai thuộc tính cho phép phân biệt giữa lựa chọn rõ ràng (SYMBOL_VISIBLE) và lựa chọn ngầm (SYMBOL_SELECT); chúng sẽ được thảo luận trong phần kiểm tra trạng thái ký hiệu. Nói một cách chặt chẽ, đối với các hàmSymbolsTotal
vàSymbolName
, việc đặtselected
thànhtrue
khớp với tập hợp ký hiệu mở rộng có SYMBOL_SELECT được bật, không chỉ những ký hiệu có SYMBOL_VISIBLE bằngtrue
.
Thứ tự trả về các ký hiệu trong Market Watch
tương ứng với cửa sổ terminal (tính đến khả năng sắp xếp lại do người dùng thực hiện, và không tính đến việc sắp xếp theo bất kỳ cột nào, nếu được bật). Không thể thay đổi thứ tự ký hiệu trong Market Watch
bằng lập trình.
Thứ tự trong danh sách tổng quát của Symbols
được terminal tự đặt (nội dung và cách sắp xếp của Market Watch
không ảnh hưởng đến nó).
Ví dụ, hãy xem xét script đơn giản SymbolList.mq5
, in các ký hiệu có sẵn vào nhật ký. Tham số đầu vào MarketWatchOnly
cho phép người dùng giới hạn danh sách chỉ trong các ký hiệu của Market Watch
(nếu tham số là true
) hoặc lấy toàn bộ danh sách (false
).
#property script_show_inputs
#include <MQL5Book/PRTF.mqh>
input bool MarketWatchOnly = true;
void OnStart()
{
const int n = SymbolsTotal(MarketWatchOnly);
Print("Total symbol count: ", n);
// ghi danh sách ký hiệu trong Market Watch hoặc tất cả các ký hiệu có sẵn
for(int i = 0; i < n; ++i)
{
PrintFormat("%4d %s", i, SymbolName(i, MarketWatchOnly));
}
// cố ý yêu cầu ngoài phạm vi để hiển thị lỗi
PRTF(SymbolName(n, MarketWatchOnly)); // MARKET_UNKNOWN_SYMBOL(4301)
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dưới đây là ví dụ về nhật ký.
Total symbol count: 10
0 EURUSD
1 XAUUSD
2 BTCUSD
3 GBPUSD
4 USDJPY
5 USDCHF
6 AUDUSD
7 USDCAD
8 NZDUSD
9 USDRUB
SymbolName(n,MarketWatchOnly)= / MARKET_UNKNOWN_SYMBOL(4301)
2
3
4
5
6
7
8
9
10
11
12