Скачать MetaTrader 5

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 "Скрипт на основе данных индикатора 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'; // Дата конца анализа
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
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="С "+TimeToString(InpDateStart,TIME_DATE)+" по "
              +TimeToString(InpDateFinish,TIME_DATE)+" рынок находился:";
   string str_ovb="в зоне перекупленности "+DoubleToString(ovb,2)+"% времени";
   string str_ovs="в зоне перепроданности "+DoubleToString(ovs,2)+"% времени";
//--- отобразим данные на графике
   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);
  }