Блог им. morefinances
Пока не ушли далеко от темы получения данных из таблицы текущих торгов решил сделать в качестве примера еще и простой скринер акций. Это вполне доступно по тем материалам, которые мы уже прошли. Будем отслеживать динамику изменения цены относительно цены закрытия предыдущего дня.
Нам понадобятся:
1. Таблица для вывода данных (строить уже умеем).
2. Получение данных из таблицы текущих торгов через getParamEx (проходили там же).
3. Тикеры бумаг. Можно взять конкретный список бумаг и работать с ним, но приятнее и правильнее, чтобы скрипт мог автоматом выгружать все торгуемые тикеры из терминала и далее уже отслеживать их динамику. Попробуем это реализовать.
Через sec_list = getClassSecurities(«TQBR») можно получить строку с тикерами акций на Московской бирже, которые будут разделены запятыми. Чтобы пройтись по всем элементам и записать их в массив используем цикл:
for TIKER in string.gmatch(sec_list, "[^,]+") do tikers[#tikers + 1]=TIKER end
Отслеживать будем параметр LASTCHANGE – процент изменения цены от цены закрытия:
local delta = getParamEx(«TQBR», tikers[i], «LASTCHANGE»)
В настоящий момент на фондовой секции Мосбиржи торгуются 248 бумаги (некоторые показываются только индикативно, реальных торгов по ним не ведутся). Создадим таблицу 25 х 10 в которой будем отражать тикер и полученный с таблицы торгов данные, если бумага торгуется в плюсе закрасим её зеленым, если в минусе красным цветом, если без изменений, то без цвета.
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_0.lua
Вроде бы всё работает, но не очень удобно искать по тикеру конкретную бумагу: логичнее расположить вывод из массива не горизонтально, а вертикально, переделаем.
Здесь также можно улучшить алгоритм: после получения значений в первой итерации сложим их по тикерам в массив DELTA и если в следующем цикле цифра не будет отличаться, то мы и не будем обновлять её в таблице, что существенно сэкономит нам время на обновление данных. По этой же причине локальная переменная delta теперь стала глобальной, т.к. используется далее вне цикла for.
Результат:
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_1_vertical.lua
Уже лучшее, всё работает более быстро, чем в первой версии, но напрашиваются отдельные столбцы для чисел, чтобы они выглядели более форматно, а не плясали по строке то в одну, то в другую сторону.
Дополним скрипт, получим:
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_2_columns.lua
И последнее: исключим те тикеры, торговля по которым сейчас не проходит, чтобы данные были максимально по рынку, а не «для коллекции». Для этого добавим функцию, которая будет исключать тикеры, по которым сейчас не проходят торги:
function exc_tik(stock) t = { "ACKO", "GAZC", "GAZS", "GAZT", "MGNZ" } for i, v in ipairs(t) do if v == stock then return 1 end end return 0 end
И отфильтруем с помощью этой функции массив тикеров, полученных с биржи.
Из нулевых по объему оставил только POLY, надеюсь, что они оперативно вернуться на торги. Остальные белым выделены бумаги, которые в моменте торгуются по цене закрытия вчерашнего дня.
Результат:
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_3.lua
Скрипт можно еще улучшать (будем возвращаться к этому позже), но главное – даже с таким минимальным багажом знаний по qlua можно делать уже вполне себе полезные вещи.
Для удобства изучения решил не перегружать текст кодом, который минимально отличается от версии к версии, а просто приложить соответствующий файл к каждой таблице. Последний вариант (файл v.1.3.) включает все озвученные изменения.
Желающие смогут залезть в код каждой версии и посмотреть изменения, либо потестировать/улучшить итоговый вариант.
Скринер легко модифицируется под любой другой расчет с данных таблицы текущих торгов. Попробуйте, например, сделать вариант с % дневной волатильности по каждой бумаге.
Теги: qlua для начинающих, кружок авиамоделизма.
есть такой старый индикатор, показывал нефть в рублях.
Формула ещё со времён квика до 8 версии. И как я понял, стали использовать в более поздних квиках другую версию LUA, и этот индикатор перестал работать. Квик его даже не видит в папке LUAINDICATORS, текстовый файл с расширением .lua
Settings =
{
Name = «BR_RUB»,
tag = «USDRUB»,
tag1 = «BR»,
line=
{
{Name = «brent_rub», Color = RGB(0, 0, 255), Type = 1,Width = 1}
}
}
function Init()
return 1
end
function OnCalculate(index)
local Out = (getCandlesByIndex(Settings.tag1, 0, index-1, 1)[0].close or 0) / (getCandlesByIndex(Settings.tag, 0, index-1, 1)[0].close or 0)
if Out > 0 then
return Out
else
return nil
end
end
можно её использовать каким то образом в последней версии Квика?
На график (любой) можно выводить метки. Т.е. если вас устроит, то на конкретный график (например индекса), можно через скрипт выводить тикеры, которые под конкретные условия попадают, и убирать их если условия уже не соблюдаются по ним. Это штатными средствами возможно. Но не отрисовка графика в зависимости от условий. Можно пробовать сделать индикатор с разными условиями, но чем больше мудрить в прорисовке тем грустнее это будет выполняться в квике. Лично я стараюсь графическую информацию не выводить в терминале: и квик более устойчиво работает, и, например, различные библиотеки python сделают вывод красиво и с нормальными гибкими настройками цветов/меток/дат и пр. самих графиков.
Но айсберг потому и айсберг, что «подводную» часть заявки не видно. А крупные заявки порой оперативно двигаются (так же роботами), не всегда показатель крупного игрока.
Хотелось бы добавить универсальный блок для дополнительного расчета полученных данных из таблицы значений, а то иногда мало того стандарта и нужно что-то посчитать, что-то типа этого :
bid = getParamEx(«TQBR», tikers[i], «BID»)
delta = getParamEx(«TQBR», tikers[i], «LASTCHANGE»)offer = getParamEx(«TQBR», tikers[i], «OFFER»)
spread = (offer — bid) / bid * 100
и выводить в таблицу spread каждого тикера вместо delta, у меня в этом месте затык, чую что всего пара строк кода нужна))
delta = (offer — bid) / bid * 100
Предварительно определив bid и offer.
И всё должно заработать.
Ну и исключить получению 0 в bid.
Т.е. примерно так я бы сделал:
bid = getParamEx(«TQBR», tikers[i], «BID»)
offer = getParamEx(«TQBR», tikers[i], «OFFER»)
if bid ~=0 then
delta = (offer — bid) / bid * 100
else
delta = 0
end
Если со спрэдом далее никаких расчетов проводить не планируете, то можно так:
if bid ~=0 then
delta = (offer — bid) / bid * 100
else
delta = " "
end
В этом случае, если данные по биду не получены (например скрипт запущен до торгов), в таблице не будет ноль, а простой пропуск значения.
lua:119: attempt to perform arithmetic on a table value (global 'offer')
Да, что-то я поторопился.
Чтобы работать с числом нужно добавить tonumber и указать параметр param_value полученной таблицы :
bid = tonumber(getParamEx(«TQBR», tikers[i], «BID»).param_value)
offer = tonumber(getParamEx(«TQBR», tikers[i], «OFFER»).param_value)
Но думаю логику скрипта нужно будет еще подправить, чтобы всё заработало.
UPDATE
на просторах нашел часть кода, пишут что рабочий, но проверить не могу.
Файл: github.com/morefinances/qlua/blob/main/stockscreener_spred.lua
Не знаю, правда, чем полезны сами спреды в таком широком списке, но в качестве учебного примера почему бы и нет.
2. Самый простой вариант: это в терминале через поиск. Добавляете на панель «Поиск инструмента», вбиваете тикер, нажимаете enter.
Выбираете из таблицы с результатами то, что вам нужно.
smart-lab.ru/blog/938450.php