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
