В Pine Script существует множество встроенных переменных и функций. Помимо этого мы можем сами создавать свои переменные и писать функции. Это все прекрасно до тех пор, пока при компиляции кода мы не сталкиваемся с ошибкой «undeclared identifier» или «необъявленный идентификатор».
Дело в том то, что одна и та же ошибка возникает по совершенно разным причинам, что затрудняет ее устранение.
Сообщение об ошибке выводится в консоли Pine Editor и выглядит следующим образом:
Причина № 1. Неправильно введено имя переменной
Чтобы найти ошибку, обратите внимание, в какой строке она появилась (line 8 — строка 8).
Пример индикатора с ошибкой:
В данном случае в строке 8 мы используем переменную prVlume, хотя в строке 7 идентификатор называется prVolume. Поэтому выдается ошибка необъявленный идентификатор. Ведь prVlume написано с ошибка, пропущена буква О. Нужно исправить ошибку, сохранить скрипт и снова добавить на график.
Причина № 2. Ошибка регистра в имени переменной или функции
Имя, которое мы даем нашей пользовательской переменной или функции, чувствительно к регистру. Поэтому при обращении к пользовательской переменной или функции нужно в точности копировать их название с учетом регистра.
Приведем пример того же скрипта, в котором мы допустили ошибку в регистре: вместо prVolume ввели prvolume:
Можно использовать только строчные буквы, чтобы избежать таких ситуаций.
Причина № 3. Забыли указать скобки при обращении к пользовательской функции
Когда мы создаем функцию TradingView, мы сначала объявляем ее имя, затем перечисляем все параметры в скобках ( ) и заканчиваем кодом функции. В дальнейшем, чтобы правильно сослаться на функцию, после ее имени нужно обязательно ставить скобки.
Если вы забыли скобки, то обязательно столкнетесь с ошибкой TradingView «необъявленный идентификатор», как в этом примере:
Чтобы исправить ошибку, в строке 12 нужно написать emaCustom () вместо emaCustom.
Причина № 4. Обновление переменной перед ее объявлением
С помощью оператора (=) мы создаем новую переменную и присваиваем ей какое-то значение. Если мы потом захотим обновить его значение, мы используем оператор (:=). Но это должно быть именно в таком порядке — сначала мы создаем переменную (с помощью =), затем мы можем ее изменить ( :=).
Когда мы путаем местами эти операторы и сначала используем ( :=), а потом (=), то получаем ошибку undeclared identifier, например:
В данном случае, чтобы исправить ошибку, нужно в 7 строке написать: prV = volume[1]
А в 8-й строке: prV := ta.sma (close, 50).
Причина № 5. Использование самоссылающейся переменной без (:=)
Ситуация усложняется, когда мы получаем ошибку «необъявленный идентификатор» (undeclared identifier) с пользовательской переменной, ссылающейся на себя.
Когда переменная ссылается на свое собственное предыдущее значение (например, profit := profit[1] + todayProfit ), эта переменная называется самоссылающейся переменной.
Обратите внимание, что ошибка возникает только с пользовательскими переменными, а не со встроенными типа: close, open, high, low, bar_inex и пр.
Нужно сделать две вещи, чтобы избежать ошибки:
- Создайте переменную с помощью оператора (=) и установите для нее значение по умолчанию ( profit = 0.0).
- Второй шаг — обновить переменную до нового значения с помощью оператора (:=). После этого вы можете ссылаться на предыдущие значения этой переменной.
Приведем пример:
1 2 3 4 5 6 |
//@version=5 indicator(title='price', overlay=false) ClosePlus = nz(ClosePlus[1]) + 2 plot(series=ClosePlus, color=color.orange, linewidth=2) plot(series=close, color=color.purple, linewidth=2) |
В таком виде скрипт выдает ошибку: undeclared identifier.
Чтобы индикатор работал корректно, нужно перед 6 строкой установить значение по умолчанию для переменной: ClosePlus = 0.0.
А в 6-ой строке заменить оператор (=) на (:=). После этого скрипт скомпилируется без ошибок:
Заключение:
- Ошибка undeclared identifier (необъявленный идентификатор) появляется если мы делаем ошибку в имени переменной или функции, а также если мы забываем поставить () после имени функции.
- Обновление переменной перед ее инициализацией. С помощью оператора (=) мы создаем новую переменную, а с помощью оператора ( :=) меняем ее значение. Если перепутать местами эти операторы, то тоже получим ошибку необъявленный идентификатор.
- При создании пользовательской самоссылающейся переменной (например profit[1]) нужно сначала установить ее значение по умолчанию на 0.0 или 1.0 при помощи оператора (=), затем обновить переменную до нового значения с помощью оператора (:=).