MQL4 - automated forex trading   /  

Code Base

Code Base  Библиотеки  ArrayEx Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый код

Этот скрипт для
MetaTrader 4

Мобильный трейдинг!
Купите лицензию и торгуйте мобильно

Имя:
ArrayEx
Автор: Amba (19.11.2009 15:16)
Скачано: 126
Скачать:
 Sort_Array.mq4 (3.1 Kb) View
 ArrayEx.mq4 (5.6 Kb) View

Описание:

Рассматривается двумерный массив значений типа double в терминах БД. Массив состоит из С колонок и R строк. Подразумевается, что значения в колонке нормализованы одинаково.

Основные реализованные функции:

1. Array.Sort(double &a[], int order[], int sort.mode=MODE_QUICK3)

- сортировка массива в произвольном порядке колонок, в произвольном направлении каждой колонки. Реализован алгоритм сортировки quicksort-3way (http://www.sorting-algorithms.com/quick-sort-3-way). Краткое описание: время сортировки стремится к O(R·lg(R)) (быстрый, для сравнения: пузырьковый метод сортировки имеет время порядка O(R^2)), взаимный порядок строк с одинаковыми значениями ключа сортировки не сохраняется (нестабильный), сортировка "почти упорядоченных" данных занимает меньшее время в сравнении с random-последовательностью (адаптивный). Здесь a - упорядочиваемый массив, order - перечень колонок упорядочивания, с указанием направления сортировки. Направление указывается знаком. С этой целью нумерация колонок по абсолютному значению начинается с 1 (!). Например, задать упорядочивание массива по a[0] ASC, a[3] DESC, a[2] ASC, a[5] DESC

int order[] = { 1, -4, 3, -6};
Array.Sort(a, order);

2. Array.Group(double &a[][], int groups[], int sums[], double &dest[][])

- группировка строк массива с совпадающими ключами, опционно - с вычислением сумм в указываемых дополнительно колонках. Здесь a и groups - см. выше по аналогии, sums - перечень суммируемых колонок (нумерация также с 1; хотя насущной необходимости в этом не было, ввел по аналогии с массивами групп и сортировки во избежание дополнительной путаницы), dest - выходной массив. Перед суммированием массив сортируется автоматически (дополнительной сортировки перед вызовом процедуры не требуется).

double a[10000][9];

...... // work with array

double d[][5];

int g[] = { -1, 2, 5}, s[] = { 6, 7};

Array.Group(a, g, s, d);

3. Array.Select(double &a[][], double & filter[][], double & dest[][])

- выборка из массива подмножества, удовлетворяющего заданным критериям. Здесь a и dest - см. выше по аналогии, filter - массив состоящий из трех колонок и произвольного количества строк, описывающий набор условий. Условия простейшие - нахождение значения колонки в диапазоне минимального и максимального значений. filter[1..C][0] - номер колонки; filter[][1] - min, filter[][2] - max. Требование к dest - количество колонок равное С. Строки добавятся автоматически. Исходный массив не сортируется (простой перебор).

При необходимости можно воспользоваться служебными функциями Array.Swap(a, i1, i2) (меняет местами строки массива a с номерами i1 и i2) и Array.Compare(a, i1, i2, order) (сравниваются строки i1 и i2 массива а в разрезе указанного набора (по ключам) order, возвращаемые значения - {-1| 0| 1}).

Прилагается скрипт, иллюстрирующий возможности библиотеки.

Установка:

experts\libraries\ArrayEx.mq4

experts\scripts\Sort_Array.mq4

4 комментария  Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый комментарий
zigan писал(а):

Спасибо, нужная библиотека.

Если можно, поясните пож-ста, что означает: значения в колонке нормализованы одинаково.

Вообще, для безошибочного сравнения значений типа double оба сравниваемых значения должны быть нормализованы при помощи функции NormalizeDouble(data, digits). Поэтому при заполнении массива следует избегать выражений типа a[2][3]=1/3; особенно это касается например расчетных значений цены - что-то типа Close[0]+(Close[0]-Close[1]) * 1.618. Подобные выражения нужно нормализовывать - NormalizeDouble( Close[0]+(Close[0]-Close[1]) * 1.618, Digits). Рассматривая массив как базу данных, необходимо обеспечить в одной колонке данные одинаковой размерности - только int, только date, только double c фиксированной точностью. Хотя выполнение алгоритмов от этого не пострадает, смешение в одной колонке разных сущностей (например дата и цена) - не имеет смысла.


20.11.2009 18:46 Amba

Спасибо, нужная библиотека.

Если можно, поясните пож-ста, что означает: значения в колонке нормализованы одинаково.

20.11.2009 14:11 zigan
basile писал(а):

ЕЕЕЕМАЕ........

Это должно означать что-то типа "Нифига! Дайте две" ?


20.11.2009 12:58 Amba

ЕЕЕЕМАЕ........

20.11.2009 08:11 basile