Вывод данных из индикатора

Страницы: 1
RSS
Вывод данных из индикатора
 
Имеется индикатор, в первую минуту торгов выдает данные (тикер и число) по какому либо инструменту при выполнении условия, данные выдаются в сообщении при этом если выполнилось условие сразу по нескольким инструментам, то выдается несколько сообщений подряд за пару секунд при большой волатильности, и приходится пролистывать их обратно чтобы увидеть предыдущие, есть ли вариант выводить эту информацию ввиде таблицы или хотя бы списка который бы просто пополнялся инструментами у которых выполнено условие, чтобы все данные были перед глазами? Ниже основная часть кода.

while EnterInPos == "No" do

for i=1, #SecCode and #T do

ds=CreateDataSource ("SPBFUT", SecCode[i], INTERVAL_M1)

if i==1 then


if XXX then

message(YYY)

end
end

if i==2 then
.
.
.  
 
Смотрите в документации функции для работы с таблицами рабочего места quik.
 
Цитата
Anton написал:
Смотрите в документации функции для работы с таблицами рабочего места quik.
Посмотрел, спасибо, но возникло несколько вопросов,
JL=0

function main()

CreateTable()
...
if i==1 then


if X>100 then

JL=1 --------------------(ввел переменную как индикатор что условие выполнено)

end
end
end


function CreateTable()
 
  t_id = AllocTable()  
 
  AddColumn(t_id, 0, "SHORT/LONG", true, QTABLE_STRING_TYPE,15)
  AddColumn(t_id, 1, "TIKER", true, QTABLE_STRING_TYPE, 15)
  AddColumn(t_id, 2, "POINTS", true, QTABLE_DOUBLE_TYPE, 15)
   
  t = CreateWindow(t_id)
   
  SetWindowCaption(t_id, "TABLE")
 
  InsertRow(t_id, -1)

  if JL==1 then  ---------------------------( в итоге не видит то что переменная стала равна 1 почему то)
 
   InsertRow(t_id,1)
  SetCell(t_id, 1, 1, Х)  ----------------(тут еще загвоздка как установить в ячейку значение Х из верхней части кода)
  end
  end
 
Цитата
Nikita написал:
( в итоге не видит то что переменная стала равна 1 почему то)
Потому что CreateTable закончилась до того, как присвоили 1 условию, т.е. переменная и не стала равна 1, поэтому и видеть нечего.

Цитата
Nikita написал:
(тут еще загвоздка как установить в ячейку значение Х из верхней части кода)
Вытащите это из CreateTable, создайте пустую таблицу в этой функции и все. Дальше вставьте код из первого варианта, только вместо message используйте InsertRow/SetCell в свою таблицу. Когда таблица будет готова, сделайте вечный цикл до нажатия "остановить" или закрытия квика. Перед выходом из main прибейте свое окно.
 
Цитата
Anton написал:
Цитата
Nikita написал:
( в итоге не видит то что переменная стала равна 1 почему то)
Потому что CreateTable закончилась до того, как присвоили 1 условию, т.е. переменная и не стала равна 1, поэтому и видеть нечего.

Цитата
Nikita написал:
(тут еще загвоздка как установить в ячейку значение Х из верхней части кода)
Вытащите это из CreateTable, создайте пустую таблицу в этой функции и все. Дальше вставьте код из первого варианта, только вместо message используйте InsertRow/SetCell в свою таблицу. Когда таблица будет готова, сделайте вечный цикл до нажатия "остановить" или закрытия квика. Перед выходом из main прибейте свое окно.
Спасибо) Все подкрутил) но вот то что хотел сделать с таблицей похоже нельзя( фильтр в ней есть, а вот сортировки от меньшего к большему значению нет, или я чего-то не вижу?  
 
Цитата
Nikita написал:
а вот сортировки от меньшего к большему значению нет, или я чего-то не вижу?  
Да вроде как ее и нет. Но можно разложить строки из скрипта в любом желаемом порядке.
 
Цитата
Anton написал:
Цитата
Nikita написал:
а вот сортировки от меньшего к большему значению нет, или я чего-то не вижу?  
Да вроде как ее и нет. Но можно разложить строки из скрипта в любом желаемом порядке
Вот вроде бы в руководстве по QLUA пишут
"Если параметр «value» не задан для ячеек всех остальных типов, то по
столбцам, содержащим такие ячейки, не будет корректно работать сортировка,
фильтрация и условное форматирование (см. Приложение
2)."  вроде бы упоминается сортировка...
 
Цитата
Nikita написал:
вроде бы упоминается сортировка
Я тут не в курсе, к сожалению. Тут есть люди, кто активно с таблицами работает, если увидят тему, что-то полезное ответят по сортировке.
 
Цитата
Anton написал:
Цитата
Nikita написал:
вроде бы упоминается сортировка
Я тут не в курсе, к сожалению. Тут есть люди, кто активно с таблицами работает, если увидят те му, что-то полезное ответят по сортировке.
Спасибо за советы, самое сложное сделано, осталось понять как сделать сортировку)
 
Нашел как сортируется полученная таблица(кликать по заголовку столбца с зажатым 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 до количества инструментов. Не знаю что сделать чтобы правильно сортировался последний столбец  
 
Не понял, что в примере кода происходит. Я б поменял общий подход, если сортировка нужна: сначала накидать строки в луа-таблицу (по индексу), потом ее отсортировать по последнему столбцу, а потом одним движением перенести в полученном порядке в окно.
 
Цитата
Anton написал:
if X>100 then
function CreateTable()
 
  t_id = AllocTable()  
 
  AddColumn(t_id, 0, "SHORT/LONG", true, QTABLE_STRING_TYPE,15)
  AddColumn(t_id, 1, "TIKER", true, QTABLE_STRING_TYPE, 15)
  AddColumn(t_id, 2, "POINTS", true, QTABLE_DOUBLE_TYPE, 15)
 
 
  t = CreateWindow(t_id)
   
  SetWindowCaption(t_id, "TABLE")
 
  InsertRow(t_id, -1)

end


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

function CreateTable()
 
  t_id = AllocTable()  
 
  AddColumn(t_id, 0, "SHORT/LONG", true, QTABLE_STRING_TYPE,15)
  AddColumn(t_id, 1, "TIKER", true, QTABLE_STRING_TYPE, 15)
  AddColumn(t_id, 2, "POINTS", true, QTABLE_DOUBLE_TYPE, 15)
 
  t = CreateWindow(t_id)
   
  SetWindowCaption(t_id, "TABLE")
 
  InsertRow(t_id, -1)

end
 
Забыл добавить что ошибка (bad argument #1 to 'insert' (table expected, got nil)) отсылает к строчке с этим кодом:
table.sort(tbl, function(lhs, rhs) return (lhs.x < rhs.x) end)
 
Цитата
Nikita написал:
Только один раз
Так и рассчитывалось, что один раз заполните и все. Если хотите в реалтайме таблицу обновлять, не надо tbl прибивать. Да и все несколько посложней может быть в этом случае. Это просто пример, в какую сторону думать.
Страницы: 1
Читают тему
Наверх