Nhận sự kiện về thay đổi trong Độ sâu Thị trường
Sự kiện OnBookEvent
được thiết bị đầu cuối tạo ra khi trạng thái sổ lệnh thay đổi. Sự kiện này được xử lý bởi hàm OnBookEvent
được định nghĩa trong mã nguồn. Để thiết bị đầu cuối bắt đầu gửi thông báo OnBookEvent
đến chương trình MQL cho một ký hiệu cụ thể, trước tiên bạn phải đăng ký nhận chúng bằng hàm MarketBookAdd
.
Để hủy đăng ký nhận sự kiện OnBookEvent
cho một ký hiệu, hãy gọi hàm MarketBookRelease
.
Sự kiện OnBookEvent
được phát rộng rãi, nghĩa là chỉ cần một chương trình MQL trên biểu đồ đăng ký sự kiện OnBookEvent
, tất cả các chương trình khác trên cùng biểu đồ cũng sẽ bắt đầu nhận sự kiện nếu chúng có trình xử lý OnBookEvent
trong mã. Do đó, cần phân tích tên ký hiệu được truyền vào trình xử lý dưới dạng tham số.
Nguyên mẫu của trình xử lý OnBookEvent
như sau.
void OnBookEvent(const string &symbol)
Các sự kiện OnBookEvent
được xếp hàng đợi ngay cả khi việc xử lý sự kiện OnBookEvent
trước đó chưa hoàn tất.
Điều quan trọng là các sự kiện OnBookEvent
chỉ là thông báo và không cung cấp trạng thái của sổ lệnh. Để lấy dữ liệu Độ sâu Thị trường, hãy gọi hàm MarketBookGet
.
Tuy nhiên, cần lưu ý rằng lệnh gọi MarketBookGet
, ngay cả khi được thực hiện trực tiếp từ trình xử lý OnBookEvent
, sẽ nhận trạng thái hiện tại của sổ lệnh tại thời điểm MarketBookGet
được gọi, điều này không nhất thiết khớp với trạng thái sổ lệnh đã kích hoạt gửi sự kiện OnBookEvent
. Điều này có thể xảy ra khi một chuỗi thay đổi sổ lệnh rất nhanh đến thiết bị đầu cuối.
Về vấn đề này, để có được biên niên sử đầy đủ nhất về các thay đổi Độ sâu Thị trường, chúng ta cần viết một triển khai của OnBookEvent
và ưu tiên tối ưu hóa theo tốc độ thực thi.
Đồng thời, không có cách nào đảm bảo để lấy tất cả các trạng thái Độ sâu Thị trường duy nhất trong MQL5.
Nếu chương trình của bạn bắt đầu nhận thông báo thành công, sau đó chúng biến mất khi thị trường đang mở (và các tick vẫn tiếp tục đến), điều này có thể cho thấy vấn đề trong đăng ký. Cụ thể, một chương trình MQL khác được thiết kế kém có thể hủy đăng ký nhiều lần hơn mức cần thiết. Trong những trường hợp như vậy, nên đăng ký lại bằng một lệnh gọi
MarketBookAdd
mới sau một khoảng thời gian chờ được xác định trước (ví dụ, vài chục giây hoặc một phút).
Ví dụ về chỉ báo không bộ đệm MarketBookEvent.mq5
cho phép bạn theo dõi sự xuất hiện của các sự kiện OnBookEvent
và in tên ký hiệu cùng thời gian hiện tại (bộ đếm hệ thống tính bằng mili giây) trong một bình luận. Để rõ ràng, chúng ta sử dụng hàm bình luận nhiều dòng từ tệp Comments.mqh
, phần Hiển thị thông báo trong cửa sổ biểu đồ.
Điều thú vị là nếu bạn để trống tham số đầu vào WorkSymbol
(giá trị mặc định), chỉ báo sẽ không tự khởi tạo đăng ký sổ lệnh nhưng sẽ có thể chặn các tin nhắn được yêu cầu bởi các chương trình MQL khác trên cùng biểu đồ. Hãy kiểm tra điều đó.
#include <MQL5Book/Comments.mqh>
input string WorkSymbol = ""; // WorkSymbol (nếu trống, chặn các sự kiện do chương trình khác khởi tạo)
void OnInit()
{
if(StringLen(WorkSymbol))
{
PRTF(MarketBookAdd(WorkSymbol));
}
else
{
Print("Start listening to OnBookEvent initiated by other programs");
}
}
void OnBookEvent(const string &symbol)
{
ChronoComment(symbol + " " + (string)GetTickCount());
}
void OnDeinit(const int)
{
Comment("");
if(StringLen(WorkSymbol))
{
PRTF(MarketBookRelease(WorkSymbol));
}
}
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
Hãy chạy MarketBookEvent
với cài đặt mặc định (không đăng ký riêng) và sau đó thêm chỉ báo MarketBookAddRelease
từ phần trước, đồng thời chỉ định cho nó một danh sách gồm nhiều ký hiệu có sổ lệnh khả dụng (trong ví dụ dưới đây, đó là "XAUUSD,BTCUSD,USDCNH"). Không quan trọng biểu đồ nào được chạy các chỉ báo: đó có thể là một ký hiệu hoàn toàn khác, như EURUSD.
Ngay sau khi khởi chạy MarketBookEvent
, biểu đồ sẽ trống (không có bình luận) vì chưa có đăng ký nào. Khi MarketBookAddRelease
bắt đầu (ba dòng sẽ xuất hiện trong nhật ký với trạng thái đăng ký thành công bằng true
), tên của các ký hiệu sẽ bắt đầu xuất hiện luân phiên trong các bình luận khi sổ lệnh của chúng được cập nhật (chúng ta chưa học cách đọc sổ lệnh; điều này sẽ được thảo luận trong phần tiếp theo).
Đây là cách nó trông trên màn hình.
Thông báo về thay đổi trong sổ lệnh của các ký hiệu "bên thứ ba"
Nếu bây giờ chúng ta xóa chỉ báo MarketBookAddRelease
, nó sẽ hủy các đăng ký của mình, và bình luận sẽ ngừng cập nhật. Việc xóa tiếp theo của MarketBookEvent
sẽ xóa bình luận.
Xin lưu ý rằng một khoảng thời gian (một hoặc hai giây) trôi qua giữa yêu cầu hủy đăng ký và thời điểm các sự kiện Độ sâu Thị trường thực sự ngừng cập nhật bình luận.
Bạn có thể chạy chỉ báo MarketBookEvent
một mình trên biểu đồ, chỉ định một ký hiệu nào đó trong tham số WorkSymbol
của nó để đảm bảo thông báo hoạt động trong cùng một ứng dụng. MarketBookAddRelease
trước đây chỉ được sử dụng để chứng minh tính chất phát rộng rãi của thông báo. Nói cách khác, việc kích hoạt đăng ký thay đổi sổ lệnh trong một chương trình có ảnh hưởng đến việc nhận thông báo trong chương trình khác.