Всем привет. Я в квике и в луа новичок, но твердо решил разобраться и написать несколько скриптов. Начать решил со скрипта, который из всех торгующихся бумаг выбирает наиболее ликвидные. На данный момент пока получилось только вытащить в экранную таблицу все бумаги и их текущий оборот (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 - наиболее ликвидные.
ZdenniZ написал: по какому критерию он ликвиды выбирает
В этом вся и суть. Если отбирать "тупо по обороту", на дистанции выдавливается максимум 8% без проскальзываний, комиссий и налогов, плюс просадочки нерадостные, лучше в банк отнести и не париться.
Мне кажется проблема его системы в неиспользовании трейлинг стопа, он все время в убыток уходит, когда по стопу продает. Я хочу посмотреть что будет с трейлинг-стопом.
А насчет мучения, код сортировки нормально не могу написать, может подскажете? )
Все получилось в версии скрипта ниже, оказалось проще, чем я думал. Едем дальше )). Единственное, с учебным квиком 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
И еще здорово было бы вынести построение таблицы в отдельную функцию, чтобы все локальные переменные в этой функции (ненужные после построения таблицы) прибились после ее завершения и не лопали зря ресурсы.
Спасибо, все так и сделал, все работает )). Теперь вот задался вопросом, можно ли по клику на строку в этой экранной таблице открывать окно квика "покупка/продажа", передав в него необходимый тикер? Я понимаю, что есть функционал подачи заявок программно, и так впоследствии и сделаю, но пока хочу научиться работать с мышиными евентами. Нигде пока нужной информации не нашел...
Официально из луа нельзя этого сделать. Через winapi можно схачить, сымитировав соответствующую команду меню, но хак он хак и есть, не факт, что в следующей версии квика что-то не поменяют и предъявлять за "перестало работать" будет некому. А вот это
Цитата
передав в него необходимый тикер
всхачить будет сложнее, результат не гарантирован и версионная неустойчивость больше. Это только из спортивного интереса можно попробовать, я б не стал морочиться.
Я тоже новичёк ,но думаю этот отбор с помощью скрипта ненужен. Ликвидные бумаги они постоянно ликвидные ,и давно известны. Зачем 32 бумаги ,возмите просто 10 самых популярных бумаг . Притом думаю что те кто обращаются на форум имеют столько денег что у них даже сбербанк-п ликвидный ,потому что даже если все свои деньги разом вложить в сбербанк цена сбербанка с места даже несдвинется -:)))
Для бэктеста обязателен. Когда-то были и другие лидеры, которых нынче либо вовсе нет, либо болтаются где-то на задворках. В те давние времена они бы к вам в портфель попали и завезли потом нехилых лосей, а если будете тестить только ныне здравствующих, вы этого не увидите и получите завышенные результаты. Думается, процентов эдак 100 публикуемых граалей таким вот образом и получены. Видел публикации, где аффтары считали корреляции на участке истории, на котором потом этот портфель и тестировали и потом хвалились, как они индекс обгоняют.
Цитата
даже если все свои деньги разом вложить в сбербанк цена сбербанка с места даже несдвинется
Она может даже на вас в моменте подвинуться, если в стакан смотреть и ставить лимитник, куда мейкер покажет. А можно и наоборот попасть, это даже попроще будет ) В целом же тут ликвидные не для ликвидности выбираются, система такая (типа).