Функции Pine Script: параметры, результат и вызов

Обложка статьи «Функции Pine Script: параметры, результат и вызов»: Четыре свечи разной высоты, под каждой золотая черта по размеру тела: функция превращает свечу в одно число

Чем отличаются встроенная, своя и библиотечная функция

Три вида отличаются тем, где лежит код функции и как к ней обращаются. Параметры и результат у всех трёх читаются одинаково.

ВидГде лежит кодКак вызвать
ВстроеннаяВ самом языкеПо имени, часто с префиксом: ta.crossover(), math.abs()
СвояВ вашем скриптеПо имени: bodySize(open, close)
БиблиотечнаяВ опубликованной библиотекеПосле import, через псевдоним: pt.имя()

Префикс у встроенной функции называется пространством имён. У части функций его нет, например у plot(). В руководстве TradingView ta расшифровано как «технический анализ», в math собрана математика. У каждой встроенной функции есть запись в справочнике языка: там указаны параметры, тип результата и то, какие параметры обязательны.

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

Как устроен язык в целом, разобрано в руководстве Pine Script: что это за язык.

Как объявить функцию в Pine Script v6 и получить результат

Объявление состоит из имени, списка параметров в скобках, знака => и тела. У короткой функции заголовок и тело стоят на одной строке. У длинной тело идёт ниже, и каждая его строка начинается с отступа в четыре пробела или одну табуляцию.

bodySize(float o, float c) =>
    float diff = c - o
    math.abs(diff)

Это фрагмент: в скрипте над ним стоят строки версии и indicator(). Слова return в этой записи нет. Вызов возвращает результат последнего выражения в теле, здесь это math.abs(diff).

Три детали про параметры и результат.

  • Тип параметра можно указать явно. В примере оба параметра объявлены как float, то есть дробные числа.
  • Значение по умолчанию делает параметр необязательным. Если его нет, аргумент придётся передавать в каждом вызове.
  • Результатов может быть несколько. Тогда тело заканчивают кортежем: списком выражений через запятую в квадратных скобках.

Запись примеров сверена с руководством шестой версии. Чем она отличается от пятой, читайте в ответе Pine Script v5 и v6: что изменилось.

Проверка функции на четырёх свечах и пример ta.crossover

Проверить функцию можно без редактора: подставить в неё числа и посчитать вручную. Возьмём однострочную запись и выведем результат на график.

//@version=6
indicator("Тело свечи")
bodySize(float o, float c) => math.abs(c - o)
plot(bodySize(open, close))

Функция считает размер тела: разницу между закрытием и открытием без знака. Одна свеча здесь равна одному бару выбранного таймфрейма. Пройдём четыре учебные свечи. Это ручной расчёт, в редакторе код мы не запускали.

СвечаОткрытие и закрытиеРасчёт и результат
Первая100 и 103103 - 100 = 3
Вторая103 и 101101 - 103 = -2, без знака 2
Третья101 и 101101 - 101 = 0
Четвёртая101 и 105105 - 101 = 4

Вторая свеча показывает, зачем нужна math.abs(): без неё функция вернула бы -2. Вызов plot() стоит снаружи, в глобальной области, и получает уже готовое число. На живом графике числа будут другими: там тела настоящих свечей.

Учебный пример: размер тела свечи и переход через уровень

учебная схема · не котировка и не сигнал

Тело свечи: результат функции

Тело свечи: результат функции13204

Значения 9, 11, 12, 8 и уровень 10

Значения 9, 11, 12, 8 и уровень 10Уровень 109211128
  1. 1Открытие 100, закрытие 103: функция возвращает 3. На второй свече цена упала, но результат всё равно положительный: 2
  2. 2Значение было 9, стало 11: это переход через уровень 10 снизу вверх. Дальше 12 остаётся выше уровня, но нового перехода нет
Схема учебная, числа вымышленные. Слева четыре свечи, под каждой размер тела, который вернёт функция. Справа линия из четырёх значений и уровень 10: переход снизу вверх случается один раз.

Теперь встроенная ta.crossover(). В руководстве TradingView по её результату ставят метку на тех барах, где RSI пересекает уровень 50 снизу вверх. Разберём то же на учебных числах: уровень 10, значения по барам 9, 11, 12 и 8.

  • С 9 до 11. Значение было ниже уровня и стало выше. Это переход, и ta.crossover() отмечает именно этот бар.
  • С 11 до 12. Значение выше уровня, но оно уже было выше. Перехода нет.
  • С 12 до 8. Значение ушло под уровень. Это переход вниз, для него есть парная ta.crossunder().

Отсюда возможная ошибка: ждать, что функция отмечает каждый бар, пока линия держится выше уровня. Для такой проверки хватает обычного сравнения x > 10.

Что проверить в области видимости и при импорте библиотеки

Две типичные причины, по которым функция не работает: место объявления и попытка достать её внутренние переменные снаружи. Перед поиском ошибки в расчёте пройдите пять пунктов.

  • Объявление стоит в глобальной области. Внутри другой функции, условия или цикла объявить функцию нельзя.
  • Переменные тела снаружи не видны. Если в теле есть diff, вызов plot(diff) за пределами функции даст ошибку компиляции. Наружу выходит только результат.
  • Функция не меняет свои параметры и глобальные переменные. Новое значение возвращают результатом и присваивают уже снаружи.
  • Функция не вызывает сама себя. Руководство это прямо запрещает.
  • В import указан номер версии. Запись выглядит так: import автор/Библиотека/1 as pt, имена здесь условные. Последнюю версию язык сам не подставляет. Вышло обновление библиотеки - номер меняют вручную.

После импорта функции вызывают через псевдоним, как встроенные через ta. Если псевдоним не задан, префиксом служит имя библиотеки. Подключить можно только опубликованную библиотеку.

Как вынести число из функции в настройки индикатора, показано в ответе input в Pine Script.

Риски и ограничения. Числа в примерах и на схеме вымышленные, это ручной расчёт, а не рыночные данные и не результат запуска скрипта. Код собран по руководству для шестой версии Pine Script. Перед работой сохраните его в редакторе и убедитесь, что он компилируется без ошибок. Правила языка сверены 11.10.2026 и могут меняться. Функция упрощает расчёт, но не делает его прибыльным и не гарантирует прибыль. Любой индикатор - инструмент анализа, а не сигнал к сделке. Рынок волатилен, торговля связана с риском потери капитала, прошлые данные не говорят о будущих. Материал образовательный, это не индивидуальная инвестиционная рекомендация.

Источники

График TradingView с сигналами Buy и Sell индикатора Midas
Midas multi-индикатор for TradingViewОдин из самых продвинутых индикаторов для трейдинга
  • Сигналы без перерисовки
  • Интерактивный теханализ
  • 7 стратегий на выбор
Midas multi-индикатор for TradingViewСигнал, стоп и 3 цели - прямо на графике
  • Сигнал фиксируется по закрытию свечи
  • Стоп и 3 цели строятся автоматически
  • План сделки виден до входа