Kiểm tra tính cập nhật của dữ liệu ký hiệu
Do kiến trúc phân tán client-server, dữ liệu của client và server đôi khi có thể khác nhau. Ví dụ, điều này có thể xảy ra ngay sau khi bắt đầu phiên terminal, khi mất kết nối, hoặc khi tài nguyên máy tính bị tải nặng. Ngoài ra, ký hiệu có thể sẽ không đồng bộ trong một khoảng thời gian ngay sau khi được thêm vào Market Watch. API MQL5 cho phép bạn kiểm tra tính cập nhật của dữ liệu báo giá cho một ký hiệu cụ thể bằng hàm SymbolIsSynchronized
.
bool SymbolIsSynchronized(const string name)
Hàm trả về true
nếu dữ liệu cục bộ về ký hiệu có tên name
được đồng bộ với dữ liệu trên máy chủ giao dịch.
Phần Lấy đặc điểm của mảng giá, trong số các thuộc tính chuỗi thời gian khác, đã giới thiệu thuộc tính SERIES_SYNCHRONIZED, trả về một thuộc tính đồng bộ có ý nghĩa hẹp hơn: nó áp dụng cho một sự kết hợp cụ thể giữa ký hiệu và khung thời gian. Ngược lại với thuộc tính này, hàm SymbolIsSynchronized
trả về thuộc tính đồng bộ của lịch sử tổng quát cho một ký hiệu.
Việc xây dựng tất cả các khung thời gian chỉ bắt đầu sau khi hoàn tất việc tải lịch sử. Do kiến trúc đa luồng và tính toán song song trong terminal, có thể xảy ra trường hợp SymbolIsSynchronized
trả về true
, trong khi thuộc tính SERIES_SYNCHRONIZED cho một khung thời gian trên cùng ký hiệu tạm thời bằng false
.
Hãy xem hàm mới hoạt động như thế nào trong chỉ báo SymbolListSync.mq5
. Nó được thiết kế để định kỳ kiểm tra tất cả các ký hiệu từ Market Watch
về sự đồng bộ. Chu kỳ kiểm tra được người dùng đặt bằng giây trong tham số SyncCheckupPeriod
. Nó kích hoạt bộ đếm thời gian bắt đầu trong OnInit
.
#property indicator_chart_window
#property indicator_plots 0
input int SyncCheckupPeriod = 1; // Chu kỳ kiểm tra đồng bộ (giây)
void OnInit()
{
EventSetTimer(SyncCheckupPeriod);
}
2
3
4
5
6
7
8
9
Trong trình xử lý OnTimer
, trong một vòng lặp, chúng ta gọi SymbolIsSynchronized
và thu thập tất cả các ký hiệu không đồng bộ vào một chuỗi chung, sau đó chúng được hiển thị trong phần bình luận và nhật ký.
void OnTimer()
{
string unsynced;
const int n = SymbolsTotal(true);
// kiểm tra tất cả các ký hiệu trong Market Watch
for(int i = 0; i < n; ++i)
{
const string s = SymbolName(i, true);
if(!SymbolIsSynchronized(s))
{
unsynced += s + "\n";
}
}
if(StringLen(unsynced) > 0)
{
Comment("Unsynced symbols:\n" + unsynced);
Print("Unsynced symbols:\n" + unsynced);
}
else
{
Comment("All Market Watch is in sync");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Ví dụ, nếu chúng ta thêm một ký hiệu trước đó chưa có (Brent) vào Market Watch
, chúng ta sẽ nhận được một mục như sau:
Unsynced symbols:
Brent
2
Trong điều kiện bình thường, hầu hết thời gian (trong khi chỉ báo đang chạy) không nên có các thông báo như vậy trong nhật ký. Tuy nhiên, một loạt cảnh báo có thể được tạo ra trong các vấn đề về kết nối.