

-- ©2020 by Evgeny Shibaev
-- Таблица, отображающая в процентах рост(падение) инструмента финансового рынка за определенное количество дней
-- Какие инструменты(тикеры) отслеживаем. Таблица пар тикер - площадка
tickers = {SiU0 = "SPBFUT", RIU0 = "SPBFUT", BRN0 = "SPBFUT", GZU0 = "SPBFUT", SRU0 = "SPBFUT", GAZP = "TQBR", SBER = "TQBR", YNDX = "TQBR",
GMKN = "TQBR", MGNT = "TQBR", SU26207RMFS9 = "TQOB"}
-- За ппоследние n-дней
days_before = {1, 2, 3, 5, 10, 30, 44, 67, 90} -- эквивалентно "вчера", "позавчера", 3-дня назад, 7 и 30 торговых сессий назад.
sources = {} -- Список источников данных по количеству тикеров
rows = {} -- Список строк в таблице по количеству тикеров
screener = AllocTable() -- Указатель на саму таблицу
stopped = false -- Остановка скрипта
-- Функция вызывается перед вызовом main
function OnInit(path)
-- "Ticker"- название первого столбца в таблице
AddColumn(screener, 0, "Ticker", true, QTABLE_STRING_TYPE, 15)
-- Названия остальных столбцов в таблице по количеству days_before
for column, days in ipairs(days_before) do
AddColumn(screener, days, days.." day(s)", true, QTABLE_STRING_TYPE, 11)
end
CreateWindow(screener)
-- Даем название таблице
SetWindowCaption(screener, "Percent change for last days")
for ticker, board in pairs(tickers) do
--Для каждого тикера создаем источник данных - "дневки"
sources[ticker] = CreateDataSource(board, ticker, INTERVAL_D1)
--Устанавливаем коллбэк функцию для каждого тикера. Она вызывается при изменении цены тикера. "А что, так можно было?"
sources[ticker]:SetUpdateCallback(function(index) InvalidateCallback(index, ticker) end)
--Для каждого тикера определяем строку в таблице и запоминаем ее в rows
rows[ticker] = InsertRow(screener, -1)
--В первом столбце каждой строки будет имя тикера
SetCell(screener, rows[ticker], 0, ticker)
end
end
-- Коллбэк функция вызывается при изменении значения текущей цены тикера. Обновляет строку тикера в таблице сразу, как происходит изменение.
function InvalidateCallback(index, ticker)
for column, days in ipairs(days_before) do
-- Определяем процентр изменения цены тикера за days-дней
percent = Change(ticker, days)
-- Выводим в соответствующую ячейку таблицы процентр изменения
SetCell(screener, rows[ticker], days, string.format("%.2f", percent).."%")
-- Подкрашиваем ячейку соответственно росту(падению) и величины роста(падения)
SetColor(screener, rows[ticker], days, BCellColor(percent), FCellColor(percent), BCellColor(percent), FCellColor(percent))
end
end
--Функция определяет на сколько процентов выросла или упала бумага относительно N-дней назад
function Change(ticker, days_before)
len = sources[ticker]:Size() --Сколько всего "дневных" свечей в источнике данных конкретного тикера
--Возвращаем рост(падение) в процентах текущей цены от цены закрытия days_before-торговых сессий назад
return (sources[ticker]:C(len) - sources[ticker]:C(len - days_before)) / sources[ticker]:C(len - days_before) * 100
end
-- Цвет текста в ячейке. Если рост - то цвет "зеленый", падение - "красный"
function FCellColor(change) if change > 0 then return RGB(0,128,0) else return RGB(158,0,0) end end
-- Маленькая "тепловая карта". Делает фон ячейки более интенсивным, взависимости от величины роста(падения)
function BCellColor(change)
bright = math.floor(255 - math.min(math.abs(change*10), 110),1)
if change > 0 then return RGB(bright,255,bright) else return RGB(255,bright,bright) end
end
-- Функция вызывается перед остановкой скрипта
function OnStop(signal) stopped = true end
-- Функция вызывается перед закрытием квика
function OnClose() stopped = true end;
-- Основная функция выполнения скрипта
function main()
while not stopped do sleep(1) end
end
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
Ииии Евгений врывается в топ самых полезных авторов Смарт-лаба))
Скринер штука полезная для некоторых стилей торговли.