Lấy cài đặt chỉ báo theo handle của nó
Đôi khi một chương trình MQL cần biết các tham số của một phiên bản chỉ báo đang chạy. Đây có thể là các chỉ báo của bên thứ ba trên biểu đồ, hoặc một handle được truyền từ chương trình chính sang thư viện hoặc tệp tiêu đề. Để phục vụ mục đích này, MQL5 cung cấp hàm IndicatorParameters
.
int IndicatorParameters(int handle, ENUM_INDICATOR &type, MqlParam ¶ms[])
Theo handle được chỉ định, hàm này trả về số lượng tham số đầu vào của chỉ báo, cũng như kiểu và giá trị của chúng.
Khi thành công, hàm điền vào mảng params
được truyền vào nó, và loại chỉ báo được lưu trong tham số type
.
Trong trường hợp xảy ra lỗi, hàm trả về -1.
Để minh họa cách làm việc với hàm này, hãy cải thiện chỉ báo UseDemoAllLoop.mq5
đã được trình bày trong phần Xóa các phiên bản chỉ báo. Chúng ta sẽ gọi phiên bản mới là UseDemoAllParams.mq5
.
Như bạn nhớ, chúng ta đã lần lượt tạo một số chỉ báo tích hợp trong vòng lặp trong danh sách và để danh sách tham số trống, điều này dẫn đến việc các chỉ báo sử dụng một số giá trị mặc định không xác định. Liên quan đến điều này, chúng ta đã hiển thị một nguyên mẫu tổng quát trong phần ghi chú trên biểu đồ: với tên, nhưng không có giá trị cụ thể.
// UseDemoAllLoop.mq5
void OnTimer()
{
...
Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
"(default-params)");
...
}
2
3
4
5
6
7
8
Bây giờ chúng ta có cơ hội tìm hiểu các tham số của nó dựa trên handle của chỉ báo và hiển thị chúng cho người dùng.
// UseDemoAllParams.mq5
void OnTimer()
{
...
// đọc các tham số được chỉ báo áp dụng mặc định
ENUM_INDICATOR itype;
MqlParam defParams[];
const int p = IndicatorParameters(Handle, itype, defParams);
ArrayPrint(defParams);
Comment("DemoAll: ", (IndicatorSelector == iCustom_ ? IndicatorCustom : s),
"(" + MqlParamStringer::stringify(defParams) + ")");
...
}
2
3
4
5
6
7
8
9
10
11
12
13
Việc chuyển đổi mảng MqlParam
thành chuỗi được thực hiện trong lớp đặc biệt MqlParamStringer
(xem tệp MqlParamStringer.mqh
).
class MqlParamStringer
{
public:
static string stringify(const MqlParam ¶m)
{
switch(param.type)
{
case TYPE_BOOL:
case TYPE_CHAR:
case TYPE_UCHAR:
case TYPE_SHORT:
case TYPE_USHORT:
case TYPE_DATETIME:
case TYPE_COLOR:
case TYPE_INT:
case TYPE_UINT:
case TYPE_LONG:
case TYPE_ULONG:
return IntegerToString(param.integer_value);
case TYPE_FLOAT:
case TYPE_DOUBLE:
return (string)(float)param.double_value;
case TYPE_STRING:
return param.string_value;
}
return NULL;
}
static string stringify(const MqlParam ¶ms[])
{
string result = "";
const int p = ArraySize(params);
for(int i = 0; i < p; ++i)
{
result += stringify(params[i]) + (i < p - 1 ? "," : "");
}
return result;
}
};
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
39
Sau khi biên dịch và chạy chỉ báo mới, bạn có thể chắc chắn rằng danh sách tham số cụ thể của chỉ báo đang được hiển thị giờ đây xuất hiện ở góc trên bên trái của biểu đồ.
Đối với một chỉ báo tùy chỉnh duy nhất trong danh sách (LifeCycle
), tham số đầu tiên sẽ chứa đường dẫn và tên tệp của chỉ báo. Tham số thứ hai được mô tả trong mã nguồn dưới dạng số nguyên. Nhưng tham số thứ ba thú vị vì nó ngầm mô tả thuộc tính 'Áp dụng cho', vốn có trong tất cả các chỉ báo với dạng ngắn của trình xử lý OnCalculate
. Trong trường hợp này, theo mặc định, chỉ báo được áp dụng cho PRICE_CLOSE (giá trị 1).
Initializing LifeCycle() EURUSD, PERIOD_H1
Handle=10
[type] [integer_value] [double_value] [string_value]
[0] 14 0 0.00000 "Indicators\MQL5Book\p5\LifeCycle.ex5"
[1] 7 0 0.00000 null
[2] 7 1 0.00000 null
Initializing iAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price() EURUSD, PERIOD_H1
iAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price requires 8 parameters, 0 given
Handle=10
[type] [integer_value] [double_value] [string_value]
[0] 7 13 0.00000 null
[1] 7 8 0.00000 null
[2] 7 8 0.00000 null
[3] 7 5 0.00000 null
[4] 7 5 0.00000 null
[5] 7 3 0.00000 null
[6] 7 2 0.00000 null
[7] 7 5 0.00000 null
Initializing iAMA_period_fast_slow_shift_price() EURUSD, PERIOD_H1
iAMA_period_fast_slow_shift_price requires 5 parameters, 0 given
Handle=10
[type] [integer_value] [double_value] [string_value]
[0] 7 9 0.00000 null
[1] 7 2 0.00000 null
[2] 7 30 0.00000 null
[3] 7 0 0.00000 null
[4] 7 1 0.00000 null
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
Theo nhật ký, các cài đặt của các chỉ báo tích hợp cũng tương ứng với giá trị mặc định.