ArrayBsearch

昇順にソートされた多次元数値配列内の指定された値を検索します。検索は最初の次元の要素を介して行われます。

double 型の配列の検索には

int  ArrayBsearch(
  const double&   array[],   // 検索対象の配列
  double          value      // 検索される値
  );

float 型の配列の検索には

int  ArrayBsearch(
  const float&   array[]// 検索対象の配列
  float          value      // 検索される値
  );

long 型の配列の検索には

int  ArrayBsearch(
  const long&   array[]// 検索対象の配列
  long          value      // 検索される値
  );

int 型の配列の検索には

int  ArrayBsearch(
  const int&   array[]// 検索対象の配列
  int          value      // 検索される値
  );

short 型の配列の検索には

int  ArrayBsearch(
  const short&   array[]// 検索対象の配列
  short          value      // 検索される値
  );

char 型の配列の検索には

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