Объявление функций

From TradingView Wiki
Jump to: navigation, search
Language: English  • 日本語 • Русский


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

Однострочные функции

Простые короткие функции удобно писать на одной строке. Ниже приведен синтаксис однострочных функций:

<identifier>(<list of arguments>) => <expression>

Имя функции <identifier> (идентификатор) находится перед круглыми скобками. Затем в скобках находится <list of arguments> (список аргументов), который представляет собой просто список аргументов функции, разделенных запятой. <expression> (выражение) в этом примере - тело функции.

Ниже приведен пример однострочной функции:

f(x, y) => x + y

После определения функции ‘f’ ее можно назвать:

a = f(open, close)
b = f(2, 2)
c = f(open, 2)

Обратите внимание на то, что тип результата, возвращаемый функцией ‘f’ может быть другим. В приведенном выше примере тип переменной ‘a’ будет серией. Тип переменной ‘b’ является целым числом. Тип переменной ‘c’ - это серия. Pine использует динамические аргументы, поэтому вам не следует назначать тип каждого аргумента.

Тип результата выводится автоматически. Это зависит от типа аргументов, переданных функции и операторам тела функции.

Сноска: в Pine можно вызвать другие функции из функций - кроме исходной функции, т.е. рекурсия не поддерживается.

Многострочные функции

Конечно, сложно провести какие-либо предварительные вычисления только с одними линейными функциями. Поэтому мы решили расширить синтаксис объявления функций, сделав их многострочными. Вот синтаксис многострочной функции:

<identifier>(<list of arguments>) =>
    <Variable Declaration>
    ...
    <Variable Declaration>
    <expression> or <Variable Declaration>

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

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

Например:

geom_average(x, y) =>
    a = x*x
    b = y*y
    sqrt(a + b)

Функция ‘geom_average’ имеет два аргумента и создает две переменные в теле: ‘a’ и ‘b’. Последний оператор вызывает функцию ‘sqrt’ (извлечение квадратного корня). Вызов ‘geom_average’ вернет последнее значение выражения (sqrt(a+b)).

Области в скрипте

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

Каждая функция имеет свой “локальный масштаб”. Все переменные, объявленные внутри функции (и аргументы этой функции тоже), относятся к области действия этой функции, что означает, что невозможно ссылаться на нее извне - например, из глобальной области или локальной области другой функции. В то же время из сферы действия любой функции можно ссылаться на любую переменную, объявленную в глобальной области.

Таким образом, можно ссылаться на любые глобальные пользовательские переменные и функции (кроме рекурсивных вызовов) и встроенные переменные/функции из тела пользовательской функции. Можно сказать, что локальная область была встроена в глобальную.

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

Функции с ‘self ref’ Переменными в теле

Тело многострочной функции представляет собой последовательность выражений и/или объявлений переменных. Любая переменная, объявляемая в теле функции, может быть самонастраивающейся. Пример функции my_sma, которая эквивалентна встроенной функции sma:

study("Custom Simple MA", overlay=true)
my_sma(src, len) =>
    sum = nz(sum[1]) - nz(src[len]) + src
    sum/len   
plot(my_sma(close, 9))

Обратите внимание на использование функции nzдля предотвращения значений NaN; которые появляются с левой стороны ряда в результате смещения вправо.

Немного более сложный пример: функция my_ema идентична встроенной функции ema:

study("Custom Exp MA", overlay=true)
my_ema(src, len) =>
    weight = 2.0 / (len + 1)
    sum = nz(sum[1]) - nz(src[len]) + src
    ma = na(src[len]) ? na : sum/len
    out = na(out[1]) ? ma : (src - out[1]) * weight + out[1]
    out
plot(my_ema(close, 9))

Обратите внимание на то, что out - это последний оператор функции my_ema. Это простое выражение, состоящее из одного из переменных ссылок. Значение переменной out в частности, является значением, возвращаемым всей функцией my_ema. Если последнее выражение является объявлением переменной, то его значением будет результат функции. Таким образом, следующие две функции полностью совпадают:

f1(x) =>
    a = x + a[1]
    a
f2(x) =>
    a = x + a[1]

Функции, возвращающие несколько результатов

В большинстве случаев функция возвращает один результат. Но можно вернуть список результатов:

fun(x, y) =>
    a = x+y
    b = x-y
    [a, b]

Существует специальный синтаксис для вызова таких функций:

[res0, res1] = fun(open, close)
plot(res0)
plot(res1)

Предыдущая статья: Выражения, декларации и операторы, Следующая: Обвязка линий, Вверх: Pine Script Tutorial/ru