помогите исправить ошибку attempt to index field(a nil value), при запуске скрипта если стакан не полный то вылезает ошибка attempt to index field(a nil value)
Знаю что возможно это уже обсуждалось, но я очень плохо знаю языки программирования. Этот код работает если в стакане есть все строки, если нет то выдает ошибку 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) ... Спасибо
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
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 ----------------------------------- -примерно так
на самом деле то ли я не понимаю то ли меня, я упростил пример
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) как обойти эту ошибку в конкретном примере помогите пожалуйста.
Алекс Лепс написал: Спасибо за вашу помощь, я попробую переделать.
В примере написано две проверки первый if проверяет существования стакана и очереди в нем Циклы делаются по фактической длине очереди У вас циклы делались на фиксированную длину очереди. Примерно так.
Помогите избавиться от ошибки 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
Реализовал пока так, но хотелось бы не использовать массив var var ={} var = getItem("futures_client_limits",0) if tostring(var) ~= "nil" then message( "futures_client_limits не равен nil" ,1) end
Доброго дня! Уважаемые мастера программирования, у меня (как и у Алекс Лепс) Квиком выдается ошибка "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, поэтому буду очень благодарен помощи! Спасибо!
Здравствуйте, Если Вы перебираете идентификаторы, то и в getCandlesByIndex тоже надо их перебирать. т.е. напишите так: RSI_t,RSI_n,RSI_i=getCandlesByIndex(RSI, 0, RSI-3, 2)
Если нужен дальнейший анализ, приведите полный код и укажите строку на которой возникает ошибка (написано в тексте ошибки)
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
Вячеслав написал: Строчка, которую Вы написали, полностью совпадает с моей кроме кавычек. Наверное что то не вижу.
Вот именно. кавычки - это строковое значение, а без кавычек это переменная которая меняет значения. Вам не кажется что брать свечки с одного графика, по количеству свечек с другого, как-то не правильно? А ведь именно это Вы и делаете в строке getCandlesByIndex("RSI", 0, RSI-3, 2). Значение "RSI" (в кавычках) - это строка и она НЕ меняется. А RSI (без кавычек) - это переменная которая меняется в цикле local RSI=getNumCandles(chart[i])