Да, видел уже несколько попыток доказать, что ArrayBsearch работает не так, как надо.
Но сделаю еще одну.
Рассмотрим код
double d[4] = {2,1,1,0};
Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);
int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
Print("i=", i);
В логе:
01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 0
01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: i=1
Т.е. все правильно, в массиве, отсортированном по убыванию, нашел первую "1", которая стоит вторым элементом.
Если теперь заменить в массиве последний элемент с "0" на "1"
double d[4] = {2,1,1,1};
Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);
int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
Print("i=", i);
В логе:
01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 1
01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: i=3
Вроде бы, судя по логике, результат не должен меняться, должно все так же возвращаться "1", однако, поиск выдает последний элемент массива.
И ладно еще в тесте четыре элемента. В оригинале несколько тысяч повторяющихся элементов постоянно ищутся, а потом еще и сортируются.
Что за ерунда?
Я посмотрел справочник. Функция работает в полном соответствии со своим описанием. Никто не обещал, что это будет первое (или последнее) вхождение
значения в направлении поиска.
По-видимому, в ней реализован алгоритм двоичного поиска, и она возвращает первое найденное значение.
Поэтому, если есть повторяющиеся значения, то, при определенных вариантах, индекс может указать на любое из них.
По-видимому, в ней реализован алгоритм двоичного поиска, и она возвращает первое найденное значение.
Поэтому, если есть повторяющиеся значения, то, при определенных вариантах, индекс может указать на любое из них.
В справке сказано https://docs.mql4.com/ru/array/ArrayBsearch:
int ArrayBsearch( | double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND) |
Возвращает индекс первого найденного элемента в первом измерении массива.
Если элемент с указанным значением в массиве отсутствует, функция
вернет индекс ближайшего меньшего по значению из элементов, между
которыми расположено искомое значение.
Функция не может применяться к массивами строк и таймсериям (исключение составляет таймсерия времени открытия бара).
Замечание: двоичный поиск обрабатывает только сортированные массивы.
Для сортировки числового массива используется функция ArraySort().
Я посмотрел справочник. Функция работает в полном соответствии со своим описанием. Никто не обещал, что это будет первое (или последнее) вхождение
значения в направлении поиска.
По-видимому, в ней реализован алгоритм двоичного поиска, и она возвращает первое найденное значение.
Поэтому, если есть повторяющиеся значения, то, при определенных вариантах, индекс может указать на любое из них.
Согласен, в документации не сказано, что это должен быть первый или любой из набора. Я об этом не подумал.
В любом случае ошибка :) Либо в документации, либо в коде.
В общем и целом могу согласиться с мнением, что документация сделана на очень низком уровне. И это одно из самых слабых мест MT4. Надеюсь, в пятом будем получше.
Я не очень понял, уважаемый, вы это к чему? У меня вполне отсортированный по убыванию массив, разве нет? Или я зря обратил внимание на выделенный кусок цитаты?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Да, видел уже несколько попыток доказать, что ArrayBsearch работает не так, как надо.
Но сделаю еще одну.
Рассмотрим код
double d[4] = {2,1,1,0};
Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);
int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
Print("i=", i);
В логе:
01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 0
01:21:01 2009.07.01 00:00 PriceReturn EURUSD,M1: i=1
Т.е. все правильно, в массиве, отсортированном по убыванию, нашел первую "1", которая стоит вторым элементом.
Если теперь заменить в массиве последний элемент с "0" на "1"
double d[4] = {2,1,1,1};
Print("d: ", d[0], " ", d[1], " ", d[2], " ", d[3]);
int i = ArrayBsearch(d, 1, WHOLE_ARRAY, 0, MODE_DESCEND);
Print("i=", i);
В логе:
01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: d: 2 1 1 1
01:19:54 2009.07.01 00:00 PriceReturn EURUSD,M1: i=3
Вроде бы, судя по логике, результат не должен меняться, должно все так же возвращаться "1", однако, поиск выдает последний элемент массива.
И ладно еще в тесте четыре элемента. В оригинале несколько тысяч повторяющихся элементов постоянно ищутся, а потом еще и сортируются.
Что за ерунда?