Chỉnh sửa danh sách Market Watch
Sử dụng hàm SymbolSelect
, nhà phát triển chương trình MQL có thể thêm một ký hiệu cụ thể vào Market Watch
hoặc xóa nó khỏi đó.
bool SymbolSelect(const string name, bool select)
Tham số name
chứa tên của ký hiệu bị ảnh hưởng bởi thao tác này. Tùy thuộc vào giá trị của tham số select
, một ký hiệu sẽ được thêm vào Market Watch
(true
) hoặc bị xóa khỏi đó. Tên ký hiệu phân biệt chữ cái in hoa và thường: ví dụ, "EURUSD.m" không bằng "EURUSD.M".
Hàm trả về chỉ báo thành công (true
) hoặc lỗi (false
). Mã lỗi có thể được tìm thấy trong _LastError
.
Không thể xóa một ký hiệu nếu có biểu đồ đang mở hoặc vị thế đang mở cho ký hiệu đó. Ngoài ra, bạn không thể xóa một ký hiệu được sử dụng rõ ràng trong công thức để tính toán một công cụ tổng hợp (tùy chỉnh) đã được thêm vào
Market Watch
.
Cần lưu ý rằng ngay cả khi không có biểu đồ và vị thế mở cho một ký hiệu, nó vẫn có thể được sử dụng gián tiếp bởi các chương trình MQL: ví dụ, chúng có thể đọc lịch sử báo giá hoặc tích tắc của nó. Việc xóa ký hiệu như vậy có thể gây ra vấn đề trong các chương trình này.
Script sau đây SymbolRemoveUnused.mq5
có khả năng ẩn tất cả các ký hiệu không được sử dụng rõ ràng, vì vậy nên kiểm tra nó trên tài khoản demo hoặc lưu tập hợp ký hiệu hiện tại qua menu ngữ cảnh trước.
#include <MQL5Book/MqlError.mqh>
#define PUSH(A,V) (A[ArrayResize(A, ArraySize(A) + 1) - 1] = V)
void OnStart()
{
// yêu cầu xác nhận từ người dùng để xóa
if(IDOK == MessageBox("Script này sẽ xóa tất cả các ký hiệu không sử dụng"
" khỏi Market Watch. Tiếp tục?", "Vui lòng xác nhận", MB_OKCANCEL))
{
const int n = SymbolsTotal(true);
ResetLastError();
string removed[];
// duyệt qua các ký hiệu của Market Watch theo thứ tự ngược lại
for(int i = n - 1; i >= 0; --i)
{
const string s = SymbolName(i, true);
if(SymbolSelect(s, false))
{
// ghi nhớ những gì đã bị xóa
PUSH(removed, s);
}
else
{
// trong trường hợp lỗi, hiển thị lý do
PrintFormat("Không thể xóa '%s': %s (%d)", s, E2S(_LastError), _LastError);
}
}
const int r = ArraySize(removed);
PrintFormat("%d trong số %d ký hiệu đã bị xóa", r, n);
ArrayPrint(removed);
...
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
29
30
31
32
Sau khi người dùng xác nhận phân tích danh sách ký hiệu, chương trình cố gắng ẩn từng ký hiệu liên tiếp bằng cách gọi SymbolSelect(s, false)
. Điều này chỉ hoạt động với các công cụ không được sử dụng rõ ràng. Việc liệt kê ký hiệu được thực hiện theo thứ tự ngược lại để không làm sai lệch chỉ số. Tất cả các ký hiệu được xóa thành công được thu thập trong mảng removed
. Nhật ký hiển thị thống kê và chính mảng đó.
Nếu Market Watch
bị thay đổi, người dùng sau đó được cung cấp cơ hội khôi phục tất cả các ký hiệu đã xóa bằng cách gọi SymbolSelect(removed[i], true)
trong một vòng lặp.
if(r > 0)
{
// có thể khôi phục các ký hiệu đã xóa trở lại Market Watch
// (tại thời điểm này, cửa sổ hiển thị danh sách đã giảm)
if(IDOK == MessageBox("Bạn có muốn khôi phục các ký hiệu đã xóa"
" trong Market Watch không?", "Vui lòng xác nhận", MB_OKCANCEL))
{
int restored = 0;
for(int i = r - 1; i >= 0; --i)
{
restored += SymbolSelect(removed[i], true);
}
PrintFormat("%d ký hiệu đã được khôi phục", restored);
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dưới đây là ví dụ về đầu ra nhật ký.
Không thể xóa 'EURUSD': MARKET_SELECT_ERROR (4305)
Không thể xóa 'XAUUSD': MARKET_SELECT_ERROR (4305)
Không thể xóa 'BTCUSD': MARKET_SELECT_ERROR (4305)
Không thể xóa 'GBPUSD': MARKET_SELECT_ERROR (4305)
...
Không thể xóa 'USDRUB': MARKET_SELECT_ERROR (4305)
2 trong số 10 ký hiệu đã bị xóa
"NZDUSD" "USDCAD"
2 ký hiệu đã được khôi phục
2
3
4
5
6
7
8
9
Xin lưu ý rằng mặc dù các ký hiệu được khôi phục theo thứ tự ban đầu của chúng, như trong Market Watch
so với nhau, việc thêm vào xảy ra ở cuối danh sách, sau các ký hiệu còn lại. Do đó, tất cả các ký hiệu "bận" sẽ ở đầu danh sách, và tất cả các ký hiệu được khôi phục sẽ theo sau chúng. Đó là cách hoạt động đặc thù của SymbolSelect
: một ký hiệu luôn được thêm vào cuối danh sách, tức là không thể chèn một ký hiệu vào một vị trí cụ thể. Vì vậy, việc sắp xếp lại các phần tử của danh sách chỉ có thể thực hiện bằng cách chỉnh sửa thủ công.