Работа с экранной таблицей - нужна помощь

Страницы: 1
RSS
Работа с экранной таблицей - нужна помощь
 
Всем привет. Я в квике и в луа новичок, но твердо решил разобраться и написать несколько скриптов. Начать решил со скрипта, который из всех торгующихся бумаг выбирает наиболее ликвидные. На данный момент пока получилось только вытащить в экранную таблицу все бумаги и их текущий оборот (VALTODAY), скрипт ниже. Теперь мне необходимо отсортировать полученную таблицу программно по полю "Оборот" от наибольшего значения к наименьшему и выбрать оттуда первые 32 бумаги (т.е. наиболее ликвидные). Как реализовать эту сортировку - ума не приложу. Читал, что нужно сделать отдельную таблицу в виде массива и его уже сортировать через table.sort, но как опросить эту экранную таблицу тоже непонятно и в хелпе ничего такого не нашел... Помогите пожалуйста )).
Код
IsRun = true
class_code="QJSIM"
 
function main()

      t_id = AllocTable()  
     
   AddColumn(t_id, 1, "Бумага",       true, QTABLE_STRING_TYPE, 20)
   AddColumn(t_id, 2, "Оборот", true, QTABLE_DOUBLE_TYPE,   14)
   t = CreateWindow(t_id)
 
        
  local seclist = {}
  local valtod = {}
  local secstring = ""
  local iRowInOutTable = 1
  local list = {}
  local val = 0
  local sorttable = {}
  
 --list = getClassesList()
 --message(list)
  seclist = getClassSecurities(class_code)
   
  for SecCode in string.gmatch(seclist, "([^,]+)") do
  i=1
  InsertRow(t_id, i)
 valtod = getParamEx(class_code, SecCode, "VALTODAY").param_value
  seccode = SecCode
  val = tonumber(valtod)
  --message(tostring(val))
   SetCell(t_id, iRowInOutTable, 1, seccode)
   SetCell(t_id, iRowInOutTable, 2, tostring(math_round(val, 0) ) )
   i=i+1
 
  end
end

function math_round (num, idp)
   local mult = 10^(idp or 0)
   return math.floor(num * mult + 0.5) / mult  
end

end
 
А зачем вы вообще в экранную таблицу это все пихаете? Сразу в массив, сортировка, потом выбираете свои 32 бумаги и уже их на экран.

PS. Ежли кодите чудодейственную систему со смартлабика с ежедневными скринами, держите спойлер: фигня эта система. Попробуйте выяснить у аффтара, как у него мосэнерго в наиболее ликвидные попало.
 
Цитата
Anton написал:
А зачем вы вообще в экранную таблицу это все пихаете? Сразу в массив, сортировка, потом выбираете свои 32 бумаги и уже их на экран.

PS. Ежли кодите чудодейственную систему со смартлабика с ежедневными скринами, держите спойлер: фигня эта система. Попробуйте выяснить у аффтара, как у него мосэнерго в наиболее ликвидные попало.

Пробовал выяснить по какому критерию он ликвиды выбирает, молчит )). Экранная таблица - это так, для наглядности. В массив уже все запихал, теперь вот мучаюсь с сортировкой этого массива )).
 
Цитата
ZdenniZ написал:
по какому критерию он ликвиды выбирает
В этом вся и суть. Если отбирать "тупо по обороту", на дистанции выдавливается максимум 8% без проскальзываний, комиссий и налогов, плюс просадочки нерадостные, лучше в банк отнести и не париться. Справедливости ради, на некоторые другие мысли система может навести. Хотя если в квике ковырять, то можно леса за деревьями не увидеть.

А в чем там мучение, ключ - код бумаги, значение - оборот, сортируете в порядке уменьшения оборота, первые 32 - наиболее ликвидные.
 
Цитата
Anton написал:
Цитата
ZdenniZ написал:
по какому критерию он ликвиды выбирает
В этом вся и суть. Если отбирать "тупо по обороту", на дистанции выдавливается максимум 8% без проскальзываний, комиссий и налогов, плюс просадочки нерадостные, лучше в банк отнести и не париться.
Мне кажется проблема его системы в неиспользовании трейлинг стопа, он все время в убыток уходит, когда по стопу продает. Я хочу посмотреть что будет с трейлинг-стопом.

А насчет мучения, код сортировки нормально не могу написать, может подскажете? )
 
Цитата
ZdenniZ написал:
проблема его системы
в неявном предположении персистентности рядов ) тксть палю грааль )

Загуглите lua merge sort, все написано до нас.
 
Все получилось в версии скрипта ниже, оказалось проще, чем я думал. Едем дальше )). Единственное, с учебным квиком 8.2.1.13 какая-то ерунда, если оставить эту табличку на экране на некоторое время, квик начинает глючить и помогает только его полный перезапуск...
Код
IsRun = true
class_code="QJSIM"
 
function main()
   t_id = AllocTable()  
     
   AddColumn(t_id, 1, "Оборот",       true, QTABLE_STRING_TYPE, 20)
   AddColumn(t_id, 2, "Бумага", true, QTABLE_DOUBLE_TYPE,   14)
   t = CreateWindow(t_id)
         
  local seclist = {}
  local valtod = {}
  local secstring = ""
  local iRowInOutTable = 1
  local list = {}
  local val = 0
  local sorttable = {}
  local i=1  
  
 --list = getClassesList()
 --message(list)
  seclist = getClassSecurities(class_code)
 
 mt = {}

  for SecCode in string.gmatch(seclist, "([^,]+)") do

  --InsertRow(t_id, 1)
 
 valtod = getParamEx(class_code, SecCode, "VALTODAY").param_value
  seccode = SecCode
  val = tonumber(valtod)
   mt[i] = {}     -- create a new row
      mt[i][1] = val
      mt[i][2] = seccode
  i=i+1
   end

table.sort(mt, function(a,b) return a[1] > b[1] end) 
for i=1, 32, 1 do
InsertRow(t_id, 1)
SetCell(t_id, iRowInOutTable, 1,  tostring(math_round(mt[i][1])), 1)
SetCell(t_id, iRowInOutTable, 2, mt[i][2], 0)  
  end
   
message(mt[1][1])
end

function math_round (num, idp)
   local mult = 10^(idp or 0)
   return math.floor(num * mult + 0.5) / mult  
end
 
Цитата
ZdenniZ написал:
если оставить эту табличку на экране на некоторое время
Надо ж в мейне цикл сделать, пока IsRun не сбросится, и OnStop добавить с удалением таблицы и сбросом IsRun.
 
И еще здорово было бы вынести построение таблицы в отдельную функцию, чтобы все локальные переменные в этой функции (ненужные после построения таблицы) прибились после ее завершения и не лопали зря ресурсы.
 
Спасибо, все так и сделал, все работает )). Теперь вот задался вопросом, можно ли по клику на строку в этой экранной таблице открывать окно квика "покупка/продажа", передав в него необходимый тикер? Я понимаю, что есть функционал подачи заявок программно, и так впоследствии и сделаю, но пока хочу научиться работать с мышиными евентами. Нигде пока нужной информации не нашел...
 
Цитата
ZdenniZ написал:
открывать окно квика "покупка/продажа"
Официально из луа нельзя этого сделать. Через winapi можно схачить, сымитировав соответствующую команду меню, но хак он хак и есть, не факт, что в следующей версии квика что-то не поменяют и предъявлять за "перестало работать" будет некому. А вот это
Цитата
передав в него необходимый тикер
всхачить будет сложнее, результат не гарантирован и версионная неустойчивость больше. Это только из спортивного интереса можно попробовать, я б не стал морочиться.
 
Я тоже новичёк  ,но думаю этот отбор с помощью скрипта ненужен. Ликвидные бумаги они постоянно ликвидные ,и давно известны. Зачем 32 бумаги ,возмите просто 10  самых популярных бумаг . Притом думаю что те кто обращаются на форум имеют столько денег что у них даже сбербанк-п ликвидный ,потому что даже если все свои деньги разом вложить в сбербанк цена сбербанка с места даже несдвинется -:)))
 
Цитата
Николай Колесников написал:
думаю этот отбор с помощью скрипта ненужен
Для бэктеста обязателен. Когда-то были и другие лидеры, которых нынче либо вовсе нет, либо болтаются где-то на задворках. В те давние времена они бы к вам в портфель попали и завезли потом нехилых лосей, а если будете тестить только ныне здравствующих, вы этого не увидите и получите завышенные результаты. Думается, процентов эдак 100 публикуемых граалей таким вот образом и получены. Видел публикации, где аффтары считали корреляции на участке истории, на котором потом этот портфель и тестировали и потом хвалились, как они индекс обгоняют.

Цитата
даже если все свои деньги разом вложить в сбербанк цена сбербанка с места даже несдвинется
Она может даже на вас в моменте подвинуться, если в стакан смотреть и ставить лимитник, куда мейкер покажет. А можно и наоборот попасть, это даже попроще будет ) В целом же тут ликвидные не для ликвидности выбираются, система такая (типа).
Страницы: 1
Читают тему (гостей: 1)
Наверх