Ошибки компиляции и выполнения
1Ошибки компиляции и выполнения
Все коды LS, которые показывают редактор и график LootScript: текст сообщения, причина и исправление, частые ошибки с примерами, пределы выполнения и случаи, когда вместо ошибки получается na.
Каждое сообщение компилятора и исполнителя LootScript начинается с кода вида LS2008. Код не меняется между версиями и не зависит от языка интерфейса, поэтому по нему удобно искать: здесь собраны все коды, которые может показать терминал, с текстом сообщения, причиной и способом исправления.
Сообщения выводятся по-русски, если интерфейс терминала на русском, и по-английски на любом другом языке. Сначала — ошибки, которые встречаются чаще всего, затем ошибки выполнения и полная таблица.
Где видны ошибки
При компиляции. Редактор компилирует скрипт в каждой паузе набора. Найденное попадает во вкладку «Проблемы» в нижней части редактора: код, текст и позиция вида «Стр 6:6». Двойной щелчок по строке переводит курсор к месту ошибки. В заголовке редактора отображается итог: «ок · 12 мс», «предупреждений: 2» или «ошибок: 1».
При выполнении. Скрипт без ошибок компиляции может остановиться на каком-то баре: закончился бюджет операций, индекс вышел за границы массива, неизвестен инструмент. Тогда во вкладке «Вывод» появится строка «Скрипт остановлен: LS6004: …», а в окне тестера стратегий — та же причина. Остальные скрипты, панели и сам терминал продолжают работать.
Диагностики бывают трёх уровней:
| Уровень | Что значит | Что с графиком |
|---|---|---|
| Ошибка | Скрипт не собран | На график не добавляется: «Скрипт с ошибками на график не кладётся — см. «Проблемы»». Если скрипт уже на графиках, там остаётся прежняя рабочая версия |
| Предупреждение | Скрипт собран, но результат может обмануть: например, перерисуется на живом баре | Скрипт работает |
| Сведение | Скрипт собран, но какая-то его настройка ничего не делает | Скрипт работает |
Как устроены коды
| Коды | Этап | О чём |
|---|---|---|
| LS0001–LS0009 | Чтение текста | Символы, строки, числа, цвета, директива #version |
| LS1000–LS1012 | Разбор | Скобки, блоки, порядок операторов, объявление скрипта |
| LS2000–LS2030 | Типы и имена | Неизвестные имена, типы, аргументы, na |
| LS3000–LS3033 | Смысл программы | ta.* в ветках, рекурсия, стратегии, библиотеки, request.security |
| LS4000–LS4009 | Пределы компиляции | Слишком много рядов, выводов, вызовов |
| LS5000–LS5013 | Перерисовка и честность теста | Значения, которые на истории выглядят иначе, чем вживую |
| LS6000–LS6036 | Выполнение | Бюджеты, индексы, коллекции, строки, объекты рисования |
| LS0999 | Внутренний сбой | Дефект компилятора — о нём нужно сообщить |
Частые ошибки компиляции
LS1009 — нет объявления скрипта
«Нет объявления скрипта — начните с indicator(“Название”)». Первым оператором файла должно стоять indicator(...), strategy(...) или library(...). Эта же ошибка появляется, если объявление есть, но выше него что-то написано. Комментарии и директива #version 1 не мешают.
// Так нельзя: объявление не первое
len = input.int(14, "Длина")
indicator("RSI")indicator("RSI")
len = input.int(14, "Длина")Второе объявление в том же файле даёт LS1008: у скрипта оно одно.
LS2002 — неизвестное имя
«Неизвестное имя «…» — проверьте написание или объявите его выше». Чаще всего это опечатка или функция без своего пространства имён: все индикаторные функции живут в ta, математика — в math, цвета — в color.
avg = sma(close, 20)avg = ta.sma(close, 20)Та же ошибка будет, если переменную прочитали выше строки, где она объявлена. Полный список имён — в справочнике функций.
LS2008 — сравнение с na
«Сравнение с na всегда ложно — используйте na(x)». Любое сравнение с na, включая == и !=, даёт false, поэтому компилятор такую запись не пропускает.
x = ta.sma(close, 50)
plot(x == na ? close : x)x = ta.sma(close, 50)
plot(na(x) ? close : x)Короче то же самое пишется через ??: plot(x ?? close).
LS2014 — значение меняется от бара к бару там, где нужна постоянная
««…» в «…» требует значение не слабее input, а передано series — возьмите input.*(…) или литерал». Длина окна ta.* должна быть известна до первого бара. Длина, которую выбирают по условию на каждом баре, не подходит.
len = close > open ? 10 : 20
avg = ta.sma(close, len)Посчитайте оба варианта и выбирайте результат, а не длину:
fast = ta.sma(close, 10)
slow = ta.sma(close, 20)
avg = close > open ? fast : slowЕсли длину должен задавать пользователь, возьмите её из input.int(...).
LS3004 — вызов ta.* зависит от переменной из ветки
«Аргумент «…» нельзя вычислить вне ветки — вынесите вызов ta.* на верхний уровень». Функции ta.* помнят прошлые бары, поэтому компилятор вычисляет их на каждом баре, даже если вызов написан внутри if. Если аргумент объявлен только внутри ветки, на других барах его просто нет.
var float avgBody = na
if close > open {
body = close - open
avgBody := ta.sma(body, 10)
}body = close - open
avgBody = ta.sma(body, 10)LS2017, LS2007, LS1006 — строки, условия и сравнения
У этих трёх ошибок общая причина: LootScript не приводит типы молча.
| Код | Сообщение | Как исправить |
|---|---|---|
| LS2017 | «Строку нельзя складывать с числом (… + …) — используйте str.tostring(…)» | "RSI " + str.tostring(r) вместо "RSI " + r |
| LS2007 | «Условие должно быть bool, а здесь …» | if volume > 0 вместо if volume — у чисел нет «истинности» |
| LS1006 | «Сравнения не сцепляются — напишите a < b and b < c» | low < close and close < high вместо low < close < high |
LS2018 и LS2019 — имя уже занято
««…» уже объявлено в этой области» (LS2018) — переменную объявили второй раз через =. Чтобы изменить значение, используйте :=.
level = high
level := low««…» затеняет встроенное имя — выберите другое» (LS2019) — переменная, функция или тип названы так же, как встроенный ряд или функция: close, time, hour, volume. Переименуйте: startHour вместо hour. Имена пространств вроде color или position для переменных можно использовать.
LS2004 и LS2005 — аргументы вызова
««…» ожидает … аргумент(ов), а передано …» (LS2004) и «У «…» нет параметра «…»» (LS2005). Сверьте вызов с сигнатурой в справочнике: имена параметров пишутся ровно так, как там указано.
plot(close, colour = color.red)plot(close, color = color.red)LS3011 и LS5011 — стратегии
«strategy.* доступно только в strategy(…)» (LS3011): заявки и состояние позиции есть только у скрипта, объявленного через strategy(...). Замените indicator("…") на strategy("…").
«Стратегия читает «…»: у стакана и ленты нет истории, бэктест был бы вымыслом» (LS5011): стратегия проверяется на истории, а у book.* и tape.* истории нет — на каждом прошлом баре там na.
strategy("Перекос стакана")
if book.imbalance(10) > 0.5 {
strategy.entry("L", strategy.long)
}Для истории стакана есть пространство depth: там, где стакан записан, оно даёт значения на каждом баре.
strategy("Перекос стакана")
if depth.imbalance(1.0) > 0.5 {
strategy.entry("L", strategy.long)
}LS5000–LS5006 — предупреждения о перерисовке
Эти предупреждения не мешают скрипту работать. Они говорят, что линия на истории будет выглядеть иначе, чем её видели вживую:
- LS5001 — до графика доходит значение, которое бывает только на живом баре (
barstate.isrealtime,barstate.isnew). - LS5000 — до графика доходит переменная
varip: она копит тики живого бара, которых в истории нет. - LS5006 — до графика доходят
book.*илиtape.*: на истории ряд пуст. - LS5003 — значение старшего таймфрейма из
request.securityбез[1]: незакрытый бар ещё изменится. - LS5002 —
lookahead = trueвrequest.security: на истории скрипт видит будущее. - LS5005 — до графика доходит
math.randomилиtimenow: два прогона дадут разные линии.
Если так и задумано — например, индикатор нужен только для живой торговли, — предупреждение можно оставить.
LS3016 — настройка принята и ничего не делает
Это сведение, а не ошибка. Оно встречается в скриптах, перенесённых с других платформ: параметр существует ради совместимости, но в терминале ни на что не влияет. Вторая часть сообщения объясняет почему.
| Что написано | Пояснение в сообщении |
|---|---|
maxBarsBack в объявлении |
история грузится колонкой целиком |
format, precision, scale в объявлении |
шкалу значений и её формат ведёт терминал |
timeframe в объявлении |
скрипт считается на таймфрейме графика, другой даёт request.security |
Толщина, стиль или другая настройка вывода, заданная выражением, а не константой (цвет plot и отметок может меняться по барам) |
эта сборка читает эту настройку только константой |
color у четвёртого и следующих plot |
панель рисует только первые три ряда |
location.absolute у plotshape или plotchar |
у отметки нет ряда, к значению которого её можно прижать |
display, которого у ряда нет |
у этого ряда нет такой поверхности |
Ошибки выполнения
Ошибка выполнения останавливает скрипт на том баре, где она случилась. Текст появляется во вкладке «Вывод» в виде «Скрипт остановлен: LS6004: …».
LS6004 и LS6005 — скрипт работает слишком долго
«Скрипт исчерпал бюджет операций на бар — упростите цикл» (LS6004) и «Скрипт превысил лимит времени на проход» (LS6005). У каждого бара есть бюджет в 2 000 000 операций. Время тоже ограничено: весь проход по истории — 2 секунды, один тик живого бара — 20 мс. Почти всегда причина — цикл, который не заканчивается или обходит слишком много данных на каждом баре.
var int n = 0
i = 0
while i < 10 {
n := n + 1
}var int n = 0
i = 0
while i < 10 {
n := n + 1
i := i + 1
}LS6002 и LS5004 — чтение будущего
Индекс истории x[n] не может быть отрицательным: close[-1] означал бы следующий бар. Если отрицательное число написано прямо в тексте, компилятор остановит его сразу (LS5004). Если оно получилось при вычислении, скрипт остановится на баре с ошибкой «Отрицательное смещение истории — читать будущее нельзя» (LS6002). Индекс больше числа загруженных баров ошибкой не считается — он даёт na.
LS6001, LS6007, LS6019 — коллекции и объекты
- LS6001 «Индекс … вне границ» —
array.get,array.setилиmatrix.getза пределами размера. Проверяйтеarray.size(a)перед обращением. - LS6007 «Обращение к пустому объекту (na)» — коллекцию объявили, но не создали:
var array<float> a = na, а затемa.push(x). Создайте её черезarray.new<float>(). - LS6019 «Объект рисования уже удалён или вытеснен по потолку — создайте его заново». Одновременно живут 500 объектов одного вида, самый старый вытесняется. Поднимите предел через
maxLinesCount,maxLabelsCountилиmaxBoxesCountв объявлении либо переиспользуйте объект черезset_*.
LS6017 и LS6018 — инструмент и таймфрейм в request.security
«Символ «…» неизвестен — проверьте формат «ПЛОЩАДКА:СИМВОЛ» или задайте ignore_invalid_symbol = true» (LS6017) и «Таймфрейм «…» не разбирается — ожидается «5», «60», «4h», «1D», «1W»» (LS6018). С ignore_invalid_symbol = true неизвестный инструмент даёт na вместо остановки.
Пределы выполнения
| Что ограничено | Предел | Код при превышении |
|---|---|---|
| Операций на бар | 2 000 000 | LS6004 |
| Время прохода по истории / тика живого бара | 2 с / 20 мс | LS6005 |
| Элементов массива | 100 000 | LS6003 |
| Пар в словаре | 50 000 | LS6003 |
| Элементов матрицы | 1 000 000 | LS6003 |
Длина окна ta.* |
100 000 баров | LS6034 |
| Длина одной строки | 100 000 символов | LS6014 |
| Ячеек в таблице | 2000 | LS6029 |
| Слоёв теплового поля | 4 (от 0 до 3) | LS6036 |
| Объектов рисования одного вида | 500 по умолчанию | старые вытесняются |
Разных пар «инструмент + таймфрейм» в request.security |
8 | — |
Вызовов request.security |
32 | LS4009 при компиляции |
Когда ошибки нет, а значения нет
Многие ситуации, которые в других языках роняют программу, в LootScript дают na — пропуск на графике, а не остановку:
- арифметика с
naдаётna:close - xпри пустомx— тоже пусто; x[n]глубже начала истории —na;- целочисленное деление на ноль —
na, а дробное деление на ноль скрипт не останавливает; book.*,tape.*иscreener.*на исторических барах —na;- кластеры, дельта, открытый интерес и история стакана —
naна барах, где данных нет. Проверяйтеcluster.available,delta.availableи соседние флаги; ta.*на первых барах, пока окно не заполнилось, —na.
na на графике никогда не рисуется нулём: линия прерывается. Чтобы подставить значение, используйте nz(x), x ?? запасное или fixnan(x).
Все коды
LS0001–LS0009 и LS0999 — чтение текста
| Код | Сообщение | Что делать |
|---|---|---|
| LS0001 | Неожиданный символ «…» | Уберите символ, которого нет в языке |
| LS0002 | Строка не закрыта — добавьте закрывающую кавычку до конца строки | Закройте кавычку на той же строке |
| LS0003 | Блочный комментарий не закрыт — добавьте */ | Закройте /* … */ |
| LS0004 | Неизвестная escape-последовательность «…» в строке | Допустимы \n, \r, \t, \0, \\, \", \' и \u{…}; одиночную \ удвойте |
| LS0005 | Неверный числовой литерал «…» | Проверьте запись числа |
| LS0006 | Число «…» не помещается в тип | Уменьшите число |
| LS0007 | Неверный литерал цвета «…» — ожидается #RRGGBB или #RRGGBBAA | Шесть или восемь шестнадцатеричных цифр |
| LS0008 | Разделитель разрядов «_» стоит в начале, в конце или сдвоен | Пишите 1_000_000 |
| LS0009 | Неверная директива версии — ожидается #version <число> первой строкой | #version 1 в первой строке |
| LS0999 | Компилятор не справился с этим файлом — это дефект сборки, сообщите о нём | Сообщите в поддержку, приложите скрипт |
LS1000–LS1012 — разбор
| Код | Сообщение | Что делать |
|---|---|---|
| LS1000 | Неожиданно: … | Проверьте строку на лишние символы |
| LS1001 | Ожидалось «…», а встретилось … | Чаще всего не закрыта скобка |
| LS1002 | Ожидалось выражение, а встретилось … | После оператора или запятой не хватает значения |
| LS1004 | Ожидалось имя, а встретилось … | После var, func, . нужно имя |
| LS1005 | Ожидался блок в фигурных скобках, а встретилось … | Добавьте { … } |
| LS1006 | Сравнения не сцепляются — напишите a < b and b < c | Разбейте на два сравнения через and |
| LS1008 | Второе объявление скрипта — у скрипта может быть только одно | Оставьте одно объявление |
| LS1009 | Нет объявления скрипта — начните с indicator(“Название”) | Первой строкой — indicator, strategy или library |
| LS1010 | Слишком глубокая вложенность (больше 64) — вынесите часть в функцию | Разбейте выражение или блок |
| LS1012 | Тело if / for / while пишется в фигурных скобках: if cond { … } | Добавьте фигурные скобки |
LS2000–LS2030 — типы и имена
| Код | Сообщение | Что делать |
|---|---|---|
| LS2000 | Несовпадение типов: ожидался …, а получен … | Передайте значение нужного типа |
| LS2001 | Нельзя преобразовать … в … | Преобразуйте явно: str.tostring, math.round |
| LS2002 | Неизвестное имя «…» — проверьте написание или объявите его выше | Исправьте опечатку, добавьте пространство (ta.), объявите выше |
| LS2003 | «…» — не функция, вызывать нельзя | Уберите скобки: это ряд или константа |
| LS2004 | «…» ожидает … аргумент(ов), а передано … | Сверьте число аргументов со справочником |
| LS2005 | У «…» нет параметра «…» | Исправьте имя параметра |
| LS2006 | Аргумент «…» передан дважды | Уберите повтор |
| LS2007 | Условие должно быть bool, а здесь … | Сравните явно: x > 0, not na(x) |
| LS2008 | Сравнение с na всегда ложно — используйте na(x) | na(x) вместо x == na |
| LS2014 | «…» в «…» требует значение не слабее …, а передано … — возьмите input.*(…) или литерал | Литерал, input.* или константа вместо ряда |
| LS2015 | «…» объявлено константой — присваивать нельзя; объявите через var | Настройку input.*, переменную цикла и параметр функции менять нельзя — скопируйте значение в свою переменную |
| LS2017 | Строку нельзя складывать с числом (… + …) — используйте str.tostring(…) | str.tostring или str.format |
| LS2018 | «…» уже объявлено в этой области | := для нового значения или другое имя |
| LS2019 | «…» затеняет встроенное имя — выберите другое | Переименуйте |
| LS2020 | Ветви дают разные типы: … и … | Приведите ветви к одному типу |
| LS2021 | switch без ветви по умолчанию «=> …» — добавьте её | Добавьте => значение |
| LS2022 | У «…» не выведен тип элемента — укажите его: … | array.new<float>() |
| LS2028 | У поля «…» типа «…» не указан тип — напишите его перед именем: float … | float price в объявлении type |
| LS2029 | export «…»: у экспортируемой функции обязаны быть объявлены типы всех параметров и тип результата | Укажите типы |
| LS2030 | «…» в «…» читается до первого бара — нужен литерал или именованная константа | В объявлении — только постоянные значения |
LS3000–LS3033 — смысл программы
| Код | Сообщение | Что делать |
|---|---|---|
| LS3002 | «…» вызывает саму себя — рекурсия в LootScript запрещена | Замените рекурсию циклом |
| LS3003 | Взаимная рекурсия запрещена: … | Разорвите круг вызовов |
| LS3004 | Аргумент «…» нельзя вычислить вне ветки — вынесите вызов ta.* на верхний уровень | Вычислите аргумент и вызов вне if |
| LS3006 | «…» затеняет имя из внешней области (предупреждение) | Переименуйте внутреннюю переменную |
| LS3007 | «…» вне цикла | break и continue — только в цикле |
| LS3008 | return вне функции | return — только в теле функции |
| LS3009 | export «…» возможен только в library(…) | Уберите export или сделайте файл библиотекой |
| LS3010 | «…» без единого уровня (profit/loss/stop/limit/trail) — пустая операция (предупреждение) | Задайте стоп, тейк или трейлинг |
| LS3011 | strategy.* доступно только в strategy(…) | Объявите скрипт через strategy(...) |
| LS3012 | В библиотеке нельзя рисовать и объявлять входы: … | Перенесите вывод и настройки в индикатор |
| LS3013 | «…» внутри request.security не станет строкой настроек — объявите вход выше и передайте его значение | Объявите input.* выше и передайте переменную |
| LS3016 | Настройка «…» принята и ничего не делает: … (сведение) | Можно оставить или удалить |
| LS3018 | Библиотека «…» не найдена в папке библиотек — имя берётся из её library(“…”, N), а не из имени файла | Проверьте имя в объявлении библиотеки |
| LS3019 | Библиотеки «…» версии … нет; установлены: … | Укажите установленную версию |
| LS3020 | «…» внутри request.security: у стакана и ленты нет истории на чужой серии | Уберите book.*, tape.* из выражения |
| LS3025 | Функция «…» объявлена, но не вызывается — её тело проверено лишь пробно (предупреждение) | Вызовите функцию или удалите |
| LS3026 | «…» требует стоп, от которого считать размер: loss/stop у входа или в strategy.exit | Добавьте стоп к входу или strategy.exit |
| LS3028 | Эта сборка не поддерживает: … | Перепишите без этой конструкции |
| LS3029 | Ветвь switch для «…» повторяется — вторая недостижима | Уберите повтор |
| LS3030 | «…» — переменная графика, а выражение request.security считается на другой серии; передайте значение через input.* или посчитайте его внутри выражения | Посчитайте внутри выражения |
| LS3031 | Библиотеки импортируют друг друга по кругу: … | Разорвите круг импортов |
| LS3032 | В библиотеке «…» допустимы только объявления функций и импорты — здесь … | Уберите из библиотеки остальной код |
| LS3033 | Библиотека «…» не компилируется (…) — откройте её в редакторе и почините | Исправьте ошибку в самой библиотеке |
LS4000–LS4009 — пределы компиляции
| Код | Сообщение | Что делать |
|---|---|---|
| LS4000 | Слишком много рядов: … при пределе 512 — уберите лишние ta.* или переиспользуйте переменные | Сократите число вызовов ta.* и переменных с историей |
| LS4001 | Программа слишком велика (больше 4096 встраиваний) — упростите функции | Уменьшите число вызовов пользовательских функций |
| LS4002 | Слишком много plot — панель рисует не больше трёх рядов | Выводов — рядов plot, отметок plotshape и plotchar, фона bgcolor — не больше 64; рисуются первые три plot |
| LS4009 | Слишком много вызовов request.security: …, предел 32 | Объедините вызовы |
LS5000–LS5013 — перерисовка и тестер
| Код | Сообщение | Что делать |
|---|---|---|
| LS5000 | Значение varip доходит до вывода — на истории оно будет другим (перерисовка) (предупреждение) | Используйте var, если нужна одинаковая история |
| LS5001 | Значение только живого бара доходит до вывода — на истории его нет (перерисовка) (предупреждение) | Используйте barstate.isconfirmed |
| LS5002 | lookahead = true читает будущее — на истории результат недостижим в реальном времени (предупреждение) | Уберите lookahead = true |
| LS5003 | Старший таймфрейм без смещения — незакрытый бар перерисуется; добавьте [1] (предупреждение) | request.security(…, close[1]) |
| LS5004 | Отрицательное смещение сдвигает вывод в прошлое — на истории линия знает будущее | Уберите отрицательный индекс x[-n] |
| LS5005 | Недетерминированное значение доходит до вывода — два прогона дадут разный ряд (предупреждение) | Не выводите math.random и timenow на график |
| LS5006 | Данные есть только в реальном времени — на истории ряд пуст (предупреждение) | Для истории стакана используйте depth.* |
| LS5011 | Стратегия читает «…»: у стакана и ленты нет истории, бэктест был бы вымыслом | Уберите book.*, tape.* из стратегии |
| LS5012 | Стратегия заглядывает вперёд («…») — отчёт помечен как недостижимый в реальном времени (предупреждение) | Уберите lookahead = true |
| LS5013 | «…» включён: заявки исполняются по закрытию бара, отчёт помечен (сведение) | Уберите processOrdersOnClose, если нужен реалистичный отчёт |
LS6000–LS6036 — выполнение
| Код | Сообщение | Что делать |
|---|---|---|
| LS6001 | Индекс … вне границ | Проверьте размер коллекции перед обращением |
| LS6002 | Отрицательное смещение истории — читать будущее нельзя | Индекс истории должен быть ≥ 0 |
| LS6003 | Превышен предел размера коллекции (…) — коллекция создана в строке … | Ограничьте рост: удаляйте старые элементы |
| LS6004 | Скрипт исчерпал бюджет операций на бар — упростите цикл | Проверьте условие выхода из цикла |
| LS6005 | Скрипт превысил лимит времени на проход | Уменьшите работу на каждом баре |
| LS6007 | Обращение к пустому объекту (na) | Создайте коллекцию или объект до обращения |
| LS6014 | Строка длиннее потолка в 100000 знаков — укоротите её или соберите по частям | Сократите строку |
| LS6015 | Неизвестный часовой пояс «…» — нужен идентификатор IANA, например «Europe/Berlin» | Пояс в формате IANA |
| LS6017 | Символ «…» неизвестен — проверьте формат «ПЛОЩАДКА:СИМВОЛ» или задайте ignore_invalid_symbol = true | Исправьте символ |
| LS6018 | Таймфрейм «…» не разбирается — ожидается «5», «60», «4h», «1D», «1W» | Исправьте таймфрейм |
| LS6019 | Объект рисования уже удалён или вытеснен по потолку — создайте его заново | Проверяйте объект или поднимите предел |
| LS6020 | str.format: плейсхолдеру {…} не передан аргумент | Передайте аргумент для каждого {n} |
| LS6021 | str.match: шаблон исчерпал бюджет шагов — упростите его | Упростите регулярное выражение |
| LS6026 | Исчерпан общий бюджет коллекций скрипта (… ячеек) — не влезла коллекция из строки … | Сократите число или размер коллекций |
| LS6027 | Недопустимый аргумент «…» в … | Например, отрицательный размер в array.new |
| LS6028 | Исчерпан бюджет строк скрипта (…) — переиспользуйте строки вместо новых на каждом баре | Не собирайте новые строки на каждом баре |
| LS6029 | В таблице больше 2000 ячеек — это потолок панели | Уменьшите таблицу |
| LS6030 | Ячейка таблицы вне сетки: … | Номер столбца и строки — внутри размера таблицы |
| LS6031 | Встроенная функция «…» объявлена, но не реализована — это дефект сборки, сообщите о нём | Сообщите в поддержку |
| LS6032 | Хэндл не указывает на объект нужного вида — объект освобождён или хэндл из другого прогона | Не храните ссылки на удалённые объекты |
| LS6033 | Поле … вне объявления типа «…» — это дефект сборки, сообщите о нём | Сообщите в поддержку |
| LS6034 | Длина окна … больше потолка 100000 — такое окно не поместится в память | Уменьшите длину окна |
| LS6035 | Шаг цикла равен нулю — счётчик не двигается, и конец недостижим | by в цикле for не может быть нулём |
| LS6036 | Слой тепла … вне 0…3 | layer от 0 до 3 |
Коды, которые эта версия не выдаёт
Эти номера закреплены в языке, но текущая версия терминала их не показывает: LS1003, LS1007, LS1011, LS2016, LS3000, LS3001, LS3005, LS4003, LS4004, LS5007, LS6000, LS6006, LS6008, LS6022, LS6023. Например, объявление не первой строкой сейчас сообщается как LS1009, а деление на ноль не останавливает скрипт с LS6000.
Дальше
https://docs.lootx.trade/ru/loot/errors