помогите исправить ошибку attempt to index field(a nil value)

Страницы: 1
RSS
помогите исправить ошибку 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 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

Напиши, если помог
 
Да, спасибо. Таким образом программа выполняется без ошибки. Кое что проясняется. Теперь попробую воткнуть это в свой код. Спасибо!
 
всегда пожалуйста
 
Цитата
Алекс Лепс написал:
Спасибо за вашу помощь, я попробую переделать.
В примере написано две проверки
первый if проверяет существования стакана и очереди в нем
Циклы делаются по фактической длине очереди У вас циклы делались на фиксированную длину очереди.
Примерно так.
 
Алекс Лепс,
можно увидеть весь код целиком? Странно то, что 20 раз в цикле Вы запрашиваете getQuoteLevel2("SPBFUT","NKZ6") ...
 
Помогите избавиться от ошибки nil.
Следующий код выдаёт ошибку "lua 78: attempt to index a nil value" , когда началась новая сессия и данные в терминал ещё не подгрузились.
     
78  if 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  
 
Цитата
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
 
Спасибо за помощь. Ваш  1-й вариант то, что надо
Цитата
if getItem("futures_client_limits",0) ~= nil then
 
а так:
local x="futures_client_limits";
local y = getItem(x,0)
if y  then  
message( x.." не равен nil" ,1)
end
 
Цитата
local x="futures_client_limits";
local y = getItem(x,0)
if y  then  
message( x.." не равен 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)

Если нужен дальнейший анализ, приведите полный код и укажите строку на которой возникает ошибка (написано в тексте ошибки)
 
Сергей, пока не уловил как надо. Строчка, которую Вы написали, полностью совпадает с моей кроме кавычек. Наверное что то не вижу.

Вот более полный код:

--Параметры:
p_classcode="TQBR"
p_seccode={"POLY","YNDX","AVAZ","GAZP","NLMK","RTKM","HYDR"}
chart={"RSI1","RSI2","RSI3","RSI4","RSI5","RSI6","RSI7"}
p_account="L01-00000F00"
p_clientcode="56445"
p_count=77
p_spread=0.7
p_buy_level_RSI=70
p_sell_level_RSI=30

--Служебные переменные
is_run = true
count = 0
in_trade = true
order_num = ""
direction = ""  
last_price = 0


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
 
Цитата
Вячеслав написал:
Строчка, которую Вы написали, полностью совпадает с моей кроме кавычек. Наверное что то не вижу.

Вот именно. кавычки - это строковое значение, а без кавычек это переменная которая меняет значения.
Вам не кажется что брать свечки с одного графика,  по количеству свечек с другого, как-то не правильно?
А ведь именно это Вы и делаете в строке getCandlesByIndex("RSI", 0, RSI-3, 2). Значение "RSI" (в кавычках) - это строка и она НЕ меняется. А RSI (без кавычек) - это переменная которая меняется в цикле local RSI=getNumCandles(chart[i])
 
Точно, я же говорю в упор не вижу чего то)) Сергей спасибо большое, буду исправлять.  
Страницы: 1
Читают тему
Наверх