Матрицы теперь в Pine Script®

5 апр, 2022

Количественные аналитики теперь могут использовать матрицы в своих скриптах! Матрицы — новый объект со своим пространством имён и 49 функциями, позволяющими создавать и изменять их, а также выполнять общую матричную алгебру.

Функции, связанные с матрицами, находятся в пространстве имён matrix.*. Простую матрицу можно создать, вызвав функцию matrix.new<type>(rows, columns, initial_value),  например:

// Создаёт матрицу размером 2x3 (2 строки x 3 столбца) типа "int" с начальными значениями равными нулю.
m = matrix.new<int>(2, 3, 0)

Матрицу можно заполнить с помощью функции matrix.set(), чтобы установить значение для конкретного её элемента, или matrix.fill(), чтобы заполнить все элементы матрицы одним значением. Матрица может быть объявлена с любым поддерживаемым в Pine типом (int, float, bool, color, string, line, label, box, table, linefill), если этот тип указан внутри скобок «<>» функции matrix.new<type>(). Функции матричной алгебры доступны только для числовых типов int и float; остальные функции разрешены для всех типов матриц.

Матричные функции

matrix.new<type> Создает новый матричный объект. Все элементы в матрице должны иметь тип, указанный в «<type>».
matrix.row() Создает одномерный массив из элементов строки матрицы.
matrix.col() Создает одномерный массив из элементов столбца матрицы.
matrix.get() Возвращает элемент матрицы с указанным индексом.
matrix.set() Присваивает значение элементу матрицы. 
matrix.rows() Возвращает количество столбцов в матрице.
matrix.columns() Возвращает количество строк в матрице.
matrix.elements_count() Возвращает количество элементов в матрице.
matrix.add_row() Добавляет строку в матрицу. Строка может состоять из na значений, или для вставки строки может использоваться массив.
matrix.add_col() Добавляет столбец в матрицу. Столбец может состоять из na значений, или для вставки строки может использоваться массив.
matrix.remove_row() Удаляет строку матрицы и возвращает массив, содержащий значения удаленной строки.
matrix.remove_col() Удаляет столбец матрицы и возвращает массив, содержащий значения удаленного столбца.
matrix.swap_rows() Меняет местами строки.
matrix.swap_columns() Меняет местами столбцы.
matrix.fill() Заполняет прямоугольную область в матрице в указанных индексах.
matrix.copy() Создаёт копию матрицы.
matrix.submatrix() Извлекает подматрицу в пределах указанных индексов.
matrix.reverse() Меняет порядок строк и столбцов в матрице на обратный. Первая строка и первый столбец становятся последними, а последние становятся первыми.
matrix.reshape() Перестраивает матрицу, меняя её размерность.
matrix.concat() Добавляет элементы одной матрицы к другой.
matrix.sum() Возвращает новую матрицу, полученную в результате суммы двух матриц или матрицы и скаляра (числового значения).
matrix.diff() Возвращает новую матрицу, полученную в результате вычитания матриц или матрицы и скаляра (числового значения).
matrix.mult() Возвращает новую матрицу, полученную в результате произведения между матрицами, или между матрицей и скаляром (числовым значением), или между матрицей и вектором (массивом значений).
matrix.sort() Переупорядочивает строки в матрице в соответствии с порядком сортировки значений в столбце.
matrix.avg() Вычисляет среднее значение всех элементов матрицы.
matrix.max() Возвращает наибольшее значение из элементов матрицы.
matrix.min() Возвращает наименьшее значение из элементов матрицы.
matrix.median() Вычисляет медиану («среднее» значение) элементов матрицы.
matrix.mode() Вычисляет моду матрицы, наиболее часто встречающееся значение из элементов матрицы. Когда несколько значений встречаются одинаково часто, функция возвращает наименьшее из этих значений.
matrix.pow() Вычисляет результат возведения матрицы в степень.
matrix.det() Возвращает определитель квадратной матрицы.
matrix.transpose() Создает новую транспонированную версию матрицы, меняя местами индекс строки и столбца у каждого элемента.
matrix.pinv() Возвращает псевдообратную матрицу.
matrix.inv() Возвращает обратную матрицу.
matrix.rank() Вычисляет ранг матрицы.
matrix.trace() Вычисляет след матрицы (сумму элементов главной диагонали).
matrix.eigenvalues() Возвращает массив собственных значений квадратной матрицы.
matrix.eigenvectors() Возвращает матрицу собственных векторов, в которой каждый столбец является собственным вектором матрицы.
matrix.kron() Возвращает произведение Кронекера для двух матриц.
matrix.is_zero() Определяет, равны ли нулю все элементы матрицы.
matrix.is_identity() Определяет, является ли матрица единичной (имеет элементы с единицами на главной диагонали и нулями вне её).
matrix.is_binary() Определяет, является ли матрица двоичной (когда все элементы матрицы равны 0 или 1).
matrix.is_symmetric() Определяет, является ли квадратная матрица симметричной (когда элементы симметричны относительно главной диагонали).
matrix.is_antisymmetric() Определяет, является ли матрица антисимметричной (ее транспонирование равно отрицательному).
matrix.is_diagonal() Определяет, является ли матрица диагональной (когда в элементы вне главной диагонали равны нулю).
matrix.is_antidiagonal() Определяет, является ли матрица антидиагональной (когда все элементы за пределами побочной диагонали равны нулю).
matrix.is_triangular() Определяет, является ли матрица треугольной (если все элементы выше или ниже главной диагонали равны нулю).
matrix.is_stochastic() Определяет, является ли матрица стохастической
matrix.is_square() Определяет, является ли матрица квадратной (имеет одинаковое количество строк и столбцов).

Некоторые существующие функции теперь также поддерживают матрицы: оператор for…in  позволяет итерироваться по строкам матрицы, а str.tostring() преобразует матрицу в ее строковое представление.

В приведенном ниже примере мы создаем матрицу и сортируем её элементы в порядке возрастания значений первого столбца. Затем мы отображаем матрицу в виде таблицы:

//@version=5
indicator("Matrix Example", overlay = true)

// Создаём матрицу 2x2 имеющую `na` значения по умолчанию. 
m1 = matrix.new<float>(2, 2, na)

// Присваиваем значения элементам матрицы. Первый аргумент - объект матрицы, созданный ранее, второй - номер строки (индексация начинается с нуля для первой строки), третий - номер столбца (индексация начинается с нуля для первого столбца), четвертый - значение, которое присваивается элементу.
matrix.set(m1, 0, 0, 3)
matrix.set(m1, 0, 1, 4)
matrix.set(m1, 1, 0, 1)
matrix.set(m1, 1, 1, 2)

// Создаём новую матрицу с помощью копирования значений из матрицы m1.
m2 = matrix.copy(m1)

// Сортируем строки матрицы `m2` на основе значений первого столбца в порядке возрастания. 
matrix.sort(m2, 0, order.ascending)

// Отображаем элементы матрицы в таблице.
var t = table.new(position.top_right, 2, 2, color.green)
if barstate.islastconfirmedhistory
    table.cell(t, 0, 0, "Original Matrix:")
    table.cell(t, 0, 1, str.tostring(m1))
    table.cell(t, 1, 0, "Sorted Matrix:")
    table.cell(t, 1, 1, str.tostring(m2))

Следующие публикации являются примерами скриптов, опубликованных на TradingView участниками сообщества PineCoders, которые помогают нам тестировать новые функции в языке Pine Script®:

Библиотека Function Polynomial Fit от RicardoSantos

Библиотека Ordinary Least Squares от lejmer

Discounted Price Probability от HeWhoMustNotBeNamed

Мы надеемся, что эти часто запрашиваемые функции окажутся для вас полезны. Пожалуйста, продолжайте присылать нам свои отзывы и предложения по улучшению. Мы создаем TradingView для вас и всегда рады услышать ваше мнение.

Чтобы быть в курсе всех нововведений Pine, смотрите раздел Release notes нашего руководства пользователя Pine. Наши разработчики из команды PineCoders также сообщают об обновлениях в Telegram канале Squawk Box, в Twitter и в публичном чате Pine Script® на TradingView.

Look first Then leap

Мы создали TradingView, чтобы вы могли пользоваться самыми крутыми функциями.
Открыть график