Bộ đếm thời gian độ chính xác cao: EventSetMillisecondTimer
Nếu chương trình của bạn yêu cầu bộ đếm thời gian kích hoạt thường xuyên hơn 1 giây, thay vì EventSetTimer
, hãy sử dụng hàm EventSetMillisecondTimer
.
Các bộ đếm thời gian với đơn vị khác nhau không thể được khởi động cùng lúc: phải sử dụng một trong hai hàm. Loại bộ đếm thời gian thực sự đang chạy được xác định bởi hàm nào được gọi sau cùng. Tất cả các tính năng vốn có của bộ đếm thời gian tiêu chuẩn vẫn hợp lệ cho bộ đếm thời gian độ chính xác cao.
bool EventSetMillisecondTimer(int milliseconds)
Hàm này thông báo cho terminal khách hàng rằng cần tạo các sự kiện bộ đếm thời gian cho Expert Advisor hoặc chỉ báo này với tần suất dưới một giây. Chu kỳ được đặt bằng mili giây (tham số milliseconds
).
Hàm trả về dấu hiệu thành công (true
) hoặc lỗi (false
).
Khi làm việc trong trình kiểm tra chiến lược, hãy nhớ rằng chu kỳ bộ đếm thời gian càng ngắn, việc kiểm tra sẽ càng mất nhiều thời gian, vì số lượng cuộc gọi đến trình xử lý sự kiện bộ đếm thời gian tăng lên.
Trong quá trình hoạt động bình thường, các sự kiện bộ đếm thời gian được tạo không quá một lần mỗi 10-16 mili giây, điều này là do giới hạn phần cứng.
Để minh họa cách làm việc với bộ đếm thời gian mili giây, hãy mở rộng ví dụ chỉ báo MultipleTimers.mq5
. Vì việc kích hoạt bộ đếm thời gian toàn cục được để lại cho chương trình ứng dụng, chúng ta có thể dễ dàng thay đổi loại bộ đếm thời gian mà không thay đổi các lớp bộ đếm thời gian logic. Điểm khác biệt duy nhất là các bội số của chúng sẽ được áp dụng cho chu kỳ cơ bản tính bằng mili giây mà chúng ta sẽ chỉ định trong hàm EventSetMillisecondTimer
.
Để chọn loại bộ đếm thời gian, chúng ta sẽ mô tả một liệt kê và thêm một biến đầu vào mới.
enum TIMER_TYPE
{
Seconds,
Milliseconds
};
input TIMER_TYPE TimerType = Seconds;
2
3
4
5
6
7
Theo mặc định, chúng ta sử dụng bộ đếm thời gian giây. Trong OnInit
, khởi động bộ đếm thời gian loại cần thiết.
void OnInit()
{
Print(__FUNCSIG__, " ", BaseTimerPeriod, " ", EnumToString(TimerType));
if(TimerType == Seconds)
{
EventSetTimer(BaseTimerPeriod);
}
else
{
EventSetMillisecondTimer(BaseTimerPeriod);
}
}
2
3
4
5
6
7
8
9
10
11
12
Hãy xem điều gì sẽ được hiển thị trong nhật ký khi chọn bộ đếm thời gian mili giây.
// time ms
17:27:54.483 void OnInit() 1 Milliseconds |
17:27:54.514 void MyCountableTimer::notify()2 0 | +31
17:27:54.545 bool OnTimer3() | +31
17:27:54.561 void MyCountableTimer::notify()2 1 | +16
17:27:54.561 void MyCountableTimer::notify()4 0 |
17:27:54.577 bool OnTimer5() | +16
17:27:54.608 void MyCountableTimer::notify()2 2 | +31
17:27:54.608 bool OnTimer3() |
17:27:54.608 void MySuspendedTimer::notify()1 0 |
17:27:54.623 void MySuspendedTimer::notify()1 1 | +15
17:27:54.655 void MyCountableTimer::notify()2 3 | +32
17:27:54.655 void MyCountableTimer::notify()4 1 |
17:27:54.655 void MySuspendedTimer::notify()1 2 |
17:27:54.670 bool OnTimer3() | +15
17:27:54.670 void MySuspendedTimer::notify()1 3 |
17:27:54.686 void MyCountableTimer::notify()2 4 | +16
17:27:54.686 void MySuspendedTimer::notify()1 4 |
17:27:54.686 Forcing all timers to stop |
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Trình tự tạo sự kiện hoàn toàn giống với những gì chúng ta đã thấy đối với bộ đếm thời gian giây, nhưng mọi thứ diễn ra nhanh hơn nhiều, gần như ngay lập tức.
Do độ chính xác của bộ đếm thời gian hệ thống bị giới hạn trong khoảng vài chục mili giây, khoảng thời gian thực tế giữa các sự kiện vượt xa mức 1 mili giây không thể đạt được. Ngoài ra, có sự phân tán về kích thước của một "bước". Vì vậy, ngay cả khi sử dụng bộ đếm thời gian mili giây, nên tránh sử dụng các chu kỳ nhỏ hơn vài chục mili giây.