В Pinescript помимо встроенных функций, можно создавать пользовательские функции при помощи оператора объявления функции (=>). Функция — сегмент многократно используемого кода, который выполняет определенное действие каждый раз, когда мы его используем. Функции упрощают программирование, т.к. нам нужно закодировать функцию только один раз, а затем мы можем использовать многократно. И если мы изменим функцию, то ее поведение изменится везде в скрипте, где мы ее использовали.

Оператор объявления функции (=>) может создавать однострочные и многострочные функции.

Создание однострочной функции в TradingView Pinescript

Сначала мы определяем имя функции, оно пишется без пробелов (например, NewEma или MySma). Далее в круглых скобах через запятую перечисляется список не необязательных  аргументов.

Аргумент — это значение, которое передается в функцию. Затем внутри функции он действует как переменная, с которой мы можем производить вычисления. Когда мы используем функцию (или «вызываем» ее), нам нужно предоставить аргументы. Например, для встроенной функции ema() требуются два аргумента: цена для расчета и длина скользящей средней в количестве баров.

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

После списка аргументов мы вводим =>, а затем выражение, которое представляет собой любой оператор, возвращающий значение. Например, 15 + 3 является выражением (возвращает 18), но также и rsi (close, 50) (возвращает 50-периодный RSI на основе цен закрытия). Значение этого выражения — это то, что возвращает функция.

Не путайте оператор объявления функции (=>) с оператором сравнения больше или равно (>=). Мы создаем пользовательскую функцию с первым оператором, а второй проверяет, больше ли значение слева от него значения справа или равно ему.
Практический пример однострочной функции:

Функция rEMA принимает 2 аргумента: length и barsBack. Выражение, которое следует сразу после оператора объявления функции (=>), вычитает две экспоненциальные скользящие средние (EMA) друг из друга, и этот результат возвращается функцией rEMA.

Первая из этих EMA рассчитывается по ценам закрытия (close) с количеством баров, заданным аргументом длины length. Второй вызов функции ema() использует те же значения, но на этот раз мы сдвигаем значение EMA на определенное количество баров назад.

Чтобы сделать это «смещение», мы используем аргумент barsBack между квадратными скобками ([]). Таким образом, функция ema(close, length) возвращает не значение EMA текущего бара, а значение скользящей средней сдвинутое на указанное количество баров назад.

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

Наносим на график импульс скользящей средней:

  • Первая функция plot выводит график типа гистограмма и отображает 20-периодную EMA с длиной импульса в 10 делений rEMA(20, 10).
  • Вторая функция plot выводит график типа гистограмма и отображает 40-периодную EMA с длиной импульса в 10 делений rEMA(40, 10).

Наносим на график нейтральную линию цвета лайм:

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

Pinescript. Создание пользовательских функций

Создание многострочной функции в Pinescript TradingView

  • Многострочная функция создается также, как и однострочная с небольшими отличиями.
  • Сначала мы задаем имя функции оно пишется без пробелов. Далее в круглых скобах перечисляем необязательные аргументы через запятую.
  • Разница заключается в оформлении. В многострочной функции каждая строка, расположенная после =>  должна иметь отступ либо в 4 пробела, либо в 1 табуляцию. Благодаря этому отступу TradingView понимает какие строки ниже относятся к функции, а какие нет.
  • Значение, которое возвращает многострочная функция, является последней строкой функции. Эта строка может быть выражением (например, y + 5), переменной (x) или объявлением переменной (y = 15).

Пример скрипта, содержащего многострочную функцию

Назовем функцию Cross() и дадим ей два аргумента price — цена и length — длина. Первый аргумент может принимать значения цены: high, low, open, close), а аргумент length устанавливает длину EMA.

Внутри функции создадим переменную emaValue, которая принимает значение ta.ema по указанным ценам и длине. Получается, что мы вычисляем ЕМА внутри функции Cross() по аргументам заданным в функции Cross().

В следующей строке мы проверяем да неравенства на предмет их истинности: price > emaValue and price[1] < emaValue[1], если оба неравенства true, то и в переменную возвращаем значение true.

Мы заканчиваем функцию строкой, которая просто содержит переменную top — это то, что возвращает функция.

Затем мы используем нашу функцию для выведения флажков на графике цены:

Функция plotshape() рисует визуальную фигуру на графике, когда ее аргумент серии равен true на этом баре.

Первая функция plotshape() выводит флаг цвета фуксии над баром (location.abovebar), на котором происходит пересечение 10-периодной EMA по ценам закрытия и цены закрытия close.

Второй вызов функции plotshape() выводит черный флаг под ценовым баром (location.belowbar), на котором максимум high пересекает 30-периодную EMA по максимальным ценам. Мы проверяем это последнее условие с помощью Cross (high, 30).

И в конце при помощи plot() строим 2 скользящие средние ta.ema(close, 10) и ta.ema(high, 30).

Так выглядит наш индикатор на графике:

Pinescript. Создание пользовательских функций

Заключение

  • В Pinescript мы можем создавать однострочные и многострочные пользовательские функции при помощи оператора объявления функции (=>) .
  • У каждой функции должно быть имя без пробелов и  перечислены необязательные аргументы в круглых скобках.
  • После оператора объявления функции мы пишем одно выражение (для однострочных функций) или несколько строк кода с отступом в 4 пробела или 1 табуляцию (для многострочных функций).
  • Последнее выражение в однострочной или многострочной функции — это значение, возвращаемое функцией.