ArrayBsearch
Tìm kiếm một giá trị được chỉ định trong một mảng số đa chiều được sắp xếp tăng dần. Việc tìm kiếm được thực hiện qua các phần tử của chiều đầu tiên.
Dùng để tìm kiếm trong mảng kiểu double
cpp
int ArrayBsearch(
const double& array[], // mảng để tìm kiếm
double value // giá trị cần tìm
);
1
2
3
4
2
3
4
Dùng để tìm kiếm trong mảng kiểu float
cpp
int ArrayBsearch(
const float& array[], // mảng để tìm kiếm
float value // giá trị cần tìm
);
1
2
3
4
2
3
4
Dùng để tìm kiếm trong mảng kiểu long
cpp
int ArrayBsearch(
const long& array[], // mảng để tìm kiếm
long value // giá trị cần tìm
);
1
2
3
4
2
3
4
Dùng để tìm kiếm trong mảng kiểu int
cpp
int ArrayBsearch(
const int& array[], // mảng để tìm kiếm
int value // giá trị cần tìm
);
1
2
3
4
2
3
4
Dùng để tìm kiếm trong mảng kiểu short
cpp
int ArrayBsearch(
const short& array[], // mảng để tìm kiếm
short value // giá trị cần tìm
);
1
2
3
4
2
3
4
Dùng để tìm kiếm trong mảng kiểu char
cpp
int ArrayBsearch(
const char& array[], // mảng để tìm kiếm
char value // giá trị cần tìm
);
1
2
3
4
2
3
4
Tham số
array[]
[in] Mảng số để tìm kiếm.
value
[in] Giá trị cần tìm.
Giá trị trả về
Hàm trả về chỉ số của phần tử được tìm thấy. Nếu giá trị cần tìm không được tìm thấy, hàm trả về chỉ số của phần tử gần nhất về giá trị.
Ghi chú
Tìm kiếm nhị phân chỉ xử lý các mảng đã được sắp xếp. Để sắp xếp mảng số, sử dụng hàm ArraySort().
Ví dụ:
cpp
#property description "Script dựa trên dữ liệu chỉ báo RSI hiển thị"
#property description "tần suất thị trường ở trong"
#property description "vùng quá mua và quá bán trong khoảng thời gian được chỉ định."
//--- hiển thị cửa sổ tham số đầu vào khi chạy script
#property script_show_inputs
//--- tham số đầu vào
input int InpMAPeriod=14; // Chu kỳ trung bình động
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Loại giá
input double InpOversoldValue=30.0; // Mức quá bán
input double InpOverboughtValue=70.0; // Mức quá mua
input datetime InpDateStart=D'2012.01.01 00:00'; // Ngày bắt đầu phân tích
input datetime InpDateFinish=D'2013.01.01 00:00'; // Ngày kết thúc phân tích
//+------------------------------------------------------------------+
//| Hàm bắt đầu chương trình script |
//+------------------------------------------------------------------+
void OnStart()
{
double rsi_buff[]; // mảng chứa giá trị chỉ báo
int size=0; // kích thước mảng
//--- nhận handle của chỉ báo RSI
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- không thể nhận handle của chỉ báo
PrintFormat("Lỗi nhận handle chỉ báo. Mã lỗi = %d",GetLastError());
return;
}
//--- lặp cho đến khi chỉ báo tính toán xong tất cả giá trị
while(BarsCalculated(rsi_handle)==-1)
{
//--- thoát nếu chỉ báo buộc dừng hoạt động của script
if(IsStopped())
return;
//--- tạm dừng để chỉ báo tính toán tất cả giá trị
Sleep(10);
}
//--- sao chép giá trị chỉ báo trong một khoảng thời gian nhất định
ResetLastError();
if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
{
PrintFormat("Không thể sao chép giá trị chỉ báo. Mã lỗi = %d",GetLastError());
return;
}
//--- nhận kích thước mảng
size=ArraySize(rsi_buff);
//--- sắp xếp mảng
ArraySort(rsi_buff);
//--- tìm thời gian (theo phần trăm) thị trường ở trong vùng quá bán
double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- tìm thời gian (theo phần trăm) thị trường ở trong vùng quá mua
double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- tạo chuỗi để hiển thị dữ liệu
string str="Từ "+TimeToString(InpDateStart,TIME_DATE)+" đến "
+TimeToString(InpDateFinish,TIME_DATE)+" thị trường đã ở:";
string str_ovb="trong vùng quá mua "+DoubleToString(ovb,2)+"% thời gian";
string str_ovs="trong vùng quá bán "+DoubleToString(ovs,2)+"% thời gian";
//--- hiển thị dữ liệu trên biểu đồ
CreateLabel("top",5,60,str,clrDodgerBlue);
CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- vẽ lại biểu đồ
ChartRedraw(0);
//--- tạm dừng
Sleep(10000);
}
//+------------------------------------------------------------------+
//| Hiển thị chú thích ở góc dưới bên trái của biểu đồ |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
const string str,const color clr)
{
//--- tạo nhãn
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- gắn nhãn vào góc dưới bên trái
ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- thay đổi vị trí điểm neo
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- khoảng cách từ điểm neo theo hướng X
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- khoảng cách từ điểm neo theo hướng Y
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- văn bản nhãn
ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- màu văn bản
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- kích thước văn bản
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
}
1
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89