Quản lý đăng ký sự kiện Độ sâu Thị trường
Thiết bị đầu cuối nhận thông tin Độ sâu Thị trường trên cơ sở đăng ký: một chương trình MQL phải thể hiện ý định nhận các sự kiện Độ sâu Thị trường (sổ lệnh) hoặc ngược lại, chấm dứt đăng ký bằng cách gọi các hàm tương ứng, MarketBookAdd
và MarketBookRelease
.
Hàm MarketBookAdd
đăng ký để nhận thông báo về các thay đổi trong sổ lệnh cho công cụ được chỉ định. Do đó, bạn có thể đăng ký sổ lệnh cho nhiều công cụ, không chỉ công cụ đang hoạt động của biểu đồ hiện tại.
bool MarketBookAdd(const string symbol)
Thông thường, hàm này được gọi từ OnInit
hoặc trong hàm khởi tạo của một đối tượng tồn tại lâu dài. Thông báo về thay đổi sổ lệnh được gửi đến chương trình dưới dạng sự kiện OnBookEvent
, do đó, để xử lý chúng, chương trình phải có một hàm xử lý cùng tên.
Nếu ký hiệu được chỉ định chưa được chọn trong Market Watch trước khi gọi hàm, nó sẽ tự động được thêm vào cửa sổ.
Hàm MarketBookRelease
hủy đăng ký nhận thông báo về các thay đổi trong sổ lệnh được chỉ định.
bool MarketBookRelease(const string symbol)
Theo quy tắc, hàm này nên được gọi từ OnDeinit
hoặc từ hàm hủy của một đối tượng tồn tại lâu dài.
Cả hai hàm trả về giá trị true
nếu thành công và false
nếu không.
Đối với tất cả các ứng dụng chạy trên cùng một biểu đồ, các bộ đếm đăng ký riêng biệt được duy trì theo ký hiệu. Nói cách khác, có thể có nhiều đăng ký cho các ký hiệu khác nhau trên biểu đồ, và mỗi đăng ký có bộ đếm riêng.
Việc đăng ký hoặc hủy đăng ký bằng một lần gọi bất kỳ hàm nào chỉ thay đổi bộ đếm đăng ký cho một ký hiệu cụ thể, trên một biểu đồ cụ thể nơi chương trình đang chạy. Điều này có nghĩa là hai biểu đồ có thể có đăng ký cho các sự kiện OnBookEvent
của cùng một ký hiệu, nhưng với các giá trị bộ đếm đăng ký khác nhau.
Giá trị ban đầu của bộ đếm đăng ký là 0. Mỗi lần gọi MarketBookAdd
, bộ đếm đăng ký cho ký hiệu được chỉ định trên biểu đồ đã cho tăng lên 1 (ký hiệu biểu đồ và ký hiệu trong MarketBookAdd
không cần phải trùng khớp). Khi gọi MarketBookRelease
, bộ đếm đăng ký cho ký hiệu được chỉ định trong biểu đồ giảm đi 1.
Các sự kiện OnBookEvent
cho bất kỳ ký hiệu nào trong biểu đồ được tạo ra miễn là bộ đếm đăng ký cho ký hiệu này lớn hơn 0. Do đó, điều quan trọng là mọi chương trình MQL chứa các lệnh gọi MarketBookAdd
phải hủy đăng ký nhận sự kiện cho mỗi ký hiệu một cách chính xác bằng MarketBookRelease
khi hoàn thành công việc. Để làm điều này, bạn nên đảm bảo số lần gọi MarketBookAdd
và MarketBookRelease
khớp nhau. MQL5 không cho phép bạn tìm ra giá trị của bộ đếm.
Ví dụ đầu tiên là một chỉ báo không bộ đệm đơn giản MarketBookAddRelease.mq5
, kích hoạt đăng ký sổ lệnh tại thời điểm khởi chạy và vô hiệu hóa nó khi được dỡ bỏ. Trong tham số đầu vào WorkSymbol
, bạn có thể chỉ định một ký hiệu để đăng ký. Nếu để trống (giá trị mặc định), đăng ký sẽ được khởi tạo cho ký hiệu đang hoạt động của biểu đồ hiện tại.
input string WorkSymbol = ""; // WorkSymbol (trống nghĩa là ký hiệu biểu đồ hiện tại)
const string _WorkSymbol = StringLen(WorkSymbol) == 0 ? _Symbol : WorkSymbol;
string symbols[];
void OnInit()
{
const int n = StringSplit(_WorkSymbol, ',', symbols);
for(int i = 0; i < n; ++i)
{
if(!PRTF(MarketBookAdd(symbols[i])))
PrintFormat("MarketBookAdd(%s) failed", symbols[i]);
}
}
int OnCalculate(const int rates_total, const int prev_calculated, const int, const double &price[])
{
return rates_total;
}
void OnDeinit(const int)
{
for(int i = 0; i < ArraySize(symbols); ++i)
{
if(!PRTF(MarketBookRelease(symbols[i])))
PrintFormat("MarketBookRelease(%s) failed", symbols[i]);
}
}
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
Là một tính năng bổ sung, có thể chỉ định nhiều công cụ cách nhau bằng dấu phẩy. Trong trường hợp này, đăng ký cho tất cả sẽ được yêu cầu.
Khi chỉ báo được khởi chạy, dấu hiệu thành công đăng ký hoặc mã lỗi được hiển thị trong nhật ký. Sau đó, chỉ báo cố gắng hủy đăng ký các sự kiện trong trình xử lý OnDeinit
.
Với cài đặt mặc định, trên biểu đồ có ký hiệu mà sổ lệnh có sẵn, chúng ta sẽ nhận được các mục sau trong nhật ký:
MarketBookAdd(symbols[i])=true / ok
MarketBookRelease(symbols[i])=true / ok
2
Nếu bạn đặt chỉ báo trên biểu đồ với ký hiệu không có sổ lệnh, chúng ta sẽ thấy các mã lỗi:
MarketBookAdd(symbols[i])=false / BOOKS_CANNOT_ADD(4901)
MarketBookAdd(XPDUSD) failed
MarketBookRelease(symbols[i])=false / BOOKS_CANNOT_DELETE(4902)
MarketBookRelease(XPDUSD) failed
2
3
4
Bạn có thể thử nghiệm bằng cách chỉ định trong tham số đầu vào WorkSymbol
các ký hiệu hiện có hoặc không tồn tại. Chúng ta sẽ xem xét trường hợp đăng ký sổ lệnh của nhiều ký hiệu trong phần tiếp theo.