Lấy báo giá dưới dạng mảng cấu trúc MqlRates
Để yêu cầu một mảng báo giá bao gồm tất cả các đặc điểm của thanh, hãy sử dụng hàm CopyRates
với nhiều phiên bản nạp chồng.
int CopyRates(const string symbol, ENUM_TIMEFRAMES timeframe, int offset, int count, MqlRates &rates[])
int CopyRates(const string symbol, ENUM_TIMEFRAMES timeframe, datetime start, int count, MqlRates &rates[])
int CopyRates(const string symbol, ENUM_TIMEFRAMES timeframe, datetime start, datetime stop, MqlRates &rates[])
Hàm này lấy dữ liệu lịch sử vào mảng rates
cho các tham số được chỉ định: ký hiệu, khung thời gian, và phạm vi thời gian được xác định bởi số thứ tự thanh hoặc giá trị start/stop
kiểu datetime
.
Hàm trả về số lượng phần tử mảng được sao chép, hoặc -1 trong trường hợp xảy ra lỗi, mã lỗi có thể được tìm thấy từ _LastError
. Đặc biệt, lỗi sẽ xảy ra nếu một ký hiệu không tồn tại được chỉ định, khoảng thời gian không chứa dữ liệu trên máy chủ, hoặc vượt quá giới hạn số lượng thanh trên biểu đồ (TerminalInfoInteger
(TERMINAL_MAXBARS)
).
Những nguyên tắc cơ bản khi làm việc với hàm này là chung cho tất cả các hàm Copy
và đã được trình bày trong phần Tổng quan về các hàm Copy để lấy mảng báo giá.
Cấu trúc kiểu nội tuyến MqlRates
được mô tả như sau:
struct MqlRates
{
datetime time; // thời gian mở thanh
double open; // giá mở
double high; // giá cao nhất mỗi thanh
double low; // giá thấp nhất mỗi thanh
double close; // giá đóng
long tick_volume; // khối lượng tick mỗi thanh
int spread; // chênh lệch giá tối thiểu mỗi thanh tính bằng điểm
long real_volume; // khối lượng giao dịch mỗi thanh
};
2
3
4
5
6
7
8
9
10
11
Hãy thử áp dụng hàm này để tính kích thước trung bình của các thanh trong script SeriesStats.mq5
. Trong các biến đầu vào, chúng ta sẽ cung cấp khả năng chọn ký hiệu làm việc, khung thời gian, số lượng thanh được phân tích, và độ lệch ban đầu về quá khứ (0 có nghĩa là phân tích từ thanh hiện tại).
input string WorkSymbol = NULL; // Ký hiệu (để trống cho ký hiệu hiện tại)
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT;
input int BarOffset = 0;
input int BarCount = 10000;
void OnStart()
{
MqlRates rates[];
double range = 0, move = 0; // tính toán phạm vi và chuyển động giá trong các thanh
PrintFormat("Requesting %d bars on %s %s",
BarCount, StringLen(WorkSymbol) > 0 ? WorkSymbol : _Symbol,
EnumToString(TimeFrame == PERIOD_CURRENT ? _Period : TimeFrame));
// yêu cầu tất cả thông tin về BarCount thanh vào mảng MqlRates
const int n = PRTF(CopyRates(WorkSymbol, TimeFrame, BarOffset, BarCount, rates));
// trong vòng lặp, chúng ta tính toán trung bình cho phạm vi và chuyển động
for(int i = 0; i < n; ++i)
{
range += (rates[i].high - rates[i].low) / n;
move += (fmax(rates[i].open, rates[i].close)
- fmin(rates[i].open, rates[i].close)) / n;
}
PrintFormat("Stats per bar: range=%f, movement=%f", range, move);
PrintFormat("Dates: %s - %s",
TimeToString(rates[0].time), TimeToString(rates[n - 1].time));
}
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
Khi chạy script trên biểu đồ EURUSD,H1, chúng ta có thể nhận được kết quả gần giống như sau.
Requesting 100000 bars on EURUSD PERIOD_H1
CopyRates(WorkSymbol,TimeFrame,BarOffset,BarCount,rates)=20018 / ok
Stats per bar: range=0.001280, movement=0.000621
Dates: 2018.07.19 15:00 - 2021.10.11 17:00
2
3
4
Vì terminal có giới hạn 20,000 thanh, một yêu cầu cho 100,000 thanh chỉ có thể trả về 20,018 (giới hạn và các thanh mới hình thành sau khi phiên bắt đầu). Phần tử đầu tiên của mảng (với chỉ số 0) chứa thanh có thời gian 2018.07.19 15:00, và phần tử cuối cùng – 2021.10.11 17:00.
Theo thống kê, phạm vi trung bình của thanh trong thời gian này là 128 điểm, và chuyển động giữa giá mở và đóng là 62 điểm.
Khi yêu cầu thông tin bằng ngày bắt đầu và kết thúc (start/stop
), hãy nhớ rằng cả hai ranh giới được xử lý bao gồm cả hai. Do đó, để đặt một khoảng tương ứng với bất kỳ thanh nào của khung thời gian cao hơn, cần trừ đi 1 giây từ ranh giới bên phải. Chúng ta sẽ áp dụng kỹ thuật này trong ví dụ SeriesSpread.mq5
trong phần Đọc giá, khối lượng, chênh lệch giá và thời gian theo chỉ số thanh.