Thiết lập các mức trong các đối tượng mức
Một số đối tượng đồ họa được xây dựng bằng cách sử dụng nhiều mức (các đường lặp lại). Chúng bao gồm:
- Chĩa ba của Andrews
OBJ_PITCHFORK
- Các công cụ Fibonacci:
- Mức
OBJ_FIBO
- Vùng thời gian
OBJ_FIBOTIMES
- Quạt
OBJ_FIBOFAN
- Cung
OBJ_FIBOARC
- Kênh
OBJ_FIBOCHANNEL
- Mở rộng
OBJ_EXPANSION
- Mức
MQL5 cho phép bạn thiết lập các thuộc tính mức cho những đối tượng như vậy. Các thuộc tính bao gồm số lượng, màu sắc, giá trị và nhãn của chúng.
Định danh | Mô tả | Kiểu |
---|---|---|
OBJPROP_LEVELS | Số lượng mức | int |
OBJPROP_LEVELCOLOR | Màu đường mức | color |
OBJPROP_LEVELSTYLE | Kiểu đường mức | ENUM_LINE_STYLE |
OBJPROP_LEVELWIDTH | Độ rộng đường mức | int |
OBJPROP_LEVELTEXT | Mô tả mức | string |
OBJPROP_LEVELVALUE | Giá trị mức | double |
Khi gọi các hàm ObjectGet
và ObjectSet
cho tất cả các thuộc tính ngoại trừ OBJPROP_LEVELS
, cần cung cấp một tham số bổ trợ với số của một mức cụ thể.
Ví dụ, hãy xem xét chỉ báo ObjectHighLowFibo.mq5
. Đối với một phạm vi thanh được xác định bởi số của thanh cuối cùng (baroffset
) và số lượng thanh (BarCount
) bên trái của nó, chỉ báo tìm giá High
và Low
, sau đó tạo đối tượng OBJ_FIBO
cho các điểm này. Khi các thanh mới hình thành, các mức Fibonacci sẽ dịch chuyển sang phải tới các giá hiện tại hơn.
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
#include <MQL5Book/ColorMix.mqh>
input int BarOffset = 0;
input int BarCount = 24;
const string Prefix = "HighLowFibo-";
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 ll = iLowest(NULL, 0, MODE_LOW, BarCount, BarOffset);
datetime t[2] = {iTime(NULL, 0, hh), iTime(NULL, 0, ll)};
double p[2] = {iHigh(NULL, 0, hh), iLow(NULL, 0, ll)};
DrawFibo(Prefix + "Fibo", t, p, clrGray);
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
25
26
27
28
29
30
31
Việc thiết lập trực tiếp đối tượng được thực hiện trong hàm phụ trợ DrawFibo
. Trong đó, đặc biệt, các mức được tô màu cầu vồng, và kiểu dáng cùng độ dày của chúng được xác định dựa trên việc các giá trị tương ứng có "tròn" (không có phần thập phân) hay không.
bool DrawFibo(const string name, const datetime &t[], const double &p[],
const color clr)
{
if(ArraySize(t) != ArraySize(p)) return false;
ObjectCreate(0, name, OBJ_FIBO, 0, 0, 0);
// điểm neo
for(int i = 0; i < ArraySize(t); ++i)
{
ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
}
// cài đặt chung
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, true);
// cài đặt mức
const int n = (int)ObjectGetInteger(0, name, OBJPROP_LEVELS);
for(int i = 0; i < n; ++i)
{
const color gradient = ColorMix::RotateColors(ColorMix::HSVtoRGB(0),
ColorMix::HSVtoRGB(359), n, i);
ObjectSetInteger(0, name, OBJPROP_LEVELCOLOR, i, gradient);
const double level = ObjectGetDouble(0, name, OBJPROP_LEVELVALUE, i);
if(level - (int)level > DBL_EPSILON * level)
{
ObjectSetInteger(0, name, OBJPROP_LEVELSTYLE, i, STYLE_DOT);
ObjectSetInteger(0, name, OBJPROP_LEVELWIDTH, i, 1);
}
else
{
ObjectSetInteger(0, name, OBJPROP_LEVELSTYLE, i, STYLE_SOLID);
ObjectSetInteger(0, name, OBJPROP_LEVELWIDTH, i, 2);
}
}
return true;
}
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
Dưới đây là một biến thể của cách đối tượng có thể trông như thế nào trên biểu đồ.
Đối tượng Fibonacci với cài đặt mức