Функция 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'2016.01.01 00:00'; // Дата начала анализа
input datetime InpDateFinish=D'2017.01.01 00:00'; // Дата конца анализа
//+------------------------------------------------------------------+
//| Script program start function | //+------------------------------------------------------------------+
void OnStart()
{
double rBuffer[]; // массив значений индикатора
int size=0; // размер массива
//--- получим хэндл индикатора RSI
ResetLastError();
int rHndl=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rHndl==INVALID_HANDLE)
{
//--- не удалось получить хэндл индикатора
PrintFormat("Ошибка получения хэндла индикатора. Код ошибки = %d",GetLastError());
return;
}
//--- находимся в цикле, пока индикатор не рассчитает все свои значения
while(BarsCalculated(rHndl)==-1)
{
//--- выходим, если пользователь принудительно завершил работу скрипта
if(IsStopped())
return;
//--- задержка, чтобы индикатор успел вычислить свои значения
Sleep(10);
}
//--- скопируем значения индикатора за определенный период
ResetLastError();
if(CopyBuffer(rHndl,0,InpDateStart,InpDateFinish,rBuffer)==-1)
{
PrintFormat("Не удалось скопировать значения индикатора. Код ошибки = %d",GetLastError());
return;
}
//--- получим размер массива
size=ArraySize(rBuffer);
//--- отсортируем массив
ArraySort(rBuffer);
//--- узнаем какой процент времени рынок находился в зоне перепроданности
double ovs=(double)ArrayBsearch(rBuffer,InpOversoldValue)*100/(double)size;
//--- узнаем какой процент времени рынок находился в зоне перекупленности
double ovb=(double)(size-ArrayBsearch(rBuffer,InpOverboughtValue))*100/(double)size;
//--- сформируем строки для вывода данных
string str="С"+TimeToString(InpDateStart,TIME_DATE)+" по "
+TimeToString(InpDateFinish,TIME_DATE)+" рынок находился:";
string sOverbought="в зоне перекупленности"+DoubleToString(ovb,2)+"% времени";
string sOversold="в зоне перепроданности"+DoubleToString(ovs,2)+"% времени";
//--- отобразим данные на графике
CreateLabel("top",5,60,str,clrDodgerBlue);
CreateLabel("overbought",5,35,sOverbought,clrDodgerBlue);
CreateLabel("oversold",5,10,sOversold,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);
}