Lấy bản ghi sự kiện theo loại cụ thể
Nếu cần, một chương trình MQL có khả năng yêu cầu các sự kiện thuộc một loại cụ thể: để làm điều này, chỉ cần biết trước định danh sự kiện, ví dụ, sử dụng các hàm CalendarEventByCountry
hoặc CalendarEventByCurrency
đã được giới thiệu trong phần Truy vấn các loại sự kiện theo quốc gia và tiền tệ.
int CalendarValueHistoryByEvent(ulong id, MqlCalendarValue &values[], datetime from, datetime to = 0)
Hàm CalendarValueHistoryByEvent
điền vào mảng được truyền bằng tham chiếu với các bản ghi của sự kiện thuộc loại cụ thể được chỉ định bởi định danh id
. Các tham số from
và to
cho phép bạn giới hạn phạm vi ngày mà các sự kiện được tìm kiếm.
Nếu tham số tùy chọn to
không được chỉ định, tất cả các mục lịch sẽ được đặt vào mảng, bắt đầu từ thời điểm from
và tiếp tục vào tương lai. Để truy vấn tất cả các sự kiện trong quá khứ, đặt from
thành 0. Nếu cả hai tham số from
và to
đều là 0, toàn bộ lịch sử và các sự kiện đã lên lịch sẽ được trả về. Trong tất cả các trường hợp khác, khi to
không bằng 0, nó phải lớn hơn from
.
Mảng values
có thể là động (sau đó hàm sẽ tự động mở rộng hoặc thu nhỏ nó theo lượng dữ liệu) hoặc có kích thước cố định (sau đó chỉ một phần phù hợp sẽ được sao chép vào mảng).
Hàm trả về số lượng phần tử được sao chép.
Ví dụ, hãy xem xét kịch bản CalendarStatsByEvent.mq5
, tính toán thống kê (tần suất xuất hiện) của các sự kiện thuộc các loại khác nhau cho một quốc gia hoặc tiền tệ cụ thể trong một khoảng thời gian nhất định.
Các điều kiện phân tích được chỉ định trong các biến đầu vào.
input string CountryOrCurrency = "EU";
input ENUM_CALENDAR_SCOPE Scope = SCOPE_YEAR;
2
Tùy thuộc vào độ dài của chuỗi CountryOrCurrency
, nó được diễn giải là mã quốc gia (2 ký tự) hoặc mã tiền tệ (3 ký tự).
Để thu thập thống kê, chúng ta sẽ khai báo một cấu trúc; các trường của nó sẽ lưu trữ định danh và tên của loại sự kiện, mức độ quan trọng của nó, và bộ đếm số lượng sự kiện như vậy.
struct CalendarEventStats
{
static const string importances[];
ulong id;
string name;
string importance;
int count;
};
static const string CalendarEventStats::importances[] = {"None", "Low", "Medium", "High"};
2
3
4
5
6
7
8
9
10
Trong hàm OnStart
, đầu tiên chúng ta yêu cầu tất cả các loại sự kiện bằng hàm CalendarEventByCountry
hoặc CalendarEventByCurrency
đến độ sâu lịch sử đã chỉ định và vào tương lai, sau đó, trong một vòng lặp qua các mô tả sự kiện nhận được trong mảng events
, chúng ta gọi CalendarValueHistoryByEvent
cho mỗi ID sự kiện. Trong ứng dụng này, chúng ta không quan tâm đến nội dung của mảng values
, vì chúng ta chỉ cần biết số lượng của chúng.
void OnStart()
{
MqlCalendarEvent events[];
MqlCalendarValue values[];
CalendarEventStats stats[];
const datetime from = TimeCurrent() - Scope;
const datetime to = TimeCurrent() + Scope;
if(StringLen(CountryOrCurrency) == 2)
{
PRTF(CalendarEventByCountry(CountryOrCurrency, events));
}
else
{
PRTF(CalendarEventByCurrency(CountryOrCurrency, events));
}
for(int i = 0; i < ArraySize(events); ++i)
{
if(CalendarValueHistoryByEvent(events[i].id, values, from, to))
{
CalendarEventStats event = {events[i].id, events[i].name,
CalendarEventStats::importances[events[i].importance], ArraySize(values)};
PUSH(stats, event);
}
}
SORT_STRUCT(CalendarEventStats, stats, count);
ArrayReverse(stats);
ArrayPrint(stats);
}
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
30
31
32
Khi hàm được gọi thành công, chúng ta điền vào cấu trúc CalendarEventStats
và thêm nó vào mảng cấu trúc stats
. Tiếp theo, chúng ta sắp xếp cấu trúc theo cách đã biết (macro SORT_STRUCT được mô tả trong phần So sánh, sắp xếp và tìm kiếm trong mảng).
Chạy kịch bản với cài đặt mặc định tạo ra một thứ gì đó như thế này trong nhật ký (đã rút gọn).
CalendarEventByCountry(CountryOrCurrency,events)=82 / ok
[id] [name] [importance] [count]
[ 0] 999520001 "CFTC EUR Non-Commercial Net Positions" "Low" 79
[ 1] 999010029 "ECB President Lagarde Speech" "High" 69
[ 2] 999010035 "ECB Executive Board Member Elderson Speech" "Medium" 37
[ 3] 999030027 "Core CPI" "Low" 36
[ 4] 999030026 "CPI" "Low" 36
[ 5] 999030025 "CPI excl. Energy and Unprocessed Food y/y" "Low" 36
[ 6] 999030024 "CPI excl. Energy and Unprocessed Food m/m" "Low" 36
[ 7] 999030010 "Core CPI m/m" "Medium" 36
[ 8] 999030013 "CPI y/y" "Low" 36
[ 9] 999030012 "Core CPI y/y" "Low" 36
[10] 999040006 "Consumer Confidence Index" "Low" 36
[11] 999030011 "CPI m/m" "Medium" 36
...
[65] 999010008 "ECB Economic Bulletin" "Medium" 8
[66] 999030023 "Wage Costs y/y" "Medium" 6
[67] 999030009 "Labour Cost Index" "Low" 6
[68] 999010025 "ECB Bank Lending Survey" "Low" 6
[69] 999010030 "ECB Supervisory Board Member af Jochnick Speech" "Medium" 4
[70] 999010022 "ECB Supervisory Board Member Hakkarainen Speech" "Medium" 3
[71] 999010028 "ECB Financial Stability Review" "Medium" 3
[72] 999010009 "ECB Targeted LTRO" "Medium" 2
[73] 999010036 "ECB Supervisory Board Member Tuominen Speech" "Medium" 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Vui lòng lưu ý rằng tổng cộng 82 loại sự kiện đã được nhận, tuy nhiên, trong mảng thống kê, chúng ta chỉ có 74. Điều này là do hàm CalendarValueHistoryByEvent
trả về false
(thất bại) và mã lỗi bằng không trong _LastError
nếu không có sự kiện nào thuộc bất kỳ loại nào trong khoảng thời gian đã chỉ định. Trong bài kiểm tra trên, có 8 mục như vậy tồn tại về mặt lý thuyết nhưng không bao giờ xuất hiện trong vòng một năm.