Таблицы в PineScript предназначены для позиционирования информации в окне индикатора. В отличии от других графических элементов в PineScript, таких как метки и линии, таблицы располагаются без привязки к барам, а относительно границ области видимости (окна) где расположен индикатор или стратегия с вашим скриптом. При этом позиционирование не зависит от overlay=true|false , стратегия это или индикатор, от масштаба и типа графика.
Этот текст в значительной степени вольная адаптация официальной документации к PineScript Tables. За одним исключением — текст по ссылку написан под четвертую версию, а я свои примеры писал уже под PineScript v5.
Очевидно что в PineScript таблица также состоит из колонок, строк и ячеек. Принцип отображения информации идентичен любым другим таблицам.
Видео по таблицам в PineScript
Как обычно я снял видео для своего канала Azzrael Code, где подробнее чем это можно сделать в тексте рассказал что я понял про таблицы в PineScript:
Позиционирование таблиц в PineScript
Как я написал выше, таблицы в PineScript позиционируются через привязку к окну индикатора. Мы можем привязаться к углам, сторонам и центру окна индикатора. При этом при заполнении таблицы её расширение будет происходить в зависимости от привязки.
Режимы размерности ячеек таблиц в PineScript
Существует всего два режима:
- Полностью автоматический размер ячеек, когда размеры ячеек определяются контентом и ширина / высота каждой ячейки зависит от размеров контента в текущей или соседних ячейка.
- Явное указание размера ячейки, когда мы можем прямо в коде указать размер ячейки в процентах к размерам окна индикатора
Содержимое таблицы по последнему бару
Как вам известно из других моих видео про PineScript — скрипт отрабатывает на каждом баре и таблица отображает результаты последнего выполнения нашего индикатора или стратегии. Содержимое таблицы не будет меняться при перемещении по графику цены курсором и масштабировании.
Поэтому эффективно в скриптах использовать:
- var для инициализации таблицы
- заполнять таблицу данным внутри области видимости if barstate.islast
Это снизит нагрузку на сервера TradingView и ускорит ваш скрипт.
Несколько таблиц в одном индикаторе
Это возможно, если вы будете их привязывать к разным точкам. Явного ограничения на количество таблиц в PineScript нет, однако все зависит от количества ячеек в каждой из таблиц.
Создание таблиц в Pine Script
Для создания таблиц в PineScript нужно:
- Создать экземпляр таблицы с методом table.new() , кот. указываются основные параметры таблицы и кот. возвращает указатель на таблицу. Но table.new() НЕ ОТОБРАЖАЕТ таблицу на экране
- Для отображения таблицы её нужно наполнить используя метод table.cell() . При этом в ячейке не обязательно должен быть текст. Это может быть ячейка заданного размера с заливкой, например.
При создании таблицы через метод table.new в PineScript обязательны три аргумента — позиция и количество строк и столбцов. Остальные параметры указывать при создании таблицы можно но не обязательно.
Все параметры таблицы можно задать/изменить и после создания таблицы через table.set_*() , за исключением количества строк и столбцов!
Наполнение таблиц
Для наполнения ранее созданной таблицы мы используем метод table.cell где обязательны три аргумента — идентификатор таблицы и координаты ячейки (номер столбца и колонки начиная с 0). Текст указывать не обязательно.
При использовании table.cell вы переопределяете ВСЕ свойства ячейки с этими координатами, которые, возможно, были определены выше в коде скрипта PineScript.
Большинство параметров ячейки можно изменить после создания через table.cell_set_*() .
Примеры использования таблиц в PineScript
Ниже несколько примеров с исходным кодом для PineScript v5. Обратите внимание что вы в статье есть видео в котором я каждый из примеров разобрал куда более подробно чем в тексте. В том же видео есть и примеры кот в тексте оформлять было не эффективно. Поэтому посмотрите видео, а также остальные видео в моем плейлисте про PineScript и TradingView.
Пример: Одно значение в углу окна
PineScript Tables — простая таблица в верхнем правом углу окна индикатора
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Azzrael //@version=5 indicator("Using Tables", overlay=true) // https://azzrael.ru/pinescript-tables // https://www.tradingview.com/pine-script-docs/en/v4/essential/Tables.html rsi = ta.rsi(close, 14) // rsi ДОЛЖЕН быть за пределами if чтобы корректно считать по пред барам var tbl = table.new(position.top_right, 1, 1) if barstate.islast // должны использовать явное приведение типов // в PineScript v4 tostring = PineScript v5 str.tostring table.cell(tbl, 0, 0, str.tostring(rsi) ) |
Обратите внимание что отображаемое в таблице значение мы рассчитываем за пределами if barstate.islast.
Пример: Окраска условное ячеек таблиц и текста
1 2 3 4 5 |
if barstate.islast col = rsi > 70 ? color.green : (rsi < 30 ? color.red : color.white) // должны использовать явное приведение типов // в PineScript v4 tostring = PineScript v5 str.tostring table.cell(tbl, 0, 0, str.tostring(rsi), text_color=col ) |
Пример: Таблица значений осциляторов высших таймфремов
Здесь немного массивов и широкий простор для оптимизации, но как пример использования таблиц сойдет. Подробности смотри в видео.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
fn1(tf) => request.security(syminfo.tickerid, tf, math.round(ta.rsi(close, 14))) fn2(tf) => // тут автор накосячил (или нет?). Внимательный читатель найдет ошибку (или нет?) и напишет о ней в комментах ;) [_, _, s] = ta.macd(close, 12, 26, 9) request.security(syminfo.tickerid, tf, math.round(s, 2)) var tbl = table.new(position.top_right, 3, 30, bgcolor=color.white) var timeframes = array.from(timeframe.period, '15', '60', 'D', 'W') rsi_arr = array.from(fn1(timeframe.period), fn1('15'), fn1('60'), fn1('D'), fn1('W')) rsi_atr = array.from(fn2(timeframe.period), fn2('15'), fn2('60'), fn2('D'), fn2('W')) if barstate.islast for i=0 to array.size(timeframes) - 1 table.cell(tbl, 0, i, array.get(timeframes, i), text_halign=text.align_right) val_rsi = array.get(rsi_arr, i) table.cell(tbl, 1, i, str.tostring(val_rsi), text_halign=text.align_left, bgcolor= val_rsi > 60 ? color.new(color.green, 70) : (val_rsi < 40) ? color.new(color.red, 70) : na ) val_atr = array.get(rsi_atr, i) table.cell(tbl, 2, i, str.tostring(val_atr), text_halign=text.align_left, bgcolor= val_atr > 0 ? color.new(color.green, 70) : (val_atr < 0) ? color.new(color.red, 70) : na ) |
Пример: Таблица heatmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
fn(ticker) => request.security(ticker, 'D', open[1]/close) var per = 3 var tickers = array.from('INTC', 'AAPL', 'MSFT', 'AMZN', 'TSLA', 'GOOG', 'FB', 'NVDA', 'BRKB') vals = array.from(fn('INTC'), fn('AAPL-RM'), fn('MSFT-RM'), fn('AMZN-RM'), fn('TSLA-RM'), fn('GOOG-RM'), fn('FB-RM'), fn('NVDA-RM'), fn('BRKB-RM')) var size = array.size(tickers) var tbl = table.new(position.middle_center, 30, 30, border_width=3) if barstate.islast for i=0 to array.size(tickers)-1 col = math.ceil((i+1)/per)-1 row = i % per ticker = array.get(tickers, i) val = array.get(vals, i) table.cell(tbl, col, row, ticker, text_halign=text.align_center, bgcolor=val > 1 ? color.red:color.green, text_color=color.white, text_size=size.large) |
Если ты интересуешься PineScript то больше контента у меня на канале в плейлисте PineScript. Я практически живу в комментах на ютюбе, поэтому если тебе есть что сказать по теме, спросить или дополнить, то прошу в комментарии. Я только разбираюсь с PineScript, поэтому вполне возможно что ты лучше меня знаешь то о чем я рассказываю, если так, то смело поправляй меня и пиши как все должно было быть на самом деле…
Константин 2022-01-25