forked from rosh/MQL5Book
85 lines
3.3 KiB
MQL5
85 lines
3.3 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| ArraySearch.mq5 |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
| |
#define PRTS(A) Print(#A, "=", (string)(A) + " / status:" + (string)GetLastError())
| |
| |
//+------------------------------------------------------------------+
| |
//| Fill array with elements and keep it sorted by ArrayBsearch |
| |
//+------------------------------------------------------------------+
| |
void populateSortedArray(const int limit)
| |
{
| |
double numbers[]; // the array to fill
| |
double element[1]; // new value to insert
| |
| |
ArrayResize(numbers, 0, limit); // allocate capacity beforehand
| |
| |
for(int i = 0; i < limit; ++i)
| |
{
| |
// generate a random number
| |
element[0] = NormalizeDouble(rand() * 1.0 / 32767, 3);
| |
// find where to place it inside the array
| |
int cursor = ArrayBsearch(numbers, element[0]);
| |
if(cursor == -1)
| |
{
| |
if(_LastError == 5053) // empty array
| |
{
| |
ArrayInsert(numbers, element, 0);
| |
}
| |
else break; // error
| |
}
| |
else
| |
if(numbers[cursor] > element[0]) // need to insert at cursor
| |
{
| |
ArrayInsert(numbers, element, cursor);
| |
}
| |
else // (numbers[cursor] <= value) // need to insert after cursor
| |
{
| |
ArrayInsert(numbers, element, cursor + 1);
| |
}
| |
}
| |
ArrayPrint(numbers, 3);
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
int array[] = {1, 5, 11, 17, 23, 23, 37};
| |
// indices 0 1 2 3 4 5 6
| |
int data[][2] = {{1, 3}, {3, 2}, {5, 10}, {14, 10}, {21, 8}};
| |
// indices 0 1 2 3 4
| |
int empty[];
| |
| |
PRTS(ArrayBsearch(array, -1)); // 0
| |
PRTS(ArrayBsearch(array, 11)); // 2
| |
PRTS(ArrayBsearch(array, 12)); // 2
| |
PRTS(ArrayBsearch(array, 15)); // 3
| |
PRTS(ArrayBsearch(array, 23)); // 5
| |
PRTS(ArrayBsearch(array, 50)); // 6
| |
| |
PRTS(ArrayBsearch(data, 7)); // 2
| |
PRTS(ArrayBsearch(data, 9)); // 2
| |
PRTS(ArrayBsearch(data, 10)); // 3
| |
PRTS(ArrayBsearch(data, 11)); // 3
| |
PRTS(ArrayBsearch(data, 14)); // 3
| |
| |
PRTS(ArrayBsearch(empty, 0)); // -1, 5053, ERR_ZEROSIZE_ARRAY
| |
| |
populateSortedArray(80);
| |
/*
| |
example output (will differ on every run due to randomization)
| |
[ 0] 0.050 0.065 0.071 0.106 0.119 0.131 0.145 0.148 0.154 0.159
| |
0.184 0.185 0.200 0.204 0.213 0.216 0.220 0.224 0.236 0.238
| |
[20] 0.244 0.259 0.267 0.274 0.282 0.293 0.313 0.334 0.346 0.366
| |
0.386 0.431 0.449 0.461 0.465 0.468 0.520 0.533 0.536 0.541
| |
[40] 0.597 0.600 0.607 0.612 0.613 0.617 0.621 0.623 0.631 0.634
| |
0.646 0.658 0.662 0.664 0.670 0.670 0.675 0.686 0.693 0.694
| |
[60] 0.725 0.739 0.759 0.762 0.768 0.783 0.791 0.791 0.791 0.799
| |
0.838 0.850 0.854 0.874 0.897 0.912 0.920 0.934 0.944 0.992
| |
*/
| |
}
| |
//+------------------------------------------------------------------+
|