Добавлены методы векторов и
матриц CopyTicks и CopyTicksRange. Они позволяют легко копировать
массивы тиковых ценовых данных в векторы и матрицы.
bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
Тип копируемых данных указывается в параметре flags при помощи перечисления ENUM_COPY_TICKS. Доступны следующие значения:
COPY_TICKS_INFO = 1,
COPY_TICKS_TRADE = 2,
COPY_TICKS_ALL = 3,
COPY_TICKS_TIME_MS = 1<<8,
COPY_TICKS_BID = 1<<9,
COPY_TICKS_ASK = 1<<10,
COPY_TICKS_LAST = 1<<11,
COPY_TICKS_VOLUME = 1<<12,
COPY_TICKS_FLAGS = 1<<13,
При
выборе нескольких типов данных (доступно только для матриц) порядок
строк в матрице будет соответствовать порядку значений в перечислении.
Добавлены методы Swap для векторов и матриц.
bool vector::Swap(vector &vec);
bool vector::Swap(matrix &vec);
bool vector::Swap(double &arr[]);
bool matrix::Swap(vector &vec);
bool matrix::Swap(matrix &vec);
bool matrix::Swap(double &arr[]);
Каждый
массив, вектор или матрица ссылаются на буфер памяти, который содержит
элементы данного объекта. Метод Swap фактически меняет местами указатели
на данные буферы, не проводя записи элементов в памяти. Поэтому матрица
остается матрицей, а вектор вектором. При обмене матрицы и вектора вы
получите однострочную матрицу с элементами вектора и вектор с элементами
матрицы в плоском представлении (смотрите метод Flat).
void OnStart()
{
matrix a= {{1, 2, 3},
{4, 5, 6}};
Print("a before Swap: \n", a);
matrix b= {{5, 10, 15, 20},
{25, 30, 35, 40},
{45, 50, 55, 60}};
Print("b before Swap: \n", b);
a.Swap(b);
Print("a after Swap: \n", a);
Print("b after Swap: \n", b);
vector v=vector::Full(10, 7);
Print("v before Swap: \n", v);
Print("b before Swap: \n", b);
v.Swap(b);
Print("v after Swap: \n", v);
Print("b after Swap: \n", b);
}
Метод Swap также позволяет работать с динамическими массивами
(массив фиксированного размера в качестве параметра передавать нельзя).
При этом массив может быть любой размерности, но согласованного размера.
Это означает, что общий размер матрицы или вектора должен быть кратен
нулевой размерности массива. Нулевой размерностью массива называется
количество элементов, которые содержатся по первому индексу массива.
Например, для динамического трехмерного массива double array[][2][3]
нулевой размерностью будет произведение размеров второго и третьего
измерения, то есть 2x3=6. Значит, такой массив можно использовать в
методе Swap только с матрицами и векторами, общий размер которых кратен
6: 6, 12, 18, 24 и т.д.
Покажем это на примере:
void OnStart()
{
matrix m= matrix::Full(1, 10, 7.0);
Print("matrix before Swap:\n", m);
double array_small[2][5]= {{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10}};
Print("array_small before Swap:");
ArrayPrint(array_small);
if(m.Swap(array_small))
{
Print("array_small after Swap:");
ArrayPrint(array_small);
Print("matrix after Swap: \n", m);
}
else
{
Print("m.Swap(array_small) failed. Error ", GetLastError());
}
double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
{3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
};
Print("array_static before Swap:");
ArrayPrint(array_static);
if(m.Swap(array_static))
{
Print("array_static after Swap:");
ArrayPrint(array_static);
Print("matrix after Swap: \n", m);
}
else
{
Print("m.Swap(array_static) failed. Error ", GetLastError());
}
double array_dynamic[][10];
ArrayResize(array_dynamic, 3);
ArrayCopy(array_dynamic, array_static);
if(m.Swap(array_dynamic))
{
Print("array_dynamic after Swap:");
ArrayPrint(array_dynamic);
Print("matrix after Swap: \n", m);
}
else
{
Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
}
}