Lấy bản ghi sự kiện theo quốc gia hoặc tiền tệ
Các sự kiện cụ thể thuộc nhiều loại khác nhau được truy vấn trong lịch cho một khoảng thời gian nhất định và được lọc theo quốc gia hoặc tiền tệ.
int CalendarValueHistory(MqlCalendarValue &values[], datetime from, datetime to = 0, const string country = NULL, const string currency = NULL)
Hàm CalendarValueHistory
điền vào mảng values
được truyền bằng tham chiếu với các mục lịch trong khoảng thời gian giữa from
và to
. Cả hai tham số đều có thể bao gồm ngày và giờ. Giá trị from
được bao gồm trong khoảng, nhưng giá trị to
thì không. Nói cách khác, hàm chọn các mục lịch (cấu trúc MqlCalendarValue
), trong đó điều kiện tổng hợp sau được đáp ứng cho thuộc tính time
: from <= time < to
.
Thời gian bắt đầu from
phải được chỉ định, trong khi thời gian kết thúc to
là tùy chọn: nếu nó bị bỏ qua hoặc bằng 0, tất cả các sự kiện tương lai sẽ được sao chép vào mảng.
Thời gian to
phải lớn hơn from
, trừ khi nó là 0. Một sự kết hợp đặc biệt để truy vấn tất cả các sự kiện có sẵn (cả quá khứ và tương lai) là khi from
và to
đều là 0.
Nếu mảng nhận là động, bộ nhớ sẽ được cấp phát tự động cho nó. Nếu mảng có kích thước cố định, số lượng mục được sao chép sẽ không vượt quá kích thước của mảng.
Các tham số country
và currency
cho phép bạn đặt thêm bộ lọc cho các bản ghi theo quốc gia hoặc tiền tệ. Tham số country
chấp nhận mã quốc gia hai chữ cái ISO 3166-1 alpha-2 (ví dụ: DE
, FR
, EU
), và tham số currency
chấp nhận ký hiệu tiền tệ ba chữ cái (ví dụ: EUR
, CNY
).
Giá trị mặc định NULL hoặc chuỗi rỗng ""
trong bất kỳ tham số nào tương đương với việc không có bộ lọc tương ứng.
Nếu cả hai bộ lọc đều được chỉ định, chỉ các giá trị của những sự kiện mà cả hai điều kiện — quốc gia và tiền tệ — được đáp ứng đồng thời mới được chọn. Điều này có thể hữu ích nếu lịch bao gồm các quốc gia có nhiều loại tiền tệ, mỗi loại cũng lưu hành ở nhiều quốc gia. Hiện tại không có sự kiện nào như vậy trong lịch. Để lấy các sự kiện ở các nước khu vực đồng Euro, chỉ cần chỉ định mã của một quốc gia cụ thể hoặc EU
, và tiền tệ EUR
sẽ được giả định.
Hàm trả về số lượng phần tử được sao chép và có thể đặt mã lỗi. Đặc biệt, nếu vượt quá thời gian chờ yêu cầu từ máy chủ, trong _LastError
chúng ta nhận được lỗi 5401 (ERR_CALENDAR_TIMEOUT). Nếu mảng cố định không chứa đủ tất cả các bản ghi, mã sẽ bằng 5400 (ERR_CALENDAR_MORE_DATA), nhưng mảng sẽ được điền đầy. Khi cấp phát bộ nhớ cho mảng động, lỗi 4004 (ERR_NOT_ENOUGH_MEMORY) có thể xảy ra.
Chú ý! Thứ tự các phần tử trong mảng có thể khác với thứ tự thời gian. Bạn phải sắp xếp các bản ghi theo thời gian.
Sử dụng hàm CalendarValueHistory
, chúng ta có thể truy vấn các sự kiện sắp tới như sau:
MqlCalendarValue values[];
if(CalendarValueHistory(values, TimeCurrent()))
{
ArrayPrint(values);
}
2
3
4
5
Tuy nhiên, với đoạn mã này, chúng ta sẽ nhận được một bảng với thông tin không đầy đủ, nơi tên sự kiện, mức độ quan trọng và mã tiền tệ sẽ bị ẩn sau ID sự kiện trong trường MqlCalendarValue::event_id
và, gián tiếp, sau mã định danh quốc gia trong trường MqlCalendarEvent::country_id
. Để làm cho việc hiển thị thông tin thân thiện hơn với người dùng, bạn nên yêu cầu mô tả sự kiện bằng mã sự kiện, lấy mã quốc gia từ mô tả này và lấy các thuộc tính của nó. Hãy thể hiện điều này trong ví dụ kịch bản CalendarForDates.mq5
.
Trong các tham số đầu vào, chúng ta sẽ cung cấp khả năng nhập mã quốc gia và tiền tệ để lọc. Theo mặc định, các sự kiện cho Liên minh Châu Âu được yêu cầu.
input string CountryCode = "EU";
input string Currency = "";
2
Khoảng thời gian của các sự kiện sẽ tự động tính toán một khoảng thời gian trước và sau. Khoảng thời gian này cũng sẽ được để người dùng lựa chọn từ ba tùy chọn: một ngày, một tuần hoặc một tháng.
#define DAY_LONG 60 * 60 * 24
#define WEEK_LONG DAY_LONG * 7
#define MONTH_LONG DAY_LONG * 30
#define YEAR_LONG MONTH_LONG * 12
enum ENUM_CALENDAR_SCOPE
{
SCOPE_DAY = DAY_LONG,
SCOPE_WEEK = WEEK_LONG,
SCOPE_MONTH = MONTH_LONG,
SCOPE_YEAR = YEAR_LONG,
};
input ENUM_CALENDAR_SCOPE Scope = SCOPE_DAY;
2
3
4
5
6
7
8
9
10
11
12
13
14
Hãy định nghĩa cấu trúc MqlCalendarRecord
của chúng ta, dẫn xuất từ MqlCalendarValue
, và thêm các trường vào đó để trình bày thuận tiện các thuộc tính sẽ được điền bằng các liên kết (định danh) từ các cấu trúc phụ thuộc.
struct MqlCalendarRecord: public MqlCalendarValue
{
static const string importances[];
string importance;
string name;
string currency;
string code;
double actual, previous, revised, forecast;
...
};
static const string MqlCalendarRecord::importances[] = {"None", "Low", "Medium", "High"};
2
3
4
5
6
7
8
9
10
11
12
13
Trong số các trường được thêm vào, có các dòng với mức độ quan trọng (một trong các giá trị của mảng tĩnh importances
), tên sự kiện, quốc gia và tiền tệ, cũng như bốn giá trị ở định dạng double
. Điều này thực sự có nghĩa là sao chép thông tin để phục vụ việc trình bày trực quan khi in. Sau này chúng ta sẽ chuẩn bị một "bọc" nâng cao hơn cho lịch.
Để điền vào đối tượng, chúng ta sẽ cần một hàm tạo có tham số nhận cấu trúc ban đầu MqlCalendarValue
. Sau khi tất cả các trường kế thừa được sao chép ngầm vào đối tượng mới bằng toán tử '=', chúng ta gọi phương thức extend
được chuẩn bị đặc biệt.
MqlCalendarRecord() { }
MqlCalendarRecord(const MqlCalendarValue &value)
{
this = value;
extend();
}
2
3
4
5
6
7
Trong phương thức extend
, chúng ta lấy mô tả sự kiện bằng định danh của nó. Sau đó, dựa trên định danh quốc gia từ mô tả sự kiện, chúng ta lấy một cấu trúc với các thuộc tính quốc gia. Sau đó, chúng ta có thể điền vào nửa đầu của các trường đã thêm từ các cấu trúc nhận được MqlCalendarEvent
và MqlCalendarCountry
.
void extend()
{
MqlCalendarEvent event;
CalendarEventById(event_id, event);
MqlCalendarCountry country;
CalendarCountryById(event.country_id, country);
importance = importances[event.importance];
name = event.name;
currency = country.currency;
code = country.code;
MqlCalendarValue value = this;
actual = value.GetActualValue();
previous = value.GetPreviousValue();
revised = value.GetRevisedValue();
forecast = value.GetForecastValue();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Tiếp theo, chúng ta gọi các phương thức Get
tích hợp để điền bốn trường loại double
với các chỉ số tài chính.
Bây giờ chúng ta có thể sử dụng cấu trúc mới trong trình xử lý chính OnStart
.
void OnStart()
{
MqlCalendarValue values[];
MqlCalendarRecord records[];
datetime from = TimeCurrent() - Scope;
datetime to = TimeCurrent() + Scope;
if(PRTF(CalendarValueHistory(values, from, to, CountryCode, Currency)))
{
for(int i = 0; i < ArraySize(values); ++i)
{
PUSH(records, MqlCalendarRecord(values[i]));
}
Print("Near past and future calendar records (extended): ");
ArrayPrint(records);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Ở đây, mảng các cấu trúc tiêu chuẩn MqlCalendarValue
được điền bằng cách gọi CalendarValueHistory
cho các điều kiện hiện tại được đặt trong tham số đầu vào. Tiếp theo, tất cả các phần tử được chuyển sang mảng MqlCalendarRecord
. Hơn nữa, trong khi các đối tượng được tạo, chúng được mở rộng với thông tin bổ sung. Cuối cùng, mảng các sự kiện được xuất ra nhật ký.
Các mục nhật ký khá dài. Trước tiên, hãy hiển thị nửa bên trái, chính là những gì chúng ta sẽ thấy nếu in một mảng các cấu trúc tiêu chuẩn MqlCalendarValue
.
CalendarValueHistory(values,from,to,CountryCode,Currency)=6 / ok
Near past and future calendar records (extended):
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 162723 999020003 2022.06.23 03:00:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0
[1] 162724 999020003 2022.06.24 03:00:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0
[2] 168518 999010034 2022.06.24 11:00:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0
[3] 168515 999010031 2022.06.24 13:10:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0
[4] 168509 999010014 2022.06.24 14:30:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0
[5] 161014 999520001 2022.06.24 22:30:00 2022.06.21 00:00:00 0 -9223372036854775808 -6000000 -9223372036854775808 -9223372036854775808 0
2
3
4
5
6
7
8
9
Dưới đây là nửa thứ hai với việc "giải mã" tên, mức độ quan trọng và ý nghĩa.
CalendarValueHistory(values,from,to,CountryCode,Currency)=6 / ok
Near past and future calendar records (extended):
[importance] [name] [currency] [code] [actual] [previous] [revised] [forecast]
[0] "High" "EU Leaders Summit" "EUR" "EU" nan nan nan nan
[1] "High" "EU Leaders Summit" "EUR" "EU" nan nan nan nan
[2] "Medium" "ECB Supervisory Board Member McCaul Speech" "EUR" "EU" nan nan nan nan
[3] "Medium" "ECB Supervisory Board Member Fernandez-Bollo Speech" "EUR" "EU" nan nan nan nan
[4] "Medium" "ECB Vice President de Guindos Speech" "EUR" "EU" nan nan nan nan
[5] "Low" "CFTC EUR Non-Commercial Net Positions" "EUR" "EU" nan -6.00000 nan nan
2
3
4
5
6
7
8
9