Pine script что это

Обновлено: 04.07.2024

Pine Script — скриптовый язык программирования для создания индикаторов и стратегий для платформы плейлисте TradingView + Pine Script.

Скрипты пишутся во встроенном в платформу редакторе, исходные коды также сохраняются на платформе и могут быть как публичными, так и приватными.

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

Результат работы скрипта это либо вывод информации на график (индикатор) или совершение сделок (стратегия).

Объект рисования line

Позволяет рисовать на графике линии. Чтобы создать объект line, используйте функцию line.new . Пример простейшего скрипта, который рисует линию, соединяющую точки значений high на текущем баре и low на 10 баре в истории:


Объекты line можно изменять и удалять , используя соответствующие функции семейства line.* . Пример более сложного скрипта с использованием line — Zig Zag .

Обратите внимание, что на данный момент мы можем отображать на графике суммарно не более 50–55 объектов рисования одного типа (label или line) на скрипт. Это намеренное ограничение , призванное предотвратить чрезмерные нагрузки на серверы.

Новые типы данных line и label значительно расширяют возможности Pine Script, позволяя реализовать сложную логику популярных индикаторов в пользовательских скриптах. С примерами вы можете ознакомиться в документации .

Серии

Основной тип данных, используемый в сценариях Pine, называется series (серия) . Это непрерывный список значений, который тянется во времени от текущей свечи и где существует одно значение для каждой свечи. Хотя эта структура может напоминать многим о массиве, ряд Pine совершенно другой, и мышление в терминах массивов будет вредно для понимания этой ключевой концепции Pine.

Отличие study или strategy

study инициализирует Индикатор, strategy — Стратегию.

Индикатор обязан использовать хотя бы одну функцию для вывода информации на график (напр. plot). Стратегия обязана использовать хотя бы одну функцию для совершения сделки (напр. strategy.entry() ).

Стратегия — скрипт предназначенный для совершения сделок. Как в реальном времени так и для тестирования в тестере стратегий TradingView на исторических данных. Стратегия также может что-то выводить на график (например значки о совершенных сделках). Индикатор предназначен для вывода информации на график инструмента и не может совершать сделки, но зато потребляет меньше ресурсов и работает быстрее.

И Стратегия и Индикатор могут создавать Алерты.

Редактор Pine

В Pine Editor вы будете работать над своими сценариями. Чтобы открыть его, нажмите на вкладку Pine Editor в нижней части графика TradingView. Это откроет окно редактора. Мы создадим наш первый рабочий скрипт Pine. Начните с вызова выпадающего меню « Новый » в правом верхнем углу редактора и выберите « Пустой скрипт индикатора» . Затем скопируйте предыдущий пример сценария, выделите весь код, уже находящийся в редакторе, и замените его примером сценария. Нажмите « Сохранить» , выберите имя и нажмите « Добавить на график» . Индикатор MACD появится в отдельной панели под графиком.

Здесь же вы можете изменить код скрипта. Например, измените последнюю строку color.orange на color.fuchsia . При сохранении скрипта изменение будет отражено на панели индикатора. Ваш первый скрипт Pine запущен!

Type casting

В Pine Script есть механизм автоматического приведения типов. На следующем рисунке стрелка обозначает способность компилятора Pine автоматически приводить один тип к другому:



Например:

Типом series параметра функции plotshape является series bool . Но функция вызывается с close аргументом типа float . Типы не совпадают, но правильное преобразование выполняет автоматическое правило приведения типов серии float → series bool (см. Диаграмму).

Иногда не существует автоматического правила приведения типов X → Y. Для этих случаев функции явного приведения типов были введены в Pine v4. Вот они:

Вот пример:

Этот код не компилируется с ошибкой: Add to Chart operation failed, reason: line 4: Cannot call sma with arguments (series[float], const float); available overloads: sma(series[float], integer) => series[float] ; Компилятор говорит, что, хотя тип len переменной const float , sma функция ожидает integer . Не существует автоматического приведения типов из const с плавающей точкой в целое , но можно использовать явную функцию приведения типа:

Комментарии

Pine Script поддерживает однострочные комментарии. Любой текст от символа // до конца строки считается комментарием.

Пример:

Редактор Pine имеет горячую клавишу для комментариев Ctrl + / . Выделите фрагмент кода и нажмите Ctrl + / , чтобы комментировать / раскомментировать целые блоки кода одновременно.

Комментарии не могут быть помещены в середине оператора, длинною несколько строк.

Идентификаторы

Идентификаторы — это имена, используемые для пользовательских переменных и функций. Они могут состоять из:

  • заглавные ( A-Z ) или строчные ( a-z ) буквы,
  • подчеркивание ( _ ),
  • цифры ( 0-9 ).

Идентификатор не может начинаться с цифры. Идентификаторы чувствительны к регистру. Вот несколько примеров допустимых идентификаторов:

Стоимость использования Pine Script

Использование Pine Script бесплатно на всех тарифных планах TradingView. На некоторых тарифах вы можете ограничивать публичность скриптов (вероятно для монетизации ваших скриптов).

Перенос строки

Любая слишком длинная запись оператора в Pine Script, может быть помещена в более чем одну строку. Синтаксически, оператор должен начинаться с начала строки. Если он переносится на следующую строку, то продолжение оператора должно начинаться с одного или нескольких (отличных от четырех) пробелов.

Например:

можно записать как:

Длинная запись вызова plot может быть записана как:

Операторы внутри пользовательских функций также могут быть перенесены. Однако, поскольку локальный оператор должен синтаксически начинаться с отступа (4 пробела или 1 табуляция), при перенесении его на следующую строку продолжение оператора должно начинаться с более чем одного отступа (не равного кратному 4 пробелам).

Например:

Не используйте комментарии с переносом строк. Следующий код НЕ компилируется:

Компилятор выдаст ошибку: Add to Chart operation failed, reason: line 3: syntax error at input ‘end of line without line continuation’ . Чтобы этот код компилировался, просто удалите комментарий // a comment .

Основы языка

Индикатор должен содержать по крайней мере одну функцию / аннотацию вызова, который производит вывод на графике (например: plot , plotshape , barcolor , line.new и т.д.). Стратегия должна содержать хотя бы один вызов strategy.* , например strategy.entry .
Простейший работающий индикатор Pine v4 может быть создан с помощью Редактор Pine → Новый → Пустой скрипт индикатора :


Простую работающую стратегию Pine v4 можно создать с помощью Pine Editor → Создать → Пустой скрипт стратегии :

Серийные строки

Мы реализовали поддержку серийных переменных строкового типа. Пример использования серийных строк в объектах label:

Ключевое слово var

При каждом выполнении условия close >= open значение переменной s будет увеличиваться на единицу. Инициализирующим значением может быть любое арифметическое выражение.

Синтаксис объявления переменных с ключевым словом var позволяет избежать употребления в коде конструкций вида: s := nz(s[1], s) , что может быть очень полезно при работе с объектами рисования.

Структура скрипта Pine

Например индикатор может выглядеть вот так :

Некоторые элементы скрипта обязательны , некоторые нет . Ниже пример более сложного индикатора и комментарии которые описывают структуру : // ^^^ директива компилятору какую версию языка использовать [ a , b ] // последняя строка - возвращаемое значение , в данном сл . кортеж // выражения можно переносить но ВАЖНО соблюдать правило // перенесенная строка начинается как мин . с 1 го пробела , но не с 4 и не с табуляции // на одной стр можно писать неск выражений разделяя их зпт // ВАЖНО ! ! ! Нельзя вставлять комментарии при переносе строк ( кроме последней )

Понимание сценариев

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

Основные типы

Целочисленные литералы должны быть записаны в десятичной записи. Например:

В Pine есть 5 форм типа int:

Float

Литералы с плавающей точкой содержат разделитель (символ . ) и могут также содержать символ e (что означает «умножить на 10 в степени X», где X — число после символа e ).

Примеры:

  • 3.14159 // 3.14159
  • 6.02e23 // 6.02 * 10^23
  • 1.6e-19 // 1.6 * 10^-19
  • 3.0 // 3.0

Первое число является округленным числом Pi (π), второе число очень большое, а третье очень мало. Четвертое число — просто число 3 как число с плавающей точкой.

Примечание

Можно использовать прописные буквы E вместо строчных e .

В Pine есть 5 видов форм чисел с плавающей точкой типа:

Внутренняя точность чисел с плавающей точкой в Pine составляет 1e-10.

Есть только два литерала, представляющих значения bool :

В Pine есть 5 форм типа bool:

Color

Четвертая пара цифр является необязательной. При использовании он указывает компонент альфа (непрозрачность), значение также от 00 (полностью прозрачное) до FF (полностью непрозрачное).

Примеры:

Примечание

Шестнадцатеричная запись не чувствительна к регистру.

В Pine есть 5 видов цветного типа:

Кто-то может спросить, как значение может иметь тип input color, если невозможно использовать input для ввода цвета в Pine. Ответ: через арифметическое выражение с другими типами ввода и цветными литералами / константами.

Например:

Следующие встроенные цветовые переменные могут быть использованы, чтобы избежать шестнадцатеричных цветовых литералов:

Можно изменить прозрачность цвета с помощью встроенной функции color.new .

Вот пример:

String

Строковые литералы могут быть заключены в одинарные или двойные кавычки.

Примеры:

  • «This is a double quoted string literal»
  • ‘This is a single quoted string literal’

Одинарные и двойные кавычки функционально эквивалентны. Строка, заключенная в двойные кавычки, может содержать любое количество одинарных кавычек и наоборот:

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

В Pine есть 5 форм строкового типа:

Line and label

Новые графические объекты были введены в Pine v4. Эти объекты создаются с помощью функций line.new и label.new . Их тип — серийная линия и серийная метка соответственно. В Pine есть только одна форма линий и типов меток : серия .

Plot and hline

Несколько аннотаций функций (в частности, plot и hline ) возвращают значения, которые представляют объекты, созданные на диаграмме. Функция plot возвращает объект типа plot , представленный в виде линии или диаграммы на графике. Функция hline возвращает объект типа hline , представленный в виде горизонтальной линии. Эти объекты могут быть переданы в функцию заполнения (fill), чтобы закрасить область между ними.

В Pine Script есть тип void . Большинство функций и функций аннотаций, которые производят побочный эффект, возвращают пустой результат. Например, Strategy.entry , Plotshape и т. д.

Пустой результат не может быть использован в каком-либо арифметическом выражении или назначен переменной.

Na value

В Pine есть специальная встроенная переменная na , которая является аббревиатурой от not available ( недоступно) , то есть выражение или переменная не имеют значения. Это очень похоже на null значение в Java или None в Python.

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

Во-вторых, в некоторых случаях Pine-компилятор не может автоматически определить тип значения na , поскольку может быть применено несколько правил автоматического приведения типов.

Например:

Здесь компилятор не может определить, будет ли myVar использоваться для построения чего-нибудь, например, plot(myVar) где его тип будет серией с плавающей точкой , или например для установки какого то текста как в label.set_text(lb, text=myVar) , где его тип будет последовательностью строки , или для какой-то другой цели. Такие случаи должны быть явно разрешены одним из двух способов:

В-третьих, чтобы проверить, не доступно ли какое-либо значение, необходимо использовать специальную функцию: na .

Например:

Не используйте оператор == для проверки na , нет гарантий что это будет работать.

Версии

В настоящее время существует четыре версии языка Pine Script. Директива компилятора должна использоваться в первой строке скрипта, чтобы указать версию Pine, используемую скриптом: //@version=N где N номер версии (1–4). Обратите внимание, что разные версии Pine Script Language несовместимы друг с другом.

Модель исполнения скриптов Pine

Скрипт Pine не похож на многие обычные программы, которые выполняются один раз, а затем останавливаются. В среде выполнения Pine скрипт выполняется как скрытый цикл, где он выполняется один раз на каждом историческом изменении. Когда выполнение достигает последней свечи в реальном времени, скрипт будет выполняться каждый раз, когда обнаруживается изменение цены или объема, затем последний раз, когда свеча реального времени закрывается и становится исторической свечой.

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

Пример скрипта Pine

Давайте посмотрим на реализацию индикатора MACD в Pine:

Это комментарий, содержащий описание версии компилятора, которая сообщает компилятору, что скрипт будет использовать 4-ую версию языка Pine.

Определяет имя скрипта, который будет отображаться на графике как «MACD».

Определяет две целочисленные переменные с названиями: fast и slow .

Определяет переменную fastMA , содержащую результат расчета EMA (Exponential Moving Average, экспоненциальное скользящее среднее) с длиной, равной fast (12), для close , т.е. цены закрытия свечей.

Определяет переменную slowMA , содержащую результат вычисления EMA с длиной, равной slow (26), для close .

Определяет переменную macd как разницу между двумя EMA.

Определяет переменную signal как сглаженное значение macd, с и спользованием алгоритма SMA (Simple Moving Average, простое скользящее среднее) с длинной 9.

Вызывает функцию plot для вывода переменной macd, отображая линией синего цвета.

Вызывает plot функцию для вывода переменной signal , отображая линией оранжевого цвета.

После добавления скрипта «MACD» на график вы увидите следующее:

Pine содержит множество встроенных функций для самых популярных индикаторов ( SMA , EMA , WMA и т.д.). Вы также можете определить свои пользовательские функции.

Типы систем

Pine имеет 9 основных типов данных. Это: int , float, bool , color , string , line , label , plot , hline . Все эти типы данных существуют в нескольких формах . Существует 5 типов форм: literal , const , input , simple и series . Мы будем часто ссылаться на тип парной формы как на тип . Компилятор Pine различает типы: literal bool , input bool, series bool и так далее.

Существует также тип void , значение na ( not available ) и составной тип tuple .

Краткое руководство

Скрипт, написанный на языке Pine, состоит из функций и переменных. Функции содержат инструкции, которые описывают необходимые вычисления. Переменные сохраняют значения, использованные или созданные во время этих вычислений.

Скрипт должен содержать аннотацию study (индикатор) или strategy (стратегия) , которая определяет имя и другие свойства скрипта. Тело сценария содержит функции и переменные, необходимые для вычисления результатов, которые будут отображаться на графике с помощью функции plot или какой-либо другой функции, которая отображает выходные данные скрипта.

Переименование встроенных констант, переменных и функций

В Pine Script v4 был выполнен ряд переименований встроенных констант, переменных и функций, представленный ниже:

  1. Константы значений цветов (например, red ) перемещены в пространство имен color.* (например, color.red ).
  2. Функция color переименована в color.new .
  3. Константы для типов аргументов (например, integer ) перемещены в пространство имен input.* (например, input.integer ).
  4. Константы стилей плотов (например, стиль histogram ) перемещены в пространство имен plot.style_* (например, plot.style_histogram ).
  5. Константы стилей для функции hline (например, стиль dotted ) перемещены в пространство имен hline.style_* (например, hline.style_dotted ).
  6. Константы дней недели (например, sunday ) перемещены в пространство имен dayofweek.* (например, dayofweek.sunday ).
  7. Переменные текущей резолюции графика (например, period , isintraday ) перемещены в пространство имен timeframe.* (например, timeframe.period , timeframe.isintraday ).
  8. Переменная interval переименована в timeframe.multiplier .
  9. Переменные ticker и tickerid переименованы в syminfo.ticker и syminfo.tickerid соответственно.
  10. Переменная, обозначающая индекс бара n , переименована в bar_index .

Ограничения на скрипты

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

Ограничения могут коснуться:

  • количество баров
  • времени исполнения скрипта
  • объема потребляемой памяти
  • размера скрипта

Например количество баров которые мы можем увидеть ограничено 5000 для пользователей бесплатного тарифа (так написано в документации, но по моим наблюдениям это не всегда так :) ).

Объект рисования label

Позволяет рисовать на графике метки, в том числе содержащие произвольный текст. Чтобы нарисовать такую метку, воспользуйтесь функцией label.new . Пример скрипта, который рисует метку с ценой закрытия на последнем баре:



Создав объект label, вы можете его изменять и удалять , используя соответствующие функции семейства label.* . Пример более сложного скрипта с использованием label — Pivot Points High/Low.

Tuples (кортежи)

В Pine Script ограничена поддержка типа кортежа. Кортеж — это неизменяемая последовательность значений, используемая, когда функция должна возвращать более одной переменной в результате.

Например:

В этом примере есть 2 кортежа в последнем утверждении функции calcSumAndMul . Элементы кортежа могут быть любого типа. Существует также специальный синтаксис для вызова функций, которые возвращают кортежи. Например, calcSumAndMul должен быть вызван следующим образом:

где значение локальных переменных sum и mul будут записаны в s и m переменных внешнего диапазона.

Серии

В Pine Script есть важнейший тип данных — Серии. В сериях хранятся например данные баров close, open, high, low и т.д. Серии можно воспринимать как динамический массив. По мере перемещения скрипта по барам серия дополняется значениями.

Модель работы скриптов Pine

Важно понимать что ваш скрипт выполняется многократно для КАЖДОГО бара начиная с самого старого доступного. При этом индекс “текущего” (самого правого) бара равен 0. По мере работы скрипта он как бы смещается по барам слева направо.

Когда Индикатор достигает текущего, не закрытого ещё бара, то скрипт выполняется каждый тик (при каждом обновлении цены или объема) до тех пор пока бар не закроется. Скрипт выполняется ещё один раз на закрытии бара.

Стратегия по умолчанию считается только по закрытии текущего бара, однако её также можно настроить на пересчет по каждому тику.

Что дальше?

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

Самый быстрый способ выучить язык программирования — прочитать ключевые понятия и опробовать их на реальном коде. Как мы только что сделали, скопируйте примеры этой документации в редактор и поиграйте с ними. Проводите исследования! Вы ничего не испортите.

Также вы найдете примеры скриптов Pine в выпадающем меню редактора Новый и в обширной публичной библиотеке скриптов TradingView, которая содержит тысячи скриптов Pine с открытым исходным кодом. Наслаждайтесь и добро пожаловать в Pine!

Представляем Pine Script v4!

В этой статье мы проведём краткий обзор новых возможностей Pine Script v4. Чтобы ознакомиться подробнее, вы можете изучить документацию (можно сразу перейти к разделу с описанием дровинг-объектов ) и справочные материалы .

Типы форм

Literal

literal это специальное обозначение для представления фиксированного значения в Pine. Это фиксированное значение само по себе является выражением, и такие буквальные выражения всегда имеют один из 5 следующих типов:

Замечание

В Pine, встроенные имена open , high , low , close , volume , time , hl2 , hlc3 , ohlc4 не являются типом формы literal. Они имеют форму серии .

Const

Значения формы const :

  • не изменяются во время выполнения скрипта
  • известны или могут быть рассчитаны во время компиляции

Например:

Тип c1 является const int , поскольку он инициализируется с literal int выражением. Тип c2 также является const int, потому что он инициализируется арифметическим выражением типа const int . Тип c3 это series int, поскольку он изменяется во время выполнения.

Input

Значения формы input :

  • не изменяются во время выполнения скрипта
  • неизвестны во время компиляции
  • берутся из функции input

Например:

Тип p переменной — входное целое число .

Simple

Значения формы simple :

  • не изменяются во время выполнения скрипта
  • неизвестны во время компиляции

Это значения, которые берутся из символьной информации основного графика. Например, встроенная переменная syminfo.mintick представляет собой простое число с плавающей точкой . Слово simple обычно опускается при обращении к этой форме, поэтому мы используем float, а не simple float .

Series

Значения формы series :

  • изменяются во время выполнения скрипта
  • хранят последовательность исторических значений, связанных с барами основного графика
  • можно получить с помощью [] оператора. Обратите внимание, что только последнее значение в серии, то есть значение, связанное с текущим баром, доступно как для чтения, так и для записи.

Форма series является наибол ее распространенной формой в Pine. Примеры встроенных серий переменных: open , high , low , close , volume и time . Размер этих серий равен количеству доступных баров для текущего тикера и таймфрейма. Серия может содержать числа или специальное значение: na , означающее, что значение недоступно . Любое выражение, содержащее переменную серии, будет рассматриваться как сама серия.

Например:

Примечание

Оператор [] также возвращает значение формы серии .

Индикаторы и стратегии

Pine стратегии используются для запуска бэк-тестов. В дополнение к обычным скриптовым вычислениям они также содержат strategy.***** вызовы для создания заявок (ордеров) на покупку и продажу. Они могут отображать информацию на графиках, но не могут быть использованы для создания оповещений.

Pine индикаторы, как и в предыдущем примере, также содержат расчеты и могут отображать информацию на графиках, но не могут использоваться при тестировании на истории. Индикаторы, содержащие alertcondition вызовы, могут использоваться для создания оповещений с помощью диалогового окна « Создать оповещение TradingView».

Явное указание типа переменных

В Pine Script v4 стало невозможным создание переменных, чей тип данных не известен на момент объявления (см. na значение ). Это было сделано, чтобы избежать целого ряда проблем, возникающих, когда тип переменной изменяется уже после её инициализации значением na . Теперь при объявлении переменных со значением na нужно указывать их тип явно, используя ключевые слова или функции приведения типов (например, float ):

Пробуйте, экспериментируйте с новой версией Pine Script v4! Некоторые из наших пользователей уже познакомились с возможностями четвёртой версии и написали несколько впечатляющих скриптов с использованием объектов рисования.

Например, Ricardo Santos написал целую серию скриптов, с которыми вы можете ознакомиться ниже:





Joris Duyck написал скрипт Trendlines , иллюстрирующий возможности объекта рисования line.


Надеемся, что эти примеры послужат для вас вдохновением. Обсудить возникшие вопросы, проблемы и поделиться своими впечатлениями о Pine Script v4 c другими пользователями вы можете в нашем чате . Мы благодарим участников независимого сообщества Pinescripters за помощь в бета-тестировании (ребята, огромное вам спасибо!) . Вы также можете задать конкретные вопросы по коду на странице сообщества на Stack Overflow .

Читайте также: