Есть скрипт, который берет данные из стакана котировок для дальнейшей работы. Если из стакана пропадают котировки (например, из-за сбоя сети), то функции возвращает Nil, скрипт отключается и его нужно включать вручную.
Можно добавить какой-нибудь код, чтобы этого отключения не было?
Заранее спасибо.
Пользователь
Сообщений: Регистрация: 23.01.2015
12.08.2020 12:24:43
Leonid, да, например добавить проверку на nil вида: если nil то ничего не делать
Leonid, Очевидно что не так пробовали как нужно. Выложите Ваш код.
Пользователь
Сообщений: Регистрация: 10.07.2020
13.08.2020 11:50:54
Sergey Gorokhov, такой вариант. При закрытии стакана или отключении инета, тут же останавливается
Код
local xxx=100
local stopped = false
function OnStop()
stopped = true
return 1000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"FXRL", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "table")
SetWindowPos(Table, 0, 10, 400, 90)
InsertRow(Table, -1)
while stopped == false do
if xxx>0 then
Quotes_1 = getQuoteLevel2("TQTF", "FXRL")
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
sleep(1000)
end
end
Пользователь
Сообщений: Регистрация: 23.01.2015
13.08.2020 12:07:49
Leonid, очевидно Вы не поняли рекомендации. Вы говорите
Цитата
Leonid написал: функции возвращает Nil, скрипт отключается
Вам было сказано
Цитата
Sergey Gorokhov написал: добавить проверку на nil вида:если nil то ничего не делать
Вы же просто указали непонятное условие if xxx>0 then где xxx всегда при любых вариантах равно 100 и никогюда не изменится рекомендуем еще раз более внимательно прочитать рекомендацию
Пользователь
Сообщений: Регистрация: 10.07.2020
13.08.2020 12:39:06
Sergey Gorokhov, так я следовал Вашей рекомендации: лучше так: if (xxx) then --тут чтото делаем end
if расценивает nil как false, а любое значение как true
Насколько я понял, в качестве ххх можно взять совершенно любую цифру. Как правильно тогда?
Пользователь
Сообщений: Регистрация: 23.01.2015
13.08.2020 13:12:02
Цитата
Leonid написал: Насколько я понял, в качестве ххх можно взять совершенно любую цифру.Как правильно тогда?
Вы говорите: "когда стакан возвращает nil код не работает" Вам говорят "добавьте проверку когда стакан возвращает nil то ничего не делать" ИЛИ (на ваш вкус) "добавьте проверку когда стакан возвращает НЕ nil то делать то что надо"
так понятно?
Или так:
xxx = стакан если xxx не nil то чтото делаем енд
Пользователь
Сообщений: Регистрация: 06.02.2017
13.08.2020 13:13:30
Код
while stopped == false do
Quotes_1 = getQuoteLevel2("TQTF", "FXRL");
if Quotes_1 then
----
end;
sleep(1000)
end
Пользователь
Сообщений: Регистрация: 10.07.2020
13.08.2020 14:19:15
Попробовал, оба варианта, но не помогает вопрос не в том, что скрипт не работает, а в том, что он выключается и надо заново его включать нажатием play...
Код
if Quotes_1 then
xxxx
end
if Quotes_1 ~= nil then
xxxxx
end
local stopped = false
function OnStop()
stopped = true
return 1000
end
function main()
local Table = AllocTable()
AddColumn(Table, 1,"FXRL", true, QTABLE_DOUBLE_TYPE, 18)
CreateWindow(Table)
SetWindowCaption(Table, "table")
SetWindowPos(Table, 0, 10, 400, 90)
InsertRow(Table, -1)
while stopped == false do
Quotes_1 = getQuoteLevel2("TQTF", "FXRL")
if Quotes_1 then
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
sleep(1000)
end
end
Пользователь
Сообщений: Регистрация: 21.08.2015
13.08.2020 16:52:45
Код
if Quotes_1 then
offer_1= tonumber(Quotes_1.offer_count)
fxrl_pr = tonumber(Quotes_1.offer[1].price)
SetCell(Table, 1, 1, tostring(fxrl_pr))
end
Смотрим внутрь вашего условного блока. Что сама по себе таблица получена (не nil), вы проверили в условии. Далее получаете offer_count, это ок, там какое-то число, в том числе и 0 может быть. Далее без проверки пытаетесь получить offer[1].price. Так-так, а если в offer_count был 0, сколько элементов в массиве offer? Нисколько, надо полагать? А что же будет тогда в offer[1]? Не nil ли? А что будет, если из этого нила попытаться вытащить поле price?
Пользователь
Сообщений: Регистрация: 10.07.2020
13.08.2020 17:05:41
Anton, я недавно начал кодить на lua, поэтому что где может быть во всех деталях не знаю. Поэтому и спрашиваю тут.
Пользователь
Сообщений: Регистрация: 21.08.2015
13.08.2020 18:39:45
Цитата
Leonid написал: что где может быть во всех деталях не знаю
Так вот и написал, что где может (не) быть. Дело не в луа, а вообще в подходе, на каждом выборе надо в голове составить "полную группу" всех возможных вариантов и особенно крайние случаи рассмотреть. Вариант получить nil из getQuoteLevel2 вы предусмотрели, а вариант получить пустой массив - нет.