ArrayBsearch

升序排列的多维数值数组中搜索指定的值。搜索通过第一维度元素执行。

搜寻双精度数组

int  ArrayBsearch(
   const double&    array[],   // 用来搜索的数组
   double           value      // 搜索什么
   );

搜寻浮点型数组

int  ArrayBsearch(
   const float&    array[],   // 用来搜索的数组
   float           value      // 搜索什么
   );

搜寻长整型数组

int  ArrayBsearch(
   const long&    array[],   // 用来搜索的数组
   long           value      // 搜索什么
   );

搜寻整型数组

int  ArrayBsearch(
   const int&    array[],   // 用来搜索的数组
   int           value      // 搜索什么
   );

搜寻短整型数组

int  ArrayBsearch(
   const short&    array[],   // 用来搜索的数组
   short           value      // 搜索什么
   );

搜寻字符型数组

int  ArrayBsearch(
   const char&    array[],   // 用来搜索的数组
   char           value      // 搜索什么
   );

参量

array[]

[in]  搜寻数字数组。

value

[in]  搜寻值

返回值

函数返回创立元素索引,如果需要值没找到,函数返回最相近值。

注释

二进位检索过程只在存储数组中进行,使用 ArraySort() 函数分类数字数组。

示例:

#property description "Script based on RSI indicator data displays"
#property description "how often the market was in"
#property description "overbought and oversold areas in the specified time interval."
//--- 启动脚本时显示导入参数的窗口
#property script_show_inputs
//--- 导入参数
input int                InpMAPeriod=14;                    // 移动平均周期
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // 价格类型
input double             InpOversoldValue=30.0;             // 超卖水平
input double             InpOverboughtValue=70.0;           // 超买水平
input datetime           InpDateStart=D'2012.01.01 00:00';  // 分析开始日期
input datetime           InpDateFinish=D'2013.01.01 00:00'; // 分析结束日期
//+------------------------------------------------------------------+
//| 脚本程序开始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   double rsi_buff[]; // 指标值的数组
   int    size=0;     // 数组大小
//--- 接收RSI指标处理
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- 接收指标处理失败
      PrintFormat("Indicator handle receiving error. Error code = %d",GetLastError());
      return;
     }
//--- 循环中,直到指标计算它的所有值
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- 如果指标强制完成脚本操作则退出
      if(IsStopped())
         return;
      //--- 暂停允许指标计算它的所有值
      Sleep(10);
     }
//--- 复制一段时间的指标值
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Failed to copy the indicator values. Error code = %d",GetLastError());
      return;
     }
//--- 接收数组大小
   size=ArraySize(rsi_buff);
//--- 分类数组
   ArraySort(rsi_buff);
//--- 找出市场在超卖区域的时间(百分比)
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- 找出市场在超买区域的时间(百分比)
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- 显示数据的字符串形式
   string str="From "+TimeToString(InpDateStart,TIME_DATE)+" to "
              +TimeToString(InpDateFinish,TIME_DATE)+" the market was:";
   string str_ovb="in overbought area "+DoubleToString(ovb,2)+"% of time";
   string str_ovs="in oversold area "+DoubleToString(ovs,2)+"% of time";
//--- 在图表上显示数据
   CreateLabel("top",5,60,str,clrDodgerBlue);
   CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- 重绘图表
   ChartRedraw(0);
//--- 暂停
   Sleep(10000);
  }
//+------------------------------------------------------------------+
//| 在图表左下角显示评论                                                |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- 创建一个标签
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- 绑定标签到左下角
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- 改变定位点位置
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- X方向定位点的距离
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- Y方向定位点的距离
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- 标签文本
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- 文本颜色
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- 文本大小
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }