Ký hiệu và Khung thời gian
Chuỗi thời gian với báo giá được xác định bởi hai tham số: tên ký hiệu (công cụ tài chính) và khung thời gian (chu kỳ).
Người dùng có thể xem danh sách các ký hiệu trong cửa sổ Market Watch
và chỉnh sửa nó dựa trên danh sách chung do nhà môi giới cung cấp (hộp thoại Symbols
). Đối với các chương trình MQL, có một tập hợp các hàm có thể được sử dụng để thực hiện tương tự: tìm kiếm trong tất cả các ký hiệu, tìm hiểu thuộc tính của chúng và thêm hoặc xóa ký hiệu vào/ra khỏi Market Watch
. Những tính năng này sẽ là chủ đề của một chương riêng.
Tuy nhiên, để yêu cầu chuỗi thời gian, chỉ cần biết tên của ký hiệu — đây là một chuỗi chứa ký hiệu của một công cụ tài chính hiện có. Ví dụ, nó có thể được người dùng đặt trong biến đầu vào. Ngoài ra, ký hiệu của biểu đồ hiện tại có thể được tìm thấy từ biến tích hợp _Symbol
(hoặc hàm Symbol
), nhưng để tiện lợi, tất cả các hàm chuỗi thời gian đều hỗ trợ quy ước rằng giá trị NULL cũng tương ứng với ký hiệu của biểu đồ hiện tại.
Bây giờ hãy chuyển sang khung thời gian. Có 21 khung thời gian tiêu chuẩn được định nghĩa trong hệ thống: mỗi khung được chỉ định bởi một phần tử trong liệt kê đặc biệt ENUM_TIMEFRAMES.
Định danh | Giá trị (Hex) | Mô tả |
---|---|---|
PERIOD_CURRENT | 0 | Chu kỳ biểu đồ hiện tại |
PERIOD_M1 | 1 (0x1) | 1 phút |
PERIOD_M2 | 2 (0x2) | 2 phút |
PERIOD_M3 | 3 (0x3) | 3 phút |
PERIOD_M4 | 4 (0x4) | 4 phút |
PERIOD_M5 | 5 (0x5) | 5 phút |
PERIOD_M6 | 6 (0x6) | 6 phút |
PERIOD_M10 | 10 (0xA) | 10 phút |
PERIOD_M12 | 12 (0xC) | 12 phút |
PERIOD_M15 | 15 (0xF) | 15 phút |
PERIOD_M20 | 20 (0x14) | 20 phút |
PERIOD_M30 | 30 (0x1E) | 30 phút |
PERIOD_H1 | 16385 (0x4001) | 1 giờ |
PERIOD_H2 | 16386 (0x4002) | 2 giờ |
PERIOD_H3 | 16387 (0x4003) | 3 giờ |
PERIOD_H4 | 16388 (0x4004) | 4 giờ |
PERIOD_H6 | 16390 (0x4006) | 6 giờ |
PERIOD_H8 | 16392 (0x4008) | 8 giờ |
PERIOD_H12 | 16396 (0x400C) | 12 giờ |
PERIOD_D1 | 16408 (0x4018) | 1 ngày |
PERIOD_W1 | 32769 (0x8001) | 1 tuần |
PERIOD_MN1 | 49153 (0xC001) | 1 tháng |
Như chúng ta đã thấy trong phần Biến định sẵn, chương trình có thể biết chu kỳ của biểu đồ hiện tại từ biến tích hợp _Period
(hoặc hàm Period
). Dễ dàng nhận thấy từ cột giá trị rằng việc truyền số không vào các hàm tích hợp chấp nhận khung thời gian sẽ có nghĩa là chu kỳ của biểu đồ hiện tại.
Giá trị cho các khung thời gian phút giống với số phút trong chúng (ví dụ, 30 nghĩa là M30). Đối với khung thời gian giờ, bit 0x4000 được đặt, và byte thấp chứa số giờ (ví dụ, 0x4003 cho H3). Chu kỳ ngày D1 được mã hóa là 24 giờ, tức là 0x4018 (0x18 bằng 24). Cuối cùng, các khung thời gian tuần và tháng có các bit phân biệt riêng là 0x8000 và 0xC000, tương ứng, như các chỉ báo đơn vị, và số đếm (trong byte thấp) là 1 trong cả hai trường hợp.
Để chuyển đổi thuận tiện các phần tử liệt kê thành chuỗi và ngược lại, một tệp tiêu đề Periods.mqh
được đính kèm với sách (chúng ta đã sử dụng nó trong ví dụ làm việc với tệp, và sẽ sử dụng trong các ví dụ tương lai). Một trong những hàm của nó, StringToPeriod
, sử dụng trong thuật toán của mình các đặc điểm được mô tả ở trên của biểu diễn bit nội bộ của các phần tử liệt kê.
#define PERIOD_PREFIX_LENGTH 7 // StringLen("PERIOD_")
// lấy tên viết tắt của chu kỳ mà không có tiền tố "PERIOD_"
string PeriodToString(const ENUM_TIMEFRAMES tf = PERIOD_CURRENT)
{
const static int prefix = StringLen("PERIOD_");
return StringSubstr(EnumToString(tf == PERIOD_CURRENT ? _Period : tf),
PERIOD_PREFIX_LENGTH);
}
// lấy giá trị chu kỳ bằng tên đầy đủ (PERIOD_H4) hoặc ngắn (H4)
ENUM_TIMEFRAMES StringToPeriod(string name)
{
if(StringLen(name) < 2) return 0;
// chuyển đổi tên đầy đủ "PERIOD_TN" thành ngắn "TN" nếu cần
if(StringLen(name) > PERIOD_PREFIX_LENGTH)
{
name = StringSubstr(name, PERIOD_PREFIX_LENGTH);
}
// chuyển đổi phần cuối số "N" thành số, bỏ qua "T"
const int count = (int)StringToInteger(StringSubstr(name, 1));
// xóa lỗi có thể xảy ra WRONG_STRING_PARAMETER(5040)
// ví dụ, nếu chuỗi đầu vào là "MN1", thì N1 không phải là số cho StringToInteger
ResetLastError();
switch(name[0])
{
case 'M':
if(!count) return PERIOD_MN1;
return (ENUM_TIMEFRAMES)count;
case 'H':
return (ENUM_TIMEFRAMES)(0x4000 + count);
case 'D':
return PERIOD_D1;
case 'W':
return PERIOD_W1;
}
return 0;
}
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
33
34
35
36
37
38
Lưu ý rằng các biến
_Symbol
và_Period
chỉ chứa dữ liệu thực trong các chương trình MQL chạy trên biểu đồ, bao gồm scripts, Expert Advisors và chỉ báo. Trong dịch vụ, các biến này trống, và do đó, để truy cập chuỗi thời gian, bạn phải đặt rõ tên ký hiệu và chu kỳ hoặc lấy chúng từ nguồn bên ngoài.
Đặc tính xác định của khung thời gian là thời lượng của nó (thời lượng thanh). MQL5 cho phép bạn lấy số giây hình thành một thanh của một khung thời gian cụ thể bằng hàm PeriodSeconds
.
int PeriodSeconds(ENUM_TIMEFRAMES period = PERIOD_CURRENT)
Tham số period
chỉ định chu kỳ dưới dạng một phần tử của liệt kê ENUM_TIMEFRAMES. Nếu tham số không được chỉ định, thì số giây của chu kỳ biểu đồ hiện tại mà chương trình đang chạy sẽ được trả về.
Chúng ta sẽ xem xét các ví dụ sử dụng hàm trong chỉ báo IndDeltaVolume.mq5
trong phần Chờ dữ liệu và quản lý khả năng hiển thị, cũng như trong chỉ báo UseM1MA.mq5
trong phần Sử dụng chỉ báo tích hợp.
Để tạo các khung thời gian có thời lượng không tiêu chuẩn không nằm trong danh sách đã chỉ định, API MQL5 cung cấp ký hiệu tùy chỉnh, tuy nhiên, chúng không cho phép giao dịch như trên biểu đồ tiêu chuẩn mà không sửa đổi Expert Advisors.
Ngoài ra, cần lưu ý rằng trong MetaTrader 5, thời lượng của các thanh trong một chuỗi thời gian cụ thể hoặc trên biểu đồ luôn giống nhau. Do đó, để xây dựng các biểu đồ mà các thanh không được hình thành theo thời gian, mà theo sự tích lũy của các tham số khác, đặc biệt là khối lượng (biểu đồ equivolume) hoặc chuyển động giá theo một hướng trong các bước cố định (Renko), bạn có thể phát triển các giải pháp của riêng mình dựa trên chỉ báo (ví dụ, với loại hiển thị DRAW_CANDLES hoặc DRAW_BARS) hoặc sử dụng ký hiệu tùy chỉnh.