forked from rosh/MQL5Book
104 lines
3.7 KiB
MQL5
104 lines
3.7 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| ArrayAsSeries.mq5 |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
| |
#define PRTS(A) Print(#A, "=", (string)(A) + " / status:" + (string)GetLastError())
| |
#define LIMIT 10
| |
| |
//+------------------------------------------------------------------+
| |
//| Helper function to fill array with incremented indices |
| |
//+------------------------------------------------------------------+
| |
template<typename T>
| |
void indexArray(T &array[])
| |
{
| |
for(int i = 0; i < ArraySize(array); ++i)
| |
{
| |
array[i] = (T)(i + 1);
| |
}
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Example class for array of objects |
| |
//+------------------------------------------------------------------+
| |
class Dummy
| |
{
| |
int data[];
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
double array2D[][2];
| |
double fixed[LIMIT];
| |
double dynamic[];
| |
MqlRates rates[];
| |
Dummy dummies[];
| |
| |
// allocate memory
| |
ArrayResize(dynamic, LIMIT);
| |
| |
// fill arrays with test data: 1, 2, 3,...
| |
indexArray(fixed);
| |
indexArray(dynamic);
| |
| |
// since all arrays are declared in the program,
| |
// they are NOT real series and will produce false
| |
PRTS(ArrayIsSeries(array2D)); // false
| |
PRTS(ArrayIsSeries(fixed)); // false
| |
PRTS(ArrayIsSeries(dynamic)); // false
| |
PRTS(ArrayIsSeries(rates)); // false
| |
// we'll see ArrayIsSeries=true in indicators (Part V)
| |
| |
PRTS(ArrayGetAsSeries(array2D)); // false, can not be true
| |
| |
// all the next are false by default,
| |
// because they are declared in this MQL-program
| |
PRTS(ArrayGetAsSeries(fixed)); // false
| |
PRTS(ArrayGetAsSeries(dynamic)); // false
| |
PRTS(ArrayGetAsSeries(rates)); // false
| |
PRTS(ArrayGetAsSeries(dummies)); // false
| |
| |
// show elements in current order
| |
ArrayPrint(fixed, 1);
| |
ArrayPrint(dynamic, 1);
| |
/*
| |
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
| |
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
| |
*/
| |
| |
// error: parameter conversion not allowed
| |
// PRTS(ArraySetAsSeries(array2D, true));
| |
| |
// warning: cannot be used for static allocated array
| |
PRTS(ArraySetAsSeries(fixed, true)); // false
| |
| |
// next 3 are ok
| |
PRTS(ArraySetAsSeries(dynamic, true)); // true
| |
PRTS(ArraySetAsSeries(rates, true)); // true
| |
PRTS(ArraySetAsSeries(dummies, true)); // true
| |
| |
// now check what's changed: first "real" series attribute
| |
PRTS(ArrayIsSeries(fixed)); // false
| |
PRTS(ArrayIsSeries(dynamic)); // false
| |
PRTS(ArrayIsSeries(rates)); // false
| |
PRTS(ArrayIsSeries(dummies)); // false
| |
| |
// second, check "as series" index order
| |
PRTS(ArrayGetAsSeries(fixed)); // false
| |
PRTS(ArrayGetAsSeries(dynamic)); // true
| |
PRTS(ArrayGetAsSeries(rates)); // true
| |
PRTS(ArrayGetAsSeries(dummies)); // true
| |
| |
// check how new order is applied for elements
| |
ArrayPrint(fixed, 1); // remains the same
| |
ArrayPrint(dynamic, 1); // altered order is in effect
| |
/*
| |
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
| |
10.0 9.0 8.0 7.0 6.0 5.0 4.0 3.0 2.0 1.0
| |
*/
| |
}
| |
//+------------------------------------------------------------------+
|