Download MetaTrader 5

simple Array Operations - need help

To add comments, please log in or register
forroxs
32
forroxs  

Hi, 

I want to search some values in a array by using ArrayBsearch and get the position of the matching values as indices.  

Here is my example with two identical arrays.

In my opinion I should get a row of "index" from 0 to 9 because the elements of "matrix" and "matrix_sort" are identical.

But I don't get the expected result...

 

Please simply copy and past into a script and execute.

Than you will find the result in ...\MQL5\Files in a file "Array_Operation"

 

 Here my example:

//+------------------------------------------------------------------+ 

 void OnStart()

  {

double matrix[10]; ArrayInitialize(matrix,0);

double matrix_sort[10]; ArrayInitialize(matrix_sort,0);

double matrix_neu[10]; ArrayInitialize(matrix_neu,0);

int    index[10]; ArrayInitialize(index,0);

//--- Open log file

int fileHandle=FileOpen("Array_Operation",FILE_WRITE|FILE_TXT|FILE_SHARE_READ|FILE_UNICODE);

FileWrite(fileHandle,"--- Start");

for (int i=0; i<10; i++)    

   {

     matrix[i]=i+rand();

     FileWrite(fileHandle,"matrix: ",matrix[i]);

   }

FileWrite(fileHandle,"---"); 

 ArrayCopy(matrix_sort, matrix, 0, 0, WHOLE_ARRAY);

for (int i=0; i<10; i++) 

 {   

   FileWrite(fileHandle,"matrix_sort: ",matrix_sort[i]);

 }

 FileWrite(fileHandle,"---");       

for (int i=0; i<10; i++)

   {

    index[i] = ArrayBsearch(matrix, matrix_sort[i]);

    FileWrite(fileHandle,"index : ",index[i]);

   }

// close log file

   FileClose(fileHandle); 

  }

//+------------------------------------------------------------------+

 

The arrays "matrix" and "matrix_sort" are identical. (for testing I don't sort the values in matrix_sort)

So there indices are identical too. 

Now If I use " ArrayBsearch(matrix, matrix_sort[i]); " to get the indices from "matrix".

But I don't get the row of indices "0 1 2 3 4 5 6 7 8 9", I only get something else....

 

Please can anybody copy into a script and execute ?

In ...\MQL5\Files\  you find a file named "Array_Operation" with the result.

Where is my mistake ???

 

 

PS: is there any library which make the handling of arrays more easy ?

      (I only know the Lib posted by bobsley)

Andrey Voytenko
23973
Andrey Voytenko  

ArrayBsearch works only with sorted arrays!!! Read Help https://www.mql5.com/en/docs/array/arraybsearch

void OnStart()
  {
   double matrix[10];
   ArrayInitialize(matrix,0);

   double matrix_sort[10];
   ArrayInitialize(matrix_sort,0);

   double matrix_neu[10];
   ArrayInitialize(matrix_neu,0);

   int index[10];
   ArrayInitialize(index,0);

//--- Open log file

   int fileHandle=FileOpen("Array_Operation",FILE_WRITE|FILE_TXT|FILE_SHARE_READ|FILE_UNICODE);
   FileWrite(fileHandle,"--- Start");
   for(int i=0; i<10; i++)
     {
      matrix[i]=i+rand();
      FileWrite(fileHandle,"matrix: ",matrix[i]);
     }

   FileWrite(fileHandle,"---");

   ArrayCopy(matrix_sort,matrix,0,0,WHOLE_ARRAY);

   ArraySort(matrix_sort);

   for(int i=0; i<10; i++)
     {
      FileWrite(fileHandle,"matrix_sort: ",matrix_sort[i]);
     }
   FileWrite(fileHandle,"---");

   for(int i=0; i<10; i++)
     {
      index[i]=ArrayBsearch(matrix_sort,matrix_sort[i]);
      FileWrite(fileHandle,"index : ",index[i]);
     }
//--- close log file
   FileClose(fileHandle);
  }
//+------------------------------------------------------------------+

Result: 

index : 0
index : 1
index : 2
index : 3
index : 4
index : 5
index : 6
index : 7
index : 8
index : 9

Documentation on MQL5: Array Functions / ArrayBsearch
  • www.mql5.com
Array Functions / ArrayBsearch - Documentation on MQL5
forroxs
32
forroxs  
avoitenko:

ArrayBsearch works only with sorted arrays!!! Read Help https://www.mql5.com/en/docs/array/arraybsearch

Result: 

 

 

thank you for your comment,

you are right, the array is to be sorted first.

But it is working only with the same array:

 

      index[i]=ArrayBsearch(matrix_sort,matrix_sort[i]);

My problem is to find the unsorted indices after sorting the array:

      index[i]=ArrayBsearch(matrix, matrix_sort[i]);

 This is gives me the same strange results...

I need the indices from the original array for every element - after sorting ! 

Is there any possibility ?

 

application example:

 I have an array with prices:

  index:  0 1 2 3 4

  price:  3 9 5 7 1 

Now I want to get the indices of the top 3 high price for further calculation.

My sugestion was to sort the price array and compare it to the original array with "ArrayBsearch()" to get the indices.

  index: 4 0 2 3 1

  price: 1 3 5 7 9

Now I can simply use the last 3 indices for further calculation...

 

.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 

Any Idea how to implement in MQL5?

I know in ArrayObj.mqh are different "Search" methods which give me the position of the found element but I'm new in OOP.... 

... how can I fill the "matrix" ??? 

#include <Arrays\ArrayObj.mqh>


//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

CArrayObj *matrix = new CArrayObj;

CArrayObj *matrix_sort = new CArrayObj;


for (int i=0; i<10; i++)    

   {

     matrix.Insert(CObject *element,int pos);

   }

Andrey Voytenko
23973
Andrey Voytenko  
Try my function ArrayBsearch2
...
   for(int i=0; i<10; i++)
     {
      index[i]=ArrayBsearch2(matrix,matrix_sort[i]);
      FileWrite(fileHandle,"index : ",index[i]);
     }
...

//+------------------------------------------------------------------+
//|   return index array or -1                                       |
//+------------------------------------------------------------------+
int ArrayBsearch2(const double &array[],double value)
  {
   int len=ArrayRange(array,0);
   for(int i=0; i<len; i++)
     {
      if(array[i]==value)return(i);
     }
   return(-1);
  }
//+------------------------------------------------------------------+

forroxs
32
forroxs  

thx,

realy very helpful!

This is exactly what I need.

 Thank you very much.

 

 

 

PS: if any other user has similar problem I propose this too:  https://www.mql5.com/en/articles/351

      there is the applied case of the problem with the OOP solution ...

The Basics of Object-Oriented Programming
  • 2011.12.07
  • Dmitry Fedoseev
  • www.mql5.com
You don't need to know what are polymorphism, encapsulation, etc. all about in to use object-oriented programming (OOP)... you may simply use these features. This article covers the basics of OOP with hands-on examples.
To add comments, please log in or register