Представляем Pine Script® v6

10 дек, 2024

Сегодня у нас для вас очень важная новость: встречайте Pine Script® v6, обновлённую версию нашего языка программирования для трейдеров! В этой версии мы улучшили и оптимизировали многое из того, о чём вы давно просили. Pine Script® v6 обеспечивает большую эффективность и функциональность, открывая новые горизонты для анализа и торговли.

Давайте взглянем на самые важные обновления в Pine v6, а почитать подробнее про все улучшения вы можете в разделе Release notes.

Инструмент конверсии v6

Как и в случае с предыдущими обновлениями, изменения в Pine v6 не влияют на личные или опубликованные скрипты, написанные на более ранних версиях. Однако все новые функции в будущем будут доступны только в последней версии, поэтому мы рекомендуем перевести ваши скрипты на v6, чтобы воспользоваться новыми возможностями.

Самый простой способ перейти на новую версию — это использовать наш новый инструмент конверсии в v6. Вы можете включить его, выбрав Конвертировать в v6 в меню Управление скриптом Редактора Pine:

Обратите внимание, что не все скрипты можно автоматически перевести на новую версию. В некоторых случаях требуется ручное редактирование, чтобы скрипт работал корректно. Если автоматическое преобразование вызывает ошибки или вы предпочитаете ручной переход, воспользуйтесь нашим удобным руководством.

Динамические запросы

На TradingView у вас есть доступ к десяткам тысяч инструментов, финансовых метрик и экономических индикаторов со всего мира. Функции request.*() позволяют скриптам Pine получать данные для любого доступного инструмента независимо от временного интервала.

Ранее у этих функций были ограничения:

  • Нужно было использовать строку с квалификатором «simple» для указания инструмента и интервала. Это означало, что контекст должен быть известен на первом баре и после уже не мог меняться.
  • Все вызовы request.*() должны были находиться в глобальной области видимости скрипта. Другими словами, любое появление request.*() в коде могло собирать данные только для одного инструмента или интервала, и вызовы этой функции не допускались в циклах, условных структурах или функциях из экспортируемых библиотек.

В Pine Script® v6 эти ограничения сняты: теперь можно использовать строки с квалификатором «series» для определения контекста request.*(), а функции request.*() можно вызывать внутри локальных областей.

Эти изменения позволяют рассчитывать и изменять инструменты на любых исторических барах, запрашивать их данные динамически, создавать коллекции инструментов, запрашивать данные в циклах и выполнять многие другие действия, которые ранее были невозможны. Подробнее читайте в нашем Руководстве пользователя.

В качестве примера давайте рассмотрим работу встроенного индикатора Performance. Он разбивает списки инструментов и интервалов, разделённых запятыми, на массивы, а затем динамически вызывает request.security() внутри циклов для получения данных по каждому инструменту отдельно. Раньше для выполнения такого скрипта требовались многочисленные вызовы input.symbol() и input.timeframe(), а также отдельные вызовы request.security() для каждой комбинации инструментов и интервалов.

Чтобы ещё лучше понять работу динамических запросов, рассмотрим следующие скрипты из учётной записи TradingView:

  • Forex Heatmap. Создаёт ID тикеров для валютных пар на основе пользовательского списка кодов валют. Запрашивает данные динамически для каждой пары в циклах, а затем переносит их в таблицу с цветовой разметкой.
  • Ticker Tape. Создаёт массив ID тикеров из пользовательского списка инструментов. Динамически запрашивает цены и дневные изменения для каждого ID тикера из массива в рамках цикла и с помощью этих данных обновляет бегущую строку.
  • LibraryCOT. Ранее эта библиотека только создавала ID тикеров для запроса данных CFTC Commitment of Traders, так как библиотеки не могли экспортировать функции с вызовами request.*(). Теперь она экспортирует функцию requestCommitmentOfTraders(), которая вызывает request.security() для извлечения данных COT напрямую, что делает работу с библиотекой более эффективной и удобной. Кроме того, ранее все коды отчётов CFTC содержались внутри операторов switch, чтобы возвращать значения типа «simple», что значительно ограничивало доступные тикеры для запроса. С динамическими запросами ID тикеров больше не обязаны иметь квалификатор «simple», что позволяет библиотеке хранить коды отчётов в объекте map и поддерживать больше инструментов.

Оптимизация работы с булевыми значениями

Одним из самых заметных улучшений в Pine Script® v6, которое может быть не сразу заметно, является повышение эффективности работы кода. Мы переработали внутреннюю реализацию булевых значений в Pine и добавили поддержку короткого замыкания (или «ленивой» оценки), что позволяет операциям and и or прекращать оценку выражений, когда они не нужны для определения результата.

Эти изменения улучшают производительность большинства скриптов на TradingView. Разница особенно ощутима в больших скриптах, активно использующих условия и множество булевых значений. Это известно из результатов наших тестов на самых популярных скриптах сообщества с открытым исходным кодом.

Дополнительно ленивая оценка булевых выражений часто позволяет писать более чистый и лаконичный код. Например, если у вас есть условие, зависящее от элементов массива, вам может потребоваться проверить размер массива, чтобы убедиться, что индекс элемента существует — если индекс выходит за границы, скрипт останавливается с ошибкой. В Pine v6 благодаря ленивой оценке можно создать одно условное выражение, проверяющее массив перед доступом к элементу, чего не было в пятой версии:

//@version=6
indicator("Lazy evaluation demo")

//@variable A "bool" array without a fixed size.
array<bool> myArray = array.new<bool>()

// Push a new value into `myArray` when the `close` is above the `open`.
if close > open
    myArray.push(true)

// Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`.
// It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`.
if myArray.size() != 0 and myArray.first()
    label.new(bar_index, high, "Test")

Размер текста и форматирование

Все типы объектов, отображающих текст (box, label и table), теперь поддерживают указание размеров текста в типографских пунктах — тех же единицах, что используются в стандартных текстовых редакторах. Ранее можно было выбирать только между фиксированными константами size.*, такими как size.large (24) и size.huge (36). Теперь же вы можете точно задать размер текста, вплоть до очень крупных значений, недоступных в предыдущих версиях Pine.

Мы также добавили новый параметр text_formatting для этих объектов, позволяющий делать текст курсивным, жирным или одновременно жирным и курсивным.

//@version=6
indicator("Text size showcase", overlay = true)

var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1)

if barstate.islastconfirmedhistory
    t.cell(0, 0, "text_size = size.huge", text_size = size.huge)
    t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)

Удаление заявок стратегии

Пользователи стратегий, возможно, знают, что в Pine v5 стратегия могла симулировать до 9000 сделок, после чего её расчеты останавливались с ошибкой, если не использовать режим тестирования на глубокой истории. Это ограничение особенно неудобно для стратегий с частыми сделками и срабатываниями оповещений.

В Pine Script® v6 стратегии больше не прекращают расчёты после 9000 сделок. Вместо этого она удаляет самые старые заявки, освобождая место для новых. Удалённые заявки не отображаются в Тестере стратегий, но расчёты продолжаются. Чтобы узнать индекс самой старой не удалённой сделки, можно использовать новую переменную strategy.closedtrades.first_index. Индекс можно использовать как аргумент trade_num в вызовах функции strategy.closedtrades.*().

Отрицательные индексы массивов

В Pine v6 функции array.get(), array.set(), array.insert() и array.remove() теперь принимают отрицательные аргументы index, чтобы ссылаться на элементы с конца массива. Это делает работу с массивами более удобной, особенно когда необходимо ссылаться на элементы в обратном порядке. Например, вызов array.get(myArray, -2) возвращает предпоследний элемент массива myArray, что эквивалентно array.get(myArray, array.size(myArray) — 2).

Чтобы оставаться в курсе последних улучшений Pine Script®, следите за разделом Release notes в Руководстве пользователя. Раздел v6 содержит дополнительные изменения, не упомянутые в этом блоге.

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

Команда TradingView

Look first Then leap

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