Выражения, декларации и операторы

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


Выражения

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

Вот несколько примеров простых выражений:

(high + low + close)/3
sma(high - low, 10) + sma(close, 20)

Переменные объявления

Переменные в Pine объявляются с помощью специального символа = следующим образом:

<identifier> = <expression>

Вместо <identifier> будет имя объявленной переменной. Примеры объявлений переменных:

src = close
len = 10
ma = sma(src, len) + high

Здесь были объявлены три переменных: src, len and ma. Идентификаторы close и high являются встроенными переменными. Идентификатор sma является встроенной функцией для вычисления простой скользящей средней.

Назначение переменных

Изменчивая переменная - это такая переменная, которая может быть присвоена новому значению.

Оператор := должен использоваться, чтобы дать значение переменной. Чтобы использовать этот оператор, в первой строке кода должен использоваться специальный атрибут: //@version=2. Этот атрибут определяет версию Pine Script. В версии 2 были введены изменчивые переменные.

Переменная должна быть объявлена ​​до того, как вы сможете установить для нее значение (объявление переменных описано выше).

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

Пример с переменным присваиванием:

//@version=2
study("My Script")
price = close
if hl2 > price
    price := hl2
plot(price)

В этом примере мы также используем оператор ‘if’ (если).

Самостоятельные ссылки на переменные в версии 2

Примечание: переменные, ссылающиеся сами на себя и форвардные ссылочные переменные были удалены в версии 3.

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

study("Fibonacci numbers")
fib = na(fib[1]) or na(fib[2]) ? 1 : fib[1] + fib[2]
plot(fib)

Переменная fib представляет собой серию чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21, ... Если первые два числа равны 1 и 1, и каждый последующий номер равен Сумма последних двух. В данном примере используется встроенная функция na и возвращает true, если значение его аргумента еще не определено (это NaN). В приведенном ниже примере значения fib [1] и fib [2] не были определены на первом баре, а на втором баре не был определен fib [2]. Наконец, в третьем баре оба они определены и могут быть добавлены. Fib.png

Сноска: Поскольку последовательность чисел Фибоначчи растет довольно быстро, переменная ‘fib’ очень быстро переполняется. Таким образом, пользователь должен применять данный индикатор на месячном ‘M’ или годовом ‘Y’ таймфреме, иначе значение ‘n/a’ будет отображаться на диаграмме вместо чисел Фибоначчи.

Предотвращение значений NaN (отсутствует значение), функции na и nz

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

barNum = barNum[1] + 1

Переменная привязки ‘barNum’ относится к ее собственному значению на предыдущем баре, то есть когда индикатор будет вычисляться на каждом баре, значение barNum[1] будет равно NaN (отсутствует значение). Поэтому на первом баре barNum [1] не будет определяться (NaN). При добавление 1 к NaN, результат все равно будет NaN. В целом, весь ряд barNum будет равен на каждом баре NaN. На следующем баре barNum = NaN + 1 = NaN и т.д. Итого barNum будет содержать только значения NaN.

Чтобы избежать подобных проблем, Pine имеет встроенную функцию nz. Эта функция принимает аргумент, и если она равна NaN, тогда она возвращает 0, в противном случае она возвращает значение аргумента. Впоследствии проблема с вычислением баров решается следующим образом:

barNum = nz(barNum[1]) + 1

Существует перегруженная версия nz с двумя аргументами, которая возвращает второй аргумент, если первая равна NaN. Более подробную информацию о ‘nz’ можно найти здесь.

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

SMA (Простая скользящая средняя) без применения функции ‘sma’

При использовании собственных реферирующих переменных можно написать эквивалент встроенной функции sma, которая вычисляет простое скользящее среднее (Simple Moving Average).

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

Переменная ‘sum’ представляет собой перемещаемую сумму с одним окном, имеющим длину ‘len’. На каждом баре переменная ‘sum’ равна ее предыдущему значению, тогда самое левое значение в движущемся окне вычитается из ‘sum’, и добавляется новое значение, которое вводит движущееся окно (самое правое). Это алгоритм, оптимизированный для векторных языков, см. Скользящая средняя для подробного описания базового алгоритма.

Кроме того, перед отображением графика ‘sum’ делится на размер окна ‘len’, а индикатор отображается на диаграмме как «Простая скользящая средняя».

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

Оператор ‘if’ (если)

If оператор определяет, какой блок операторов должен выполняться при выполнении условий выражения.

Чтобы иметь доступ и использовать оператор if, следует указать версию языка Pine Script в самой первой строке кода: //@version=2

Общая форма кода:

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    
    var_decl_thenN
    return_expression_then
else
    var_decl_else0
    var_decl_else1
    
    var_decl_elseN
    return_expression_else

где:

  • var_declarationX — - эта переменная получает значение выражения if
  • condition — если условие истинно, используется логика из блокаthen (var_decl_then0, var_decl_then1, и т.д.), если условие ложно, используется логика из блока ‘else’ (var_decl_else0, var_decl_else1, etc).
  • return_expression_then, return_expression_else - последнее выражение из блока then или из блока else возвращает окончательное значение оператора. Если объявление переменной осуществляется в конце, то это будет результат.

Тип возвращаемого значения оператора if зависит от типа return_expression_then и return_expression_else (их типы должны соответствовать: невозможно вернуть целочисленное значение из then, в то время как у вас есть строка Значение в блоке else).

Пример:

// This code compiles
x = if close > open
    close
else
    open
// This code doesn’t compile
x = if close > open
    close
else
    "open"

Можно опустить блок else. В этом случае, если условие ложно, для переменной var_declarationX будет присвоено “empty” (пустое) значение (na, или false, или “”) will be assigned to the var_declarationX variable.

Пример:

x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.

The blocks “then” and “else” are shifted by 4 spaces. If statements can include each other, +4 spaces:

x = if close > open
    b = if close > close[1]
        close
    else
        close[1]
    b
else
    open

Можно проигнорировать результирующее значение оператора if (“var_declarationX=“ может быть опущено). Это может быть полезно, если вам нужен побочный эффект выражения, например, при торговле стратегией:

if (crossover(source, lower))
    strategy.entry("BBandLE", strategy.long, stop=lower,                    
                   oca_name="BollingerBands",
                   oca_type=strategy.oca.cancel, comment="BBandLE")
else
    strategy.cancel(id="BBandLE")

Оператор ‘for’ (для)

Оператор for позволяет несколько раз выполнять несколько инструкций. Чтобы использовать инструкции for, в первой строке кода должен использоваться специальный атрибут: //@version=2. Этот атрибут определяет версию Pine Script. Оператор for был введен в версии 2.

Общая форма кода:

var_declarationX = for counter = from_num to to_num [by step_num]
    var_decl0
    var_decl1
    
    continue
    
    break
    
    var_declN
    return_expression

где:

  • counter - переменная, счетчик циклов.
  • from_num - начальное значение счетчика.
  • to_num - конечное значение счетчика. Когда счетчик становится больше, чем to_num (или меньше, чем to_num в случае from_num> to_num), цикл прерывается.
  • step_num - шаг цикла. Может быть опущено (в шаге цикла case = 1).
  • var_decl0, … var_declN, return_expression - тело цикла. Он должен быть сдвинут на 4 пробела или 1 вкладку.
  • return_expression - возвращаемое значение. Когда цикл завершен или сломан, возвращаемое значение присваивается переменной var_declarationX.
  • continue - ключевое слово. Может использоваться только в циклах. Он переключает цикл на следующую итерацию.
  • break - ключевое слово. Может использоваться только в циклах. Он прерывает цикл.

Пример цикла:

//@version=2
study("My sma")
my_sma(price, length) =>
    sum = price
    for i = 1 to length-1
        sum := sum + price[i]
    sum / length
plot(my_sma(close,14))

Переменная ‘sum’ - это изменчивая переменная, и новое значение может быть дано ей оператором := в теле цикла. Также обратите внимание, что мы рекомендуем использовать встроенную функцию sma для Скользящая средняя, поскольку она вычисляет быстрее.


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