Новая версия платформы MetaTrader 5 build 2650: Фоновая загрузка графиков и улучшения в профилировщике MQL5-кода - страница 29

 
A100:

Вы мысль мою не правильно поняли: при таком неоднозначном описании эту функцию неразумно было вообще использовать. Кстати в стандартной библиотеке она ни ни разу не используется

Хорошо, а какая альтернатива, писать свою и крутить цикл?

 
Aleksey Vyazmikin:

Хорошо, а какая альтернатива, писать свою и крутить цикл?

Бинарный поиск потому так и называется, что там нет цикла, делается через рекурсию. Пишите свою, в инете много примеров.

 
A100:

Вы мысль мою не правильно поняли: при таком неоднозначном описании эту функцию неразумно было вообще использовать. Кстати в стандартной библиотеке она ни ни разу не используется

Но она используется Разработчиками в Unit тесте Scripts\UnitTests\Generic\TestArrayList.mq5

Заменим в нем Random на конкретные значения

#include <Generic\ArrayList.mqh>
#include <Generic\HashSet.mqh>
int ii[] = { 1,2,3,4,5 };
bool TestBinarySearch_Validations(const int count)
 {
   CArrayList<int>list_test(count);
   for(int i=0; i<count; i++)
      list_test.Add(ii[ i ]);
   list_test.Sort();
   int array[];
   if(list_test.CopyTo(array)!=count)
      return(false);
   int element=0;
   int index1=ArrayBsearch(array,element);
   int index2= list_test.BinarySearch(0,count,element,NULL);
   if(index1!=index2)
      return(false);
   return(true);
  }
void OnStart()
{
        Print( TestBinarySearch_Validations(ArraySize( ii )));
}

Результат: false, а должно быть true

Тут уже прямое доказательство ошибки
 
Aleksey Vyazmikin:

Хорошо, а какая альтернатива, писать свою и крутить цикл?

Вот пример выше: по всей видимости ArrayBsearch дает неверное значение, а list_test.BinarySearch - верное

 
Andrey Barinov:

Бинарный поиск потому так и называется, что там нет цикла, делается через рекурсию. Пишите свою, в инете много примеров.

Ну уж прям свою - я не умею искать числа без цикла... Я ж обычный трейдер самоучка - рекурсии это сложно. Можете показать такой код на MQL5?

 
A100:

Вот пример выше: по всей видимости ArrayBsearch дает неверное значение, а list_test.BinarySearch - верное

Хорошо, что выяснили, но вот разработчики молчат в последнее время, как партизаны.

 
Aleksey Vyazmikin:

Ну уж прям свою - я не умею искать числа без цикла... Я ж обычный трейдер самоучка - рекурсии это сложно. Можете показать такой код на MQL5?

Навскидку и без проверки

https://www.mql5.com/ru/code/1468

 

А вот ещё непонятки с хэлпом

StringToInteger

Преобразование строки, содержащей символьное представление числа, 
в число типа int (целое).



long  StringToInteger( 
   string  value      // строка 
   );
 

число типа int, а функция возвращает число типа long, компилятор ругается.... Ну сделайте ещё функцию 

StringToLong

и все будут довольны...

 
Edgar Akhmadeev:

Навскидку и без проверки

https://www.mql5.com/ru/code/1468

Спасибо, но разве там нет перебора в цикле?

//+------------------------------------------------------------------+
// Двоичный поиск. s - искомое значение, a - массив                  |
//+------------------------------------------------------------------+
int bsearch(int s,int & a[]){
   int n=ArraySize(a);
   if(n==0)return(-1);
   if(s<a[0])return(0);
   int r=n-1;
   if(s>a[r])return(r);
   int l=0;
   int m;
   int pm=-1;
   m=(l+r)/2;
      while(m!=pm){        
            if(s<a[m]){
               r=m;
            }
            else if(s>a[m]){
               l=m;
            }
         pm=m;
         m=(l+r)/2;
      }
   int rv=-2;      
      for(int i=r;i>=l;i--){
         if(s>=a[i]){
            rv=i;
            break;
         }
      }
      for(int i=rv-1;i>=0;i--){
            if(a[i]!=a[rv]){
               break;
            }
         rv=i;
      }
   return(rv);
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2650: Фоновая загрузка графиков и улучшения в профилировщике MQL5-кода

Aleksey Vyazmikin, 2020.10.30 23:45

А вот ещё непонятки с хэлпом

StringToInteger

Преобразование строки, содержащей символьное представление числа, 

        в число типа int (целое).



long  StringToInteger( 
   string  value      // строка 
   );
 

число типа int, а функция возвращает число типа long, компилятор ругается.... Ну сделайте ещё функцию 

StringToLong

и все будут довольны...

Алексей, тут long как старшая матрёшка: в неё помещаются младшие. Зачем плодить разные сущности? :-))

Попробуйте так, с явным приведением типа:

   long lVal = StringToInteger("1234567890");
   int iVal = (int)StringToInteger("1234567890");