Các khái niệm cơ bản của lịch
Khi làm việc với lịch, chúng ta sẽ thao tác với một số khái niệm, mà để mô tả chính thức, MQL5 định nghĩa các loại cấu trúc đặc biệt.
Trước hết, các sự kiện liên quan đến các quốc gia cụ thể, và mỗi quốc gia được mô tả bằng cấu trúc MqlCalendarCountry
.
struct MqlCalendarCountry
{
ulong id; // định danh quốc gia theo ISO 3166-1
string name; // tên văn bản của quốc gia (theo mã hóa terminal hiện tại)
string code; // ký hiệu hai chữ cái của quốc gia theo ISO 3166-1 alpha-2
string currency; // mã tiền tệ quốc gia quốc tế
string currency_symbol; // ký hiệu/dấu hiệu của tiền tệ quốc gia
string url_name; // tên quốc gia dùng trong URL trên trang web mql5.com
};
2
3
4
5
6
7
8
9
Cách lấy danh sách các quốc gia có sẵn trong lịch và các thuộc tính của chúng dưới dạng mảng các cấu trúc MqlCalendarCountry
, chúng ta sẽ tìm hiểu trong phần tiếp theo.
Hiện tại, chúng ta chỉ chú ý đến trường id
. Nó quan trọng vì nó là chìa khóa để xác định xem các sự kiện lịch có thuộc về một quốc gia cụ thể hay không. Ở mỗi quốc gia (hoặc một hiệp hội các quốc gia đã đăng ký, như Liên minh Châu Âu), có một danh sách cụ thể, được biết đến trên toàn thế giới về các loại chỉ số kinh tế và sự kiện thông tin ảnh hưởng đến thị trường và do đó được đưa vào lịch.
Mỗi loại sự kiện được định nghĩa bởi cấu trúc MqlCalendarEvent
, trong đó trường country_id
liên kết duy nhất sự kiện với quốc gia. Chúng ta sẽ xem xét các loại liệt kê được sử dụng dưới đây.
struct MqlCalendarEvent
{
ulong id; // ID sự kiện
ENUM_CALENDAR_EVENT_TYPE type; // loại sự kiện
ENUM_CALENDAR_EVENT_SECTOR sector; // lĩnh vực mà sự kiện thuộc về
ENUM_CALENDAR_EVENT_FREQUENCY frequency; // tần suất (chu kỳ) của sự kiện
ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // chế độ thời gian của sự kiện
ulong country_id; // định danh quốc gia
ENUM_CALENDAR_EVENT_UNIT unit; // đơn vị chỉ số
ENUM_CALENDAR_EVENT_IMPORTANCE importance; // tầm quan trọng của sự kiện
ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // hệ số nhân của chỉ số
uint digits; // số chữ số thập phân
string source_url; // URL của nguồn công bố sự kiện
string event_code; // mã sự kiện
string name; // tên văn bản của sự kiện theo ngôn ngữ terminal
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Điều quan trọng là phải hiểu rằng cấu trúc MqlCalendarEvent
mô tả chính xác loại sự kiện (ví dụ, việc công bố Chỉ số Giá Tiêu dùng, CPI) chứ không phải một sự kiện cụ thể có thể xảy ra mỗi quý, mỗi tháng hoặc theo lịch trình khác. Nó chứa các đặc điểm chung của sự kiện, bao gồm tầm quan trọng, tần suất, mối quan hệ với lĩnh vực kinh tế, đơn vị đo lường, tên và nguồn thông tin. Còn về các chỉ số thực tế và dự báo, chúng sẽ được cung cấp trong các mục lịch cho mỗi sự kiện cụ thể của loại này: các mục này được lưu trữ dưới dạng cấu trúc MqlCalendarValue
, sẽ được thảo luận sau. Các hàm để truy vấn các loại sự kiện được hỗ trợ sẽ được giới thiệu trong các phần sau.
Loại sự kiện trong trường type
được chỉ định là một trong những giá trị của liệt kê ENUM_CALENDAR_EVENT_TYPE
.
Định danh | Mô tả |
---|---|
CALENDAR_TYPE_EVENT | Sự kiện (họp, phát biểu, v.v.) |
CALENDAR_TYPE_INDICATOR | Chỉ số kinh tế |
CALENDAR_TYPE_HOLIDAY | Ngày lễ (cuối tuần) |
Lĩnh vực kinh tế mà sự kiện thuộc về được chọn từ liệt kê ENUM_CALENDAR_EVENT_SECTOR
.
Định danh | Mô tả |
---|---|
CALENDAR_SECTOR_NONE | Lĩnh vực không được đặt |
CALENDAR_SECTOR_MARKET | Thị trường, sàn giao dịch |
CALENDAR_SECTOR_GDP | Tổng sản phẩm quốc nội (GDP) |
CALENDAR_SECTOR_JOBS | Thị trường lao động |
CALENDAR_SECTOR_PRICES | Giá cả |
CALENDAR_SECTOR_MONEY | Tiền tệ |
CALENDAR_SECTOR_TRADE | Thương mại |
CALENDAR_SECTOR_GOVERNMENT | Chính phủ |
CALENDAR_SECTOR_BUSINESS | Kinh doanh |
CALENDAR_SECTOR_CONSUMER | Tiêu dùng |
CALENDAR_SECTOR_HOUSING | Nhà ở |
CALENDAR_SECTOR_TAXES | Thuế |
CALENDAR_SECTOR_HOLIDAYS | Ngày lễ |
Tần suất của sự kiện được chỉ định trong trường frequency
bằng cách sử dụng liệt kê ENUM_CALENDAR_EVENT_FREQUENCY
.
Định danh | Mô tả |
---|---|
CALENDAR_FREQUENCY_NONE | Tần suất công bố không được đặt |
CALENDAR_FREQUENCY_WEEK | Hàng tuần |
CALENDAR_FREQUENCY_MONTH | Hàng tháng |
CALENDAR_FREQUENCY_QUARTER | Hàng quý |
CALENDAR_FREQUENCY_YEAR | Hàng năm |
CALENDAR_FREQUENCY_DAY | Hàng ngày |
Thời gian diễn ra sự kiện (time_mode
) có thể được mô tả bằng một trong những phần tử của liệt kê ENUM_CALENDAR_EVENT_TIMEMODE
.
Định danh | Mô tả |
---|---|
CALENDAR_TIMEMODE_DATETIME | Thời gian chính xác của sự kiện được biết |
CALENDAR_TIMEMODE_DATE | Sự kiện kéo dài cả ngày |
CALENDAR_TIMEMODE_NOTIME | Thời gian không được công bố |
CALENDAR_TIMEMODE_TENTATIVE | Chỉ biết trước ngày, nhưng không biết thời gian chính xác của sự kiện (thời gian được xác định sau khi xảy ra) |
Tầm quan trọng của sự kiện được chỉ định trong trường importance
bằng cách sử dụng liệt kê ENUM_CALENDAR_EVENT_IMPORTANCE
.
Định danh | Mô tả |
---|---|
CALENDAR_IMPORTANCE_NONE | Không được đặt |
CALENDAR_IMPORTANCE_LOW | Thấp |
CALENDAR_IMPORTANCE_MODERATE | Trung bình |
CALENDAR_IMPORTANCE_HIGH | Cao |
Đơn vị đo lường mà giá trị sự kiện được đưa ra được định nghĩa trong trường unit
như một thành viên của liệt kê ENUM_CALENDAR_EVENT_UNIT
.
Định danh | Mô tả |
---|---|
CALENDAR_UNIT_NONE | Đơn vị không được đặt |
CALENDAR_UNIT_PERCENT | Phần trăm (%) |
CALENDAR_UNIT_CURRENCY | Tiền tệ quốc gia |
CALENDAR_UNIT_HOUR | Số giờ |
CALENDAR_UNIT_JOB | Số lượng việc làm |
CALENDAR_UNIT_RIG | Giàn khoan |
CALENDAR_UNIT_USD | Đô la Mỹ |
CALENDAR_UNIT_PEOPLE | Số lượng người |
CALENDAR_UNIT_MORTGAGE | Số lượng khoản vay thế chấp |
CALENDAR_UNIT_VOTE | Số lượng phiếu bầu |
CALENDAR_UNIT_BARREL | Số lượng tính bằng thùng |
CALENDAR_UNIT_CUBICFEET | Thể tích tính bằng feet khối |
CALENDAR_UNIT_POSITION | Khối lượng ròng của các vị thế đầu cơ trong hợp đồng |
CALENDAR_UNIT_BUILDING | Số lượng tòa nhà |
Trong một số trường hợp, giá trị của một chỉ số kinh tế yêu cầu một multiplier
theo một trong những phần tử của liệt kê ENUM_CALENDAR_EVENT_MULTIPLIER
.
Định danh | Mô tả |
---|---|
CALENDAR_MULTIPLIER_NONE | Hệ số nhân không được đặt |
CALENDAR_MULTIPLIER_THOUSANDS | Nghìn |
CALENDAR_MULTIPLIER_MILLIONS | Triệu |
CALENDAR_MULTIPLIER_BILLIONS | Tỷ |
CALENDAR_MULTIPLIER_TRILLIONS | Nghìn tỷ |
Vậy là chúng ta đã xem xét tất cả các loại dữ liệu đặc biệt được sử dụng để mô tả các loại sự kiện trong cấu trúc MqlCalendarEvent
.
Một mục lịch riêng biệt được hình thành dưới dạng cấu trúc MqlCalendarValue
. Mô tả chi tiết của nó được đưa ra dưới đây, nhưng hiện tại, cần chú ý đến sắc thái sau. MqlCalendarValue
có trường event_id
trỏ đến định danh của loại sự kiện, tức là chứa một trong những id
hiện có trong các cấu trúc MqlCalendarEvent
.
Như chúng ta đã thấy ở trên, cấu trúc MqlCalendarEvent
lần lượt liên quan đến MqlCalendarCountry
qua trường country_id
. Do đó, sau khi nhập thông tin về một quốc gia cụ thể hoặc loại sự kiện vào cơ sở dữ liệu lịch, có thể đăng ký một số lượng tùy ý các sự kiện tương tự cho chúng. Tất nhiên, nhà cung cấp thông tin chịu trách nhiệm điền vào cơ sở dữ liệu, không phải các nhà phát triển.
Hãy tóm tắt lại: hệ thống lưu trữ ba bảng nội bộ riêng biệt:
- Bảng cấu trúc
MqlCalendarCountry
để mô tả các quốc gia - Bảng cấu trúc
MqlCalendarEvent
với mô tả các loại sự kiện - Bảng cấu trúc
MqlCalendarValue
với các chỉ số của các sự kiện cụ thể thuộc nhiều loại khác nhau
Bằng cách tham chiếu đến các định danh loại sự kiện, việc trùng lặp thông tin được loại bỏ khỏi các bản ghi của các sự kiện cụ thể. Ví dụ, các công bố CPI hàng tháng chỉ tham chiếu đến cùng một cấu trúc MqlCalendarEvent
với các đặc điểm chung của loại sự kiện này. Nếu không có các bảng khác nhau, sẽ cần phải lặp lại các thuộc tính tương tự trong mỗi mục lịch CPI. Cách tiếp cận này để thiết lập mối quan hệ giữa các bảng với dữ liệu bằng cách sử dụng các trường định danh được gọi là relational
, và chúng ta sẽ quay lại điều này trong chương về SQLite. Tất cả điều này được minh họa trong sơ đồ sau.
Sơ đồ liên kết giữa các cấu trúc qua các trường định danh
Tất cả các bảng được lưu trữ trong cơ sở dữ liệu lịch nội bộ, được liên tục cập nhật trong khi terminal được kết nối với máy chủ.
Các mục lịch (các sự kiện cụ thể) là các cấu trúc MqlCalendarValue
. Chúng cũng được xác định bởi số duy nhất của riêng mình trong trường id
(mỗi bảng trong ba bảng có trường id
riêng).
struct MqlCalendarValue
{
ulong id; // ID mục
ulong event_id; // ID loại sự kiện
datetime time; // thời gian và ngày của sự kiện
datetime period; // kỳ báo cáo của sự kiện
int revision; // bản sửa đổi của chỉ số đã công bố liên quan đến kỳ báo cáo
long actual_value; // giá trị thực tế tính bằng ppm hoặc LONG_MIN
long prev_value; // giá trị trước đó tính bằng ppm hoặc LONG_MIN
long revised_prev_value; // giá trị trước đó đã sửa đổi tính bằng ppm hoặc LONG_MIN
long forecast_value; // giá trị dự báo tính bằng ppm hoặc LONG_MIN
ENUM_CALENDAR_EVENT_IMPACT impact_type; // tác động tiềm tàng đến tỷ giá hối đoái
// các hàm kiểm tra giá trị
bool HasActualValue(void) const; // true nếu trường actual_value được điền
bool HasPreviousValue(void) const; // true nếu trường prev_value được điền
bool HasRevisedValue(void) const; // true nếu trường revised_prev_value được điền
bool HasForecastValue(void) const; // true nếu trường forecast_value được điền
// các hàm lấy giá trị
double GetActualValue(void) const; // actual_value hoặc nan nếu giá trị không được đặt
double GetPreviousValue(void) const; // prev_value hoặc nan nếu giá trị không được đặt
double GetRevisedValue(void) const; // revised_prev_value hoặc nan nếu giá trị không được đặt
double GetForecastValue(void) const; // forecast_value hoặc nan nếu giá trị không được đặt
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Đối với mỗi sự kiện, ngoài thời gian công bố (time
), bốn giá trị sau cũng được lưu trữ:
- Giá trị thực tế (
actual_value
), được biết ngay sau khi tin tức được công bố - Giá trị trước đó (
prev_value
), được biết trong lần phát hành cuối cùng của cùng tin tức - Giá trị sửa đổi của chỉ số trước đó,
revised_prev_value
(nếu nó đã được sửa đổi kể từ lần công bố cuối cùng) - Giá trị dự báo (
forecast_value
)
Rõ ràng, không phải tất cả các trường đều phải được điền. Vì vậy, giá trị hiện tại không có (chưa được biết) đối với các sự kiện tương lai, và việc sửa đổi các giá trị quá khứ cũng không luôn xảy ra. Ngoài ra, cả bốn trường chỉ có ý nghĩa đối với các chỉ số định lượng, trong khi lịch cũng phản ánh các bài phát biểu của cơ quan quản lý, cuộc họp và ngày lễ.
Một trường trống (không có giá trị) được biểu thị bằng hằng số LONG_MIN
(-9223372036854775808). Nếu giá trị trong trường được chỉ định (không bằng LONG_MIN
), thì nó tương ứng với giá trị thực của chỉ số tăng lên một triệu lần, tức là để có được chỉ số ở dạng thông thường (thực), cần chia giá trị trường cho 1,000,000.
Để thuận tiện cho lập trình viên, cấu trúc định nghĩa 4 phương thức Has
để kiểm tra trường có được điền hay không, cũng như 4 phương thức Get
trả về giá trị của trường tương ứng đã được chuyển đổi thành số thực, và trong trường hợp nó không được điền, phương thức sẽ trả về NaN (Not A Number).
Đôi khi, để có được các giá trị tuyệt đối (nếu chúng cần cho thuật toán), điều quan trọng là phải phân tích thêm thuộc tính multiplier
trong cấu trúc MqlCalendarEvent
vì một số giá trị được chỉ định ở đơn vị nhân theo liệt kê ENUM_CALENDAR_EVENT_MULTIPLIER
. Ngoài ra, MqlCalendarEvent
có trường digits
, xác định số chữ số có nghĩa trong các giá trị nhận được để định dạng chính xác sau đó (ví dụ, trong lệnh gọi đến NormalizeDouble
).
Kỳ báo cáo (mà chỉ số được công bố được tính toán) được đặt trong trường period
dưới dạng ngày đầu tiên của nó. Ví dụ, nếu chỉ số được tính hàng tháng, thì ngày '2022.05.01 00:00:00' có nghĩa là tháng Năm. Thời gian của kỳ (ví dụ, tháng, quý, năm) được định nghĩa trong trường frequency
của cấu trúc liên quan MqlCalendarEvent
: loại của trường này là liệt kê đặc biệt ENUM_CALENDAR_EVENT_FREQUENCY
đã được mô tả ở trên, cùng với các liệt kê khác.
Trường impact_type
đặc biệt thú vị, trong đó, sau khi tin tức được phát hành, hướng ảnh hưởng của đồng tiền tương ứng đến tỷ giá được tự động đặt bằng cách so sánh giá trị hiện tại và dự báo. Ảnh hưởng này có thể là tích cực (đồng tiền được kỳ vọng sẽ tăng giá) hoặc tiêu cực (đồng tiền được kỳ vọng sẽ giảm giá). Ví dụ, mức giảm doanh số lớn hơn dự kiến sẽ được gắn nhãn là có tác động tiêu cực, và mức giảm thất nghiệp lớn hơn là tích cực. Nhưng đặc điểm này không được diễn giải một cách rõ ràng cho tất cả các sự kiện (một số chỉ số kinh tế được coi là mâu thuẫn), và ngoài ra, cần chú ý đến các con số thay đổi tương đối.
Tác động tiềm tàng của một sự kiện đến tỷ giá tiền tệ quốc gia được chỉ định bằng cách sử dụng liệt kê ENUM_CALENDAR_EVENT_IMPACT
.
Định danh | Mô tả |
---|---|
CALENDAR_IMPACT_NA | Ảnh hưởng không được nêu |
CALENDAR_IMPACT_POSITIVE | Ảnh hưởng tích cực |
CALENDAR_IMPACT_NEGATIVE | Ảnh hưởng tiêu cực |
Một khái niệm quan trọng khác của lịch là sự thay đổi của nó. Thật không may, không có cấu trúc đặc biệt cho sự thay đổi. Thuộc tính duy nhất mà một sự thay đổi có là ID duy nhất của nó, là một số nguyên được hệ thống gán mỗi khi cơ sở dữ liệu lịch nội bộ thay đổi.
Như bạn đã biết, lịch liên tục được sửa đổi bởi các nhà cung cấp thông tin: các sự kiện sắp tới mới được thêm vào, và các chỉ số và dự báo đã công bố được điều chỉnh. Do đó, rất quan trọng để theo dõi bất kỳ chỉnh sửa nào, sự xuất hiện của chúng cho phép phát hiện các số thay đổi tăng định kỳ.
Thời gian chỉnh sửa với một định danh cụ thể và bản chất của nó không có sẵn trong MQL5. Nếu cần, các chương trình MQL nên tự thực hiện các truy vấn trạng thái lịch định kỳ và phân tích bản ghi.
Một tập hợp các hàm MQL5 cho phép lấy thông tin về các quốc gia, loại sự kiện và các mục lịch cụ thể, cũng như các thay đổi của chúng. Chúng ta sẽ xem xét điều này trong các phần tiếp theo.
Chú ý! Khi truy cập lịch lần đầu tiên (nếu tab Lịch trong thanh công cụ terminal chưa được mở trước đó), có thể mất vài giây để đồng bộ cơ sở dữ liệu lịch nội bộ với máy chủ.