помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
Пользователь
Сообщений: Регистрация: 23.08.2016
23.08.2016 18:13:47
Знаю что возможно это уже обсуждалось, но я очень плохо знаю языки программирования. Этот код работает если в стакане есть все строки, если нет то выдает ошибку nil. Стакан 20 на 20, но если допустим в нем только десять заявок и есть пустые строки то возникает ошибка.( то есть стакан не полностью заполнен). .... for i=0,19 do m={} mm=getQuoteLevel2("SPBFUT","NKZ6") a0=mm.bid[mm.bid_count-i].quantity <--------ОШИБКА ЗДЕСЬ b0=mm.bid[mm.bid_count-i].price c0=math.ceil(b0*1000000) d0=tostring((c0/1000000)+1) aa0=mm.offer[mm.offer_count-i].quantity bb0=mm.offer[mm.offer_count-i].price cc0=math.ceil(bb0*1000000) dd0=tostring((cc0/1000000)-1) ... Спасибо
Пользователь
Сообщений: Регистрация: 30.01.2015
23.08.2016 18:48:03
mm=getQuoteLevel2("SPBFUT","NKZ6") if mm and mm.bit_count and mm.offer_count then a0=mm.bid[mm.bid_count-i].quantity <--------ОШИБКА ЗДЕСЬ b0=mm.bid[mm.bid_count-i].price c0=math.ceil(b0*1000000) d0=tostring((c0/1000000)+1) aa0=mm.offer[mm.offer_count-i].quantity bb0=mm.offer[mm.offer_count-i].price cc0=math.ceil(bb0*1000000) dd0=tostring((cc0/1000000)-1) end
Пользователь
Сообщений: Регистрация: 23.08.2016
23.08.2016 19:23:20
Спасибо за ответ, но это для меня ничего не меняет, возможно вы что то не дописали или я просто не понимаю что вы хотите сказать)
Пользователь
Сообщений: Регистрация: 30.01.2015
23.08.2016 19:50:38
mm=getQuoteLevel2("SPBFUT","NKZ6") if mm and mm.bit_count and mm.offer_count then ------------------------- local n=mm.bid_count; while n>0 do a0=mm.bid[n].quantity b0=mm.bid[n].price c0=math.ceil(b0*1000000) d0=tostring((c0/1000000)+1) n=n-1; end ------------------------ n=mm.bid_count; while n>0 do aa0=mm.offer[n].quantity bb0=mm.offer[n].price cc0=math.ceil(bb0*1000000) dd0=tostring((cc0/1000000)-1) n=n-1 end -------------------- end ----------------------------------- -примерно так
Пользователь
Сообщений: Регистрация: 23.08.2016
23.08.2016 20:04:54
Спасибо за вашу помощь, я попробую переделать.
Пользователь
Сообщений: Регистрация: 23.08.2016
24.08.2016 11:51:20
на самом деле то ли я не понимаю то ли меня, я упростил пример
function main() mm=getQuoteLevel2("SPBFUT","NKZ6") a0=mm.bid[mm.bid_count-10].quantity message ("объем="..a0,2) end
в этом примере программа обращается к 10 строке стакана и запрашивает количество, но так как стакан полупустой то этой строки нет и lua выдает ошибку attempt to index field(a nil value) как обойти эту ошибку в конкретном примере помогите пожалуйста.
Пользователь
Сообщений: Регистрация: 20.04.2016
24.08.2016 12:04:35
для проверки значения, можно использовать условие:
if mm.bid[mm.bid_count-10] ~= nil then a0=mm.bid[mm.bid_count-10].quantity end
у тебя ошибка возникает, т.к. сам элемент mm.bid[mm.bid_count-10] равен nil, а ты пытаешься взять из него поле quantity
Напиши, если помог
Пользователь
Сообщений: Регистрация: 23.08.2016
24.08.2016 12:17:04
Да, спасибо. Таким образом программа выполняется без ошибки. Кое что проясняется. Теперь попробую воткнуть это в свой код. Спасибо!
Пользователь
Сообщений: Регистрация: 20.04.2016
24.08.2016 12:20:04
всегда пожалуйста
Пользователь
Сообщений: Регистрация: 30.01.2015
24.08.2016 15:59:18
Цитата
Алекс Лепс написал: Спасибо за вашу помощь, я попробую переделать.
В примере написано две проверки первый if проверяет существования стакана и очереди в нем Циклы делаются по фактической длине очереди У вас циклы делались на фиксированную длину очереди. Примерно так.
Пользователь
Сообщений: Регистрация: 27.01.2016
27.08.2016 04:30:37
, можно увидеть весь код целиком? Странно то, что 20 раз в цикле Вы запрашиваете getQuoteLevel2("SPBFUT","NKZ6") ...
Пользователь
Сообщений: Регистрация: 06.09.2016
08.09.2016 17:51:59
Помогите избавиться от ошибки nil. Следующий код выдаёт ошибку "lua 78: attempt to index a nil value" , когда началась новая сессия и данные в терминал ещё не подгрузились.
78if getItem("futures_client_limits",0).cbplused ~= nil then 79 message( "futures_client_limits не равен nil" ,1) 80 end
Пользователь
Сообщений: Регистрация: 06.09.2016
08.09.2016 18:28:15
Реализовал пока так, но хотелось бы не использовать массив var var ={} var = getItem("futures_client_limits",0) if tostring(var) ~= "nil" then message( "futures_client_limits не равен nil" ,1) end
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
08.09.2016 19:15:41
Цитата
rbatar написал: 78 if getItem("futures_client_limits",0).cbplused ~= nil then
Сначала следует проверить, что вот эта часть не равна nil getItem("futures_client_limits",0)
В следующем посте вы это, собственно, и сделали, правда несколько экзотическим образом. Вот так видится проще:
if getItem("futures_client_limits",0) ~= nil then
или if var ~=nil then
Пользователь
Сообщений: Регистрация: 06.09.2016
08.09.2016 19:22:08
Спасибо за помощь. Ваш 1-й вариант то, что надо
Цитата
if getItem("futures_client_limits",0) ~= nil then
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2016 20:23:21
а так: local x="futures_client_limits"; local y = getItem(x,0) if y then message( x.." не равен nil" ,1) end
Пользователь
Сообщений: Регистрация: 06.09.2016
08.09.2016 20:39:22
Цитата
local x="futures_client_limits"; local y = getItem(x,0) if y then message( x.." не равен nil" ,1) end
Да, так тоже очень неплохо. Спасибо, Николай, возьму на вооружение.
Пользователь
Сообщений: Регистрация: 14.04.2017
14.04.2017 22:23:46
Доброго дня! Уважаемые мастера программирования, у меня (как и у Алекс Лепс) Квиком выдается ошибка "attempt to index field '?' (a nil value)"
Я подозреваю что неправильно написал перебор элементов массива в коде, для которых потом выполняется функция. Вот кусок кода:
p_seccode={"PPPP","YYYY","AAAA","GGGG","NNNN","RRRR","HHHH"} - это массив бумаг chart={"RSI1","RSI2","RSI3","RSI4","RSI5","RSI6","RSI7"} - это массив индикаторов графиков
for i,v in pairs(p_seccode) do
function robot()
for i,v in pairs(chart) do local RSI=getNumCandles(chart[i]) local N=getNumCandles("Price") t,n,i=getCandlesByIndex("Price", 0, N-1, 1) RSI_t,RSI_n,RSI_i=getCandlesByIndex("RSI", 0, RSI-3, 2) и т.д.
Я не знаток языка Lua, поэтому буду очень благодарен помощи! Спасибо!
Пользователь
Сообщений: Регистрация: 23.01.2015
14.04.2017 22:38:46
Здравствуйте, Если Вы перебираете идентификаторы, то и в getCandlesByIndex тоже надо их перебирать. т.е. напишите так: RSI_t,RSI_n,RSI_i=getCandlesByIndex(RSI, 0, RSI-3, 2)
Если нужен дальнейший анализ, приведите полный код и укажите строку на которой возникает ошибка (написано в тексте ошибки)
Пользователь
Сообщений: Регистрация: 14.04.2017
14.04.2017 23:46:37
Сергей, пока не уловил как надо. Строчка, которую Вы написали, полностью совпадает с моей кроме кавычек. Наверное что то не вижу.
function main() while is_run do sleep(2000) robot() end end
function to_log(a_msg) p_file:write(os.date().." "..a_msg.."\n") end
for i,v in pairs(p_seccode) do
function robot()
for i,v in pairs(chart) do local RSI=getNumCandles(chart[i]) local N=getNumCandles("Price") t,n,i=getCandlesByIndex("Price", 0, N-1, 1) RSI_t,RSI_n,RSI_i=getCandlesByIndex("RSI", 0, RSI-3, 2)
if (in_trade) then --сигнал на покупку (RSI пересекает уровень продажи снизу вверх) if RSI_t[0].close<p_buy_level_RSI and RSI_t[1].close>p_buy_level_RSI then - - ВОТ ЗДЕСЬ ВЫБИВАЕТ ОШИБКУ Trade("B",p_count-count,t[0].close+p_spread) end end
if not(in_trade) then --сигнал на продажу (RSI пересекает уровень продажи сверху вниз) if RSI_t[0].close>p_buy_level_RSI and RSI_t[1].close<p_buy_level_RSI then Trade("S",count+p_count,t[0].close-p_spread) end end
if (in_trade) then --сигнал на покупку (RSI пересекает уровень продажи сверху вниз) if RSI_t[0].close>p_sell_level_RSI and RSI_t[1].close<p_sell_level_RSI then Trade("S",p_count-count,t[0].close+p_spread) end end
if not (in_trade) then --сигнал на продажу (RSI пересекает уровень продажи снизу вверх) if RSI_t[0].close<p_sell_level_RSI and RSI_t[1].close>p_sell_level_RSI then Trade("B",count+p_count,t[0].close-p_spread) end end
end end
end
Пользователь
Сообщений: Регистрация: 23.01.2015
14.04.2017 23:53:51
Цитата
Вячеслав написал: Строчка, которую Вы написали, полностью совпадает с моей кроме кавычек. Наверное что то не вижу.
Вот именно. кавычки - это строковое значение, а без кавычек это переменная которая меняет значения. Вам не кажется что брать свечки с одного графика, по количеству свечек с другого, как-то не правильно? А ведь именно это Вы и делаете в строке getCandlesByIndex("RSI", 0, RSI-3, 2). Значение "RSI" (в кавычках) - это строка и она НЕ меняется. А RSI (без кавычек) - это переменная которая меняется в цикле local RSI=getNumCandles(chart[i])
Пользователь
Сообщений: Регистрация: 14.04.2017
15.04.2017 13:30:28
Точно, я же говорю в упор не вижу чего то)) Сергей спасибо большое, буду исправлять.