Tọa độ giá và thời gian
Đối với các đối tượng thuộc loại tồn tại trong hệ tọa độ báo giá, API MQL5 hỗ trợ một vài thuộc tính để chỉ định liên kết thời gian và giá. Trong trường hợp một đối tượng có nhiều điểm neo, các thuộc tính yêu cầu chỉ định tham số sửa đổi chứa chỉ số của điểm neo khi gọi các hàm ObjectSet
và ObjectGet
.
Định danh | Mô tả | Kiểu giá trị |
---|---|---|
OBJPROP_TIME | Tọa độ thời gian | datetime |
OBJPROP_PRICE | Tọa độ giá | double |
Các thuộc tính này có sẵn cho tất cả các đối tượng, nhưng không có ý nghĩa khi thiết lập hoặc đọc chúng đối với các đối tượng có tọa độ màn hình.
Để thể hiện cách làm việc với tọa độ, chúng ta hãy phân tích chỉ báo không đệm ObjectHighLowChannel.mq5
. Đối với một đoạn thanh đã cho, nó vẽ hai đường xu hướng. Điểm bắt đầu và kết thúc của chúng trên trục thời gian trùng với thanh đầu tiên và thanh cuối cùng của đoạn, và dọc theo trục giá, các giá trị được tính toán khác nhau cho mỗi đường: giá High
cao nhất và thấp nhất được sử dụng cho đường trên và giá Low
cao nhất và thấp nhất được sử dụng cho đường dưới. Khi biểu đồ cập nhật, kênh tạm thời của chúng ta sẽ di chuyển theo giá.
Phạm vi thanh được thiết lập bằng hai biến đầu vào: số của thanh ban đầu BarOffset
và số lượng thanh BarCount
. Theo mặc định, các đường được vẽ tại giá gần đây nhất, vì bar offset = 0
.
input int BarOffset = 0;
input int BarCount = 10;
const string Prefix = "HighLowChannel-";
2
3
4
Các đối tượng có tiền tố tên chung là HighLowChannel-
.
Trong trình xử lý OnCalculate
, chúng ta theo dõi sự xuất hiện của các thanh mới qua thời gian iTime
của thanh thứ 0. Ngay khi thanh được hình thành, giá được phân tích trên đoạn đã chỉ định, giá trị tối đa và tối thiểu của giá của mỗi loại (MODE_HIGH, MODE_LOW) được lấy và hàm phụ trợ DrawFigure
được gọi cho chúng, và đây là nơi diễn ra công việc với các đối tượng: tạo và sửa đổi tọa độ.
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
static datetime now = 0;
if(now != iTime(NULL, 0, 0))
{
const int hh = iHighest(NULL, 0, MODE_HIGH, BarCount, BarOffset);
const int lh = iLowest(NULL, 0, MODE_HIGH, BarCount, BarOffset);
const int ll = iLowest(NULL, 0, MODE_LOW, BarCount, BarOffset);
const int hl = iHighest(NULL, 0, MODE_LOW, BarCount, BarOffset);
datetime t[2] = {iTime(NULL, 0, BarOffset + BarCount), iTime(NULL, 0, BarOffset)};
double ph[2] = {iHigh(NULL, 0, fmax(hh, lh)), iHigh(NULL, 0, fmin(hh, lh))};
double pl[2] = {iLow(NULL, 0, fmax(ll, hl)), iLow(NULL, 0, fmin(ll, hl))};
DrawFigure(Prefix + "Highs", t, ph, clrBlue);
DrawFigure(Prefix + "Lows", t, pl, clrRed);
now = iTime(NULL, 0, 0);
}
return rates_total;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Và đây là hàm DrawFigure
chính nó.
bool DrawFigure(const string name, const datetime &t[], const double &p[],
const color clr)
{
if(ArraySize(t) != ArraySize(p)) return false;
ObjectCreate(0, name, OBJ_TREND, 0, 0, 0);
for(int i = 0; i < ArraySize(t); ++i)
{
ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
}
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
return true;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sau khi gọi ObjectCreate
đảm bảo sự tồn tại của một đối tượng, các hàm ObjectSet phù hợp cho OBJPROP_TIME
và OBJPROP_PRICE
được gọi tại tất cả các điểm neo (trong trường hợp này là hai điểm).
Hình ảnh dưới đây cho thấy kết quả của chỉ báo.
Kênh trên hai đường xu hướng tại giá High và Low
Bạn có thể chạy chỉ báo trong trình kiểm tra trực quan để xem cách tọa độ đường thay đổi theo thời gian thực.