Имеется индикатор, в первую минуту торгов выдает данные (тикер и число) по какому либо инструменту при выполнении условия, данные выдаются в сообщении при этом если выполнилось условие сразу по нескольким инструментам, то выдается несколько сообщений подряд за пару секунд при большой волатильности, и приходится пролистывать их обратно чтобы увидеть предыдущие, есть ли вариант выводить эту информацию ввиде таблицы или хотя бы списка который бы просто пополнялся инструментами у которых выполнено условие, чтобы все данные были перед глазами? Ниже основная часть кода.
Nikita написал: ( в итоге не видит то что переменная стала равна 1 почему то)
Потому что CreateTable закончилась до того, как присвоили 1 условию, т.е. переменная и не стала равна 1, поэтому и видеть нечего.
Цитата
Nikita написал: (тут еще загвоздка как установить в ячейку значение Х из верхней части кода)
Вытащите это из CreateTable, создайте пустую таблицу в этой функции и все. Дальше вставьте код из первого варианта, только вместо message используйте InsertRow/SetCell в свою таблицу. Когда таблица будет готова, сделайте вечный цикл до нажатия "остановить" или закрытия квика. Перед выходом из main прибейте свое окно.
Nikita написал: ( в итоге не видит то что переменная стала равна 1 почему то)
Потому что CreateTable закончилась до того, как присвоили 1 условию, т.е. переменная и не стала равна 1, поэтому и видеть нечего.
Цитата
Nikita написал: (тут еще загвоздка как установить в ячейку значение Х из верхней части кода)
Вытащите это из CreateTable, создайте пустую таблицу в этой функции и все. Дальше вставьте код из первого варианта, только вместо message используйте InsertRow/SetCell в свою таблицу. Когда таблица будет готова, сделайте вечный цикл до нажатия "остановить" или закрытия квика. Перед выходом из main прибейте свое окно.
Спасибо) Все подкрутил) но вот то что хотел сделать с таблицей похоже нельзя( фильтр в ней есть, а вот сортировки от меньшего к большему значению нет, или я чего-то не вижу?
Nikita написал: а вот сортировки от меньшего к большему значению нет, или я чего-то не вижу?
Да вроде как ее и нет. Но можно разложить строки из скрипта в любом желаемом порядке
Вот вроде бы в руководстве по QLUA пишут "Если параметр «value» не задан для ячеек всех остальных типов, то по столбцам, содержащим такие ячейки, не будет корректно работать сортировка, фильтрация и условное форматирование (см. Приложение 2)." вроде бы упоминается сортировка...
Нашел как сортируется полученная таблица(кликать по заголовку столбца с зажатым CTRL или SHIFT) , но почему-то сортировка происходит некорректно(( if X>100 then InsertRow(t_id, i) SetCell(t_id, i, 0,"SHORT") SetCell(t_id, i, 1,tostring(NAME)) SetCell(t_id, i, 2,tostring(X)) Вроде бы все правильно, i = от 1 до количества инструментов. Не знаю что сделать чтобы правильно сортировался последний столбец
Не понял, что в примере кода происходит. Я б поменял общий подход, если сортировка нужна: сначала накидать строки в луа-таблицу (по индексу), потом ее отсортировать по последнему столбцу, а потом одним движением перенести в полученном порядке в окно.
function main() SecCode= {....} local Run = "Yes" while Run == "Yes" do
for i=1, #SecCode do
if i==1 then
if X>100 then InsertRow(t_id, i) SetCell(t_id, i, 0,"SHORT") SetCell(t_id, i, 1,tostring(NAME)) SetCell(t_id, i, 2,tostring(X)) end if Y>100 InsertRow(t_id, i) SetCell(t_id, i, 0,"LONG") SetCell(t_id, i, 1,tostring(NAME)) SetCell(t_id, i, 2,tostring(X)) end end
if i==2 then .. .. end В общем получается вот так, что строчка добавляется в таблицу только когда выполняется условие, что куда переставить чтоб не сломать что уже работает я не понял если честно) не работает тут только сортировка корректно..
Нда. Там так дальше и идет, каждый i имеет свой отдельный блок? А зачем тогда цикл по SecCode, спрашивается. Ну как-то так я имел в виду, работоспособность не гарантирую, чисто пример
Код
function main()
SecCode = { ... }
-- временная табличка вместо экранной
local tbl = {}
-- то же самое, что у вас в цикле, только заполняем не экранную таблицу, а временную
for i,s in pairs(SecCode) do
-- здесь у вас s - код бумаги, i - индекс в SecCode
-- я намеренно опустил if i==1 then, ибо это жесть
if X>100 then
-- создаем новую "строку" и добавляем во временную табличку
local r = {}
r.direction = "SHORT"
r.name = NAME
r.x = X
table.insert(tbl, r)
end
if Y>100 then
-- создаем новую "строку" и добавляем во временную табличку
local r = {}
r.direction = "LONG"
r.name = NAME
r.x = X
table.insert(tbl, r)
end
end
-- тут цикл по SecCode закончился и в tbl лежат строки в каком-то там порядке, теперь мы их сортируем по столбцу x
table.sort(tbl, function(lhs, rhs) return (lhs.x < rhs.x) end)
-- и вставляем строки из временной таблицы в видимую
for i,r in pairs(tbl) do
local idx = InsertRow(t_id, -1)
SetCell(t_id, idx, 0, tostring(r.direction))
SetCell(t_id, idx, 1, tostring(r.name))
SetCell(t_id, idx, 2, tostring(r.x))
end
-- tbl больше не нужна, прибьем ее, чтобы не лопала память
tbl = nil
-- дальше что там было дальше
end
Anton написал: Нда. Там так дальше и идет, каждый i имеет свой отдельный блок? А зачем тогда цикл по SecCode, спрашивается. Ну как-то так я имел в виду, работоспособность не гарантирую, чисто пример
Все сортирует замечательно) Только один раз, за несколько секунд заполняет несколько строк в таблице, и индикатор выключается и выдает вот такую ошибку
indicat.lua:65: bad argument #1 to 'insert' (table expected, got nil)
function main() CreateTable() SecCode= {...} local tbl = {} ------------похоже я тут что то не дописал?
ValueImp=10 local Run= "YES" while Run== "YES" do
for i,s in pairs(SecCode) do . . . end
table.sort(tbl, function(lhs, rhs) return (lhs.x < rhs.x) end) for i,r in pairs(tbl) do local idx = InsertRow(t_id, -1) SetCell(t_id, idx, 0, tostring(r.direction)) SetCell(t_id, idx, 1, tostring(r.name)) SetCell(t_id, idx, 2, tostring(r.x)) end tbl = nil end end
Так и рассчитывалось, что один раз заполните и все. Если хотите в реалтайме таблицу обновлять, не надо tbl прибивать. Да и все несколько посложней может быть в этом случае. Это просто пример, в какую сторону думать.