Các hàm làm việc với thời gian
Thời gian là một yếu tố cơ bản trong hầu hết các quá trình và đóng vai trò quan trọng trong giao dịch.
Như chúng ta đã biết, hệ tọa độ chính trong giao dịch dựa trên hai chiều: giá và thời gian. Chúng được hiển thị trên biểu đồ theo trục dọc và trục ngang tương ứng. Sau này, chúng ta sẽ đề cập đến một trục quan trọng khác, có thể được xem như vuông góc với hai trục đầu tiên và đi sâu vào biểu đồ, nơi các khối lượng giao dịch được đánh dấu. Nhưng hiện tại, hãy tập trung vào thời gian.
Đơn vị đo lường này phổ biến cho tất cả các biểu đồ, sử dụng cùng một đơn vị đo, và dù nghe có vẻ kỳ lạ, nó được đặc trưng bởi tính liên tục (dòng chảy của thời gian là có thể dự đoán được).
Terminal cung cấp rất nhiều công cụ tích hợp liên quan đến việc tính toán và phân tích thời gian. Vì vậy, chúng ta sẽ làm quen với chúng dần dần, khi đi qua các chương của cuốn sách, từ đơn giản đến phức tạp.
Trong chương này, chúng ta sẽ nghiên cứu các hàm cho phép kiểm soát thời gian và tạm dừng hoạt động của chương trình trong một khoảng thời gian xác định.
Trong chương Ngày và giờ, ở phần biến đổi dữ liệu, chúng ta đã thấy một vài hàm liên quan đến thời gian: TimeToStruct
và StructToTime
. Chúng chia nhỏ một giá trị kiểu datetime
thành các thành phần hoặc ngược lại, xây dựng datetime
từ các trường riêng lẻ: hãy nhớ rằng chúng được tổng hợp trong cấu trúc MqlDateTime
.
struct MqlDateTime
{
int year; // năm (1970 – 3000)
int mon; // tháng (1 – 12)
int day; // ngày (1 – 31)
int hour; // giờ (0 – 23)
int min; // phút (0 – 59)
int sec; // giây (0 – 59)
int day_of_week; // ngày trong tuần, đánh số từ 0 (Chủ nhật) đến 6 (Thứ bảy)
// theo enum ENUM_DAY_OF_WEEK
int day_of_year; // số thứ tự của ngày trong năm, bắt đầu từ 0 (1 tháng 1)
};
2
3
4
5
6
7
8
9
10
11
12
Nhưng một chương trình MQL có thể lấy giá trị datetime
từ đâu?
Ví dụ, giá và thời gian lịch sử được phản ánh trong các báo giá, trong khi dữ liệu trực tiếp hiện tại đến dưới dạng các tick. Cả hai đều có dấu thời gian, mà chúng ta sẽ học cách lấy trong các phần liên quan: về chuỗi thời gian và sự kiện terminal. Tuy nhiên, một chương trình MQL có thể tự truy vấn thời gian hiện tại (không kèm giá hoặc thông tin giao dịch khác) bằng cách sử dụng một số hàm.
Việc cần nhiều hàm là do hệ thống được phân phối: nó bao gồm một terminal khách hàng và một máy chủ môi giới nằm ở các phần bất kỳ trên thế giới, rất có thể thuộc về các múi giờ khác nhau.
Bất kỳ múi giờ nào cũng được đặc trưng bởi một độ lệch tạm thời so với điểm tham chiếu toàn cầu của thời gian, Giờ Trung bình Greenwich (GMT). Theo quy tắc, độ lệch múi giờ là một số giờ nguyên N (mặc dù cũng có các múi giờ đặc biệt với bước nửa giờ), và do đó nó được biểu thị là GMT + N hoặc GMT-N, tùy thuộc vào việc múi giờ nằm ở phía đông hay phía tây của kinh tuyến. Ví dụ, châu Âu lục địa, nằm ở phía đông London, sử dụng Giờ Trung Âu (CET) bằng GMT + 1, hoặc Giờ Đông Âu (EET) bằng GMT + 2, trong khi ở Mỹ có các múi giờ "âm", chẳng hạn như Giờ Chuẩn Miền Đông (EST) hoặc GMT-5.
Lưu ý
Cần lưu ý rằng GMT tương ứng với thời gian thiên văn (mặt trời), vốn hơi phi tuyến tính vì tốc độ quay của Trái Đất đang dần chậm lại. Liên quan đến điều này, trong vài thập kỷ gần đây, thực tế đã chuyển sang một hệ thống đo thời gian chính xác hơn (dựa trên đồng hồ nguyên tử), trong đó thời gian toàn cầu được gọi là Giờ Phối hợp Quốc tế (UTC).
Trong nhiều lĩnh vực ứng dụng, bao gồm giao dịch, sự khác biệt giữa GMT và UTC không đáng kể, vì vậy các ký hiệu múi giờ theo định dạng mới UTC±N và định dạng cũ GMT±N nên được coi là tương đương. Ví dụ, nhiều nhà môi giới đã chỉ định thời gian phiên trong UTC trong thông số kỹ thuật của họ, trong khi API MQL5 theo truyền thống sử dụng ký hiệu GMT.
API MQL5 cho phép bạn tìm ra thời gian hiện tại của terminal (thực tế là thời gian cục bộ của máy tính) và thời gian máy chủ: chúng được trả về bởi các hàm TimeLocal
và TimeCurrent
, tương ứng. Ngoài ra, một chương trình MQL có thể lấy thời gian GMT hiện tại (hàm TimeGMT
) dựa trên cài đặt múi giờ của Windows. Do đó, nhà giao dịch và lập trình viên có được sự liên kết giữa thời gian cục bộ với thời gian toàn cầu, và qua sự khác biệt giữa thời gian cục bộ và thời gian máy chủ, người ta có thể xác định "múi giờ" của máy chủ và các báo giá. Nhưng có một vài điểm thú vị ở đây.
Thứ nhất, ở nhiều quốc gia, có thực tiễn chuyển sang Giờ Tiết kiệm Ánh sáng Ban ngày (DST). Thông thường, điều này có nghĩa là cộng thêm 1 giờ vào thời gian tiêu chuẩn (mùa đông) từ khoảng tháng 3/tháng 4 đến tháng 10/tháng 11 (ở bán cầu bắc, ở bán cầu nam thì ngược lại). Đồng thời, thời gian GMT/UTC luôn giữ nguyên, tức là không chịu sự điều chỉnh DST, và do đó có thể xảy ra các trường hợp hội tụ/ расхождение khác nhau giữa thời gian khách hàng và máy chủ:
- Ngày chuyển đổi có thể khác nhau giữa các quốc gia
- Một số quốc gia không áp dụng giờ tiết kiệm ánh sáng ban ngày
Vì lý do này, một số chương trình MQL cần theo dõi các thay đổi múi giờ như vậy nếu các thuật toán dựa trên tham chiếu đến thời gian trong ngày (ví dụ, phát hành tin tức) chứ không phải chuyển động giá hoặc tập trung khối lượng.
Và nếu việc dịch thời gian trên máy tính của người dùng khá dễ xác định, nhờ hàm TimeDaylightSavings
, thì không có sẵn một hàm tương tự cho thời gian máy chủ.
Thứ hai, trình kiểm tra MetaTrader 5 thông thường, nơi chúng ta có thể gỡ lỗi hoặc đánh giá các chương trình MQL như Expert Advisors và chỉ báo, đáng tiếc là không mô phỏng thời gian của máy chủ giao dịch. Thay vào đó, cả ba hàm trên TimeLocal
, TimeGMT
, và TimeCurrent
sẽ trả về cùng một thời gian, tức là múi giờ luôn là GMT một cách ảo.
INFO
Thời gian tuyệt đối và tương đối
Việc tính toán thời gian trong các thuật toán, cũng như trong cuộc sống, có thể được thực hiện theo tọa độ tuyệt đối hoặc tương đối. Mọi khoảnh khắc trong quá khứ, hiện tại và tương lai được mô tả bằng một giá trị tuyệt đối mà chúng ta có thể tham chiếu để chỉ ra thời điểm bắt đầu của một kỳ kế toán hoặc thời điểm phát hành tin tức kinh tế. Chính thời gian này được lưu trữ trong MQL5 bằng kiểu datetime
. Đồng thời, thường cần nhìn vào tương lai hoặc lùi lại quá khứ một số đơn vị thời gian nhất định từ thời điểm hiện tại. Trong trường hợp này, chúng ta không quan tâm đến giá trị tuyệt đối, mà đến khoảng thời gian.
Cụ thể, các thuật toán có khái niệm về thời gian chờ (timeout), đó là khoảng thời gian mà một hành động nhất định phải được thực hiện, và nếu nó không được thực hiện vì bất kỳ lý do gì, chúng ta hủy bỏ và ngừng chờ kết quả (vì có lẽ đã xảy ra sự cố). Bạn có thể đo khoảng thời gian bằng các đơn vị khác nhau: giờ, giây, mili giây, hoặc thậm chí micro giây (xét cho cùng, máy tính hiện nay rất nhanh).
Trong MQL5, một số hàm liên quan đến thời gian làm việc với giá trị tuyệt đối (ví dụ, TimeLocal
, TimeCurrent
), và một phần với khoảng thời gian (ví dụ, GetTickCount
, GetMicrosecondCount
).
Tuy nhiên, việc đo khoảng thời gian hoặc kích hoạt chương trình theo các khoảng thời gian xác định không chỉ có thể được thực hiện thông qua các hàm từ phần này mà còn bằng cách sử dụng các bộ đếm thời gian tích hợp hoạt động theo nguyên tắc quen thuộc của đồng hồ báo thức. Khi được bật, chúng sử dụng các sự kiện đặc biệt để thông báo cho các chương trình MQL và các hàm mà chúng ta triển khai để xử lý các sự kiện này — OnTimer
(chúng tương tự như OnStart
). Chúng ta sẽ đề cập đến khía cạnh quản lý thời gian này trong một phần riêng, sau khi nghiên cứu khái niệm chung về sự kiện trong MQL5 (xem Tổng quan về các hàm xử lý sự kiện).