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]  검색할 숫자 배열.

[in]  검색 값.

반환 값

함수는 발견된 요소의 인덱스를 반환합니다. 원하는 값을 찾을 수 없으면 함수는 값에 가장 가까운 요소의 인덱스를 반환합니다.

참고

바이너리 검색 프로세스는 정렬된 배열을 처리합니다. 숫자 배열을 정렬하려면 ArraySort() 기능을 사용.

예:

#property description "RSI 지표 데이터 표시 기준 스크립트"
#property description "시장이 얼마나 자주 열렸는지"
#property description "지정된 시간 간격 동안 과잉구매 및 과잉판매된 영역."
//--- 스크립트를 시작할 때 입력 매개변수 창 표시
#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("지표 핸들 수신 오류. 오류 코드 = %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("지표 값을 복사하는데 실패. 오류 코드 = %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);
  }