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);

  }