Проверили все работает. Скорее всего Вы неверно указали параметры, код фирмы или торговый счет. Проверьте какие параметры указанны в таблице ограничений по счетам. Первый параметр функции, будет указан в колонке Фирма Второй в колонке Торговый счет. Третий параметр, это тип лимита, он указан правильно. Также проверьте версию терминала. Актуальная сейчас 6.16.1
Если разобраться не получится, пришлите нам для анализа архив с терминалом Quik (без ключей доступа) и файл с полным кодом программы на адрес quiksupport@arqatech.com
Приветствую всех, спустя много лет, тот же вопрос поддержке, ошибка attempt to index a nil value (local 'FutLimit') при попытке взять данные из таблицы «Ограничения по клиентским счетам» Демо версия Quik 9.3.3.3 отсюда https://arqatech.com/ru/support/demo/, код ниже
Иван Сергеевич написал: Приветствую всех, спустя много лет, тот же вопрос поддержке, ошибка attempt to index a nil value (local 'FutLimit ') при попытке взять данные из таблицы «Ограничения по клиентским счетам» Демо версия Quik 9.3.3.3 отсюда https://arqatech.com/ru/support/demo/ , код ниже
При таком подходе к функциям QLUA Вы периодически будете сталкиваться с подобными ошибками.
Смотрите, в описании функции сказано:
Цитата
Функция предназначена для получения информации по фьючерсным лимитам. Функция возвращает таблицу Lua с параметрами Лимиты по фьючерсам. В случае ошибки функция возвращает «nil»
Вообще-то, из опыта, любая функция QLUA может вернуть nil. В этом случае обращение к несуществующему полю таблицы .cbplimit вызовет ошибку "attempt to index a nil value" .
Код
Мне приходится решать эту задачку так:
Table_getFuturesLimit = {} -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit
Table_getFuturesLimit = getFuturesLimit ( "SPBFUT" , "SPBFUT*****" , 0 , "SUR" ) -- результат работы функции getFuturesLimit помещается в созданную таблицу
if Table_getFuturesLimit and next(Table_getFuturesLimit) then -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.
FutLimit = Table_getFuturesLimit.cbplimit -- получается значение интересующего поля
end -- end if
Мне приходится решать эту задачку так:
Table_ getFuturesLimit = {} -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit
Table_ getFuturesLimit = getFuturesLimit ( "SPBFUT" , "SPBFUT * * * * * " , 0 , "SUR" ) -- результат работы функции getFuturesLimit помещается в созданную таблицу
if Table_ getFuturesLimit and next(Table_ getFuturesLimit ) then -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.
FutLimit = Table_ getFuturesLimit .cbplimit -- получается значение интересующего поля
end -- end if
Прокомментирую: Первая строка не нужна, Table_getFuturesLimit лучше залокалить, а next(Table_getFuturesLimit) заменить на проверку Table_getFuturesLimit.cbplimit. Если таблица пустая, то Table_getFuturesLimit.cbplimit будет nil без ошибки и условие не выполнится, но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.
Мне приходится решать эту задачку так:
Table_ getFuturesLimit = {} -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit
Table_ getFuturesLimit = getFuturesLimit ( "SPBFUT" , "SPBFUT * * * * * " , 0 , " SUR" ) -- результат работы функции getFuturesLimit помещается в созданную таблицу
if Table_ getFuturesLimit and next(Table_ getFuturesLimit ) then -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.
FutLimit = Table_ getFuturesLimit .cbplimit -- получается значение интересующего поля
end -- end if
Прокомментирую: Первая строка не нужна, Table_getFuturesLimit лучше залокалить, а next(Table_getFuturesLimit) заменить на проверку Table_getFuturesLimit.cbplimit. Если таблица пустая, то Table_getFuturesLimit.cbplimit будет nil без ошибки и условие не выполнится, но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.
Здравствуйте, уважаемый Игорь М! Спасибо за Ваши комментарии. К Вашим комментариям у меня тоже родились комментарии
На счет первой строки - согласен. Я ее привел для того, чтобы обозначить желаемый от функции getFuturesLimit результат. На счет локальности - ну это, да - азбука
Цитата
но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.
В этом случае ничего страшного не происходит. Управление остается в скрипте, а контролировать содержимое FutLimit все-равно придется, также как и Table_getFuturesLimit.cbplimit, вопрос в том, что надо как-то на это реагировать. А вариантов реакции может быть несколько, все зависит от того, где FutLimit планируется использовать. То есть, то ли повторно запрашивать лимиты, а если повторно, то сколько раз? Или, отказаться от использования FutLimit, если она - nil.
Главный момент, который я хотел отметить своим постом, это тот факт, что в функциях QLUA вредно использовать синтаксический сахар Lua для обращения к полям таблицы результатов без дополнительных проверок.
я самоучка с неглубокими знаниями :) вот так правильно? Результат тот же - второе сообщ. с "-" говорит о том, что таблица пуста, кстати пройдена за 4 цикла/итераций
Код
for i = 0,getNumberOf("futures_client_limits") - 1 do
if getItem("futures_client_limits",i).cbplimit == true then
message(debug.getinfo(1).currentline.." + " )
else
message(debug.getinfo(1).currentline.." - " )
end
end
Нет. значение же не true, зачем с ним сравнивать. Зада же посмотреть, что в таблице. 4 - цикла, значит там 4 - записи
Лучше выводить не в сообщения, а в лог файл. Но раз через сообщения, то можно так:
Код
local t
for i=0,getNumberOf ("futures_client_limits")-1 do
t = {}
for k, v in pairs(getItem("futures_client_limits",i)) do
t[#t+1] = tostring(k)..' = '..tostring(v)
end
message('i: '..tostring(i+1)..' : '..table.concat(t, '; '))
end
Как понимаю, если я у явно указывал "SUR", значит должен был получить значение cbplimit = 281613.4 (зачем/почему в таблице есть и другие варианты limit_type не понимаю) При этом для "SUR" 2 варианта: c limit_type = 0 «Денежные средства» и 6 «Суммарные залоговые средства в иностранной валюте (в рублях)» (взято из актуального QLUA.chm) Почему некорректно получаются данные из табл. не понимаю. Что можете посоветовать, уважаемые?