Всем привет!
В продолжение топика
«QLua скринер в 10 строк кода. Или „за базар отвечаю“, можно качать
обнулённый обновлённый скринер.
Выглядит так в статике:
А так
в динамике.
Если в прошлом скринере отображалось изменение текущей цены от цен закрытия за соответствующее количество торговых сессий (список „срезов“ задается пользователем), то в этом будет две таблицы. Первая таблица — изменение текущей цены от предыдущих хаев (чуть не оговорился...) за N-торговых сессий, вторая — от предыдущих лоёв.
В первой таблице от минимумов выделена строка с длинными ОФЗ. Видно, что минимум цены за 30 торговых сессий был на прошлой сессии.
А во второй таблице, мы видим, что Яндекс и Магнит обновили сегодня свои максимумы за последние 90 торговых сессий.
Таким образом, техзадание (ТЗ) участника тусовки Weddy практически выполнено, остается доделать, как он просил, тот же функционал, только относительно списка заданных дат.
Скрипт во время работы не кушает электричества вообще, только при загрузке немного нужно подождать если много тикеров. Код QLua:
-- ©2020 by Evgeny Shibaev
-- Таблица, отображающая в процентах рост(падение) инструмента финансового рынка за определенное количество дней
-- Какие инструменты(тикеры) отслеживаем. Таблица пар тикер - площадка
tickers = {SiU0 = "SPBFUT", RIU0 = "SPBFUT", BRQ0 = "SPBFUT", GZU0 = "SPBFUT", SRU0 = "SPBFUT", GAZP = "TQBR", SBER = "TQBR", YNDX = "TQBR",
GMKN = "TQBR", MGNT = "TQBR", SU26207RMFS9 = "TQOB"} --IMOEX = "SNDX"
-- За ппоследние n-дней
days_before = {0, 1, 2, 3, 5, 10, 30, 44, 67, 90} -- эквивалентно "вчера", "позавчера", 3-дня назад, 7 и 30 торговых сессий назад.
sources = {} -- Список источников данных по количеству тикеров
rows = {} -- Список строк в таблице по количеству тикеров
screener = AllocTable() -- Указатель на таблицу FromLow
rowsH = {} -- Список строк в таблице по количеству тикеров
screenerH = AllocTable() -- Указатель на таблицу FromHigh
stopped = false -- Остановка скрипта
col_shift = 1
local max = math.max -- локальная ссылка на math.max
local min = math.min -- локальная ссылка на math.min
-- Функция вызывается перед вызовом main
function OnInit(path)
-- "Ticker"- название первого столбца в таблице
AddColumn(screener, 0, "Ticker", true, QTABLE_STRING_TYPE, 15)
AddColumn(screener, 1, "Price", true, QTABLE_DOUBLE_TYPE, 12)
-- Названия остальных столбцов в таблице по количеству days_before
for column, days in ipairs(days_before) do
if days == 0 then header = "Today" else header = days.." days" end
AddColumn(screener, column + col_shift, header, true, QTABLE_DOUBLE_TYPE, 8)
end
CreateWindow(screener)
-- Даем название таблице
SetWindowCaption(screener, "Percent change from LOW for last days")
-- Вторая таблица - от максимумов за период.
AddColumn(screenerH, 0, "Ticker", true, QTABLE_STRING_TYPE, 15)
AddColumn(screenerH, 1, "Price", true, QTABLE_DOUBLE_TYPE, 12)
-- Названия остальных столбцов в таблице по количеству days_before
for column, days in ipairs(days_before) do
if days == 0 then header = "Today" else header = days.." days" end
AddColumn(screenerH, column + col_shift, header, true, QTABLE_DOUBLE_TYPE, 8)
end
CreateWindow(screenerH)
SetWindowCaption(screenerH, "Percent change from HIGH 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)
rowsH[ticker] = InsertRow(screenerH, -1)
--В первом столбце каждой строки будет имя тикера
SetCell(screener, rows[ticker], 0, ticker)
SetCell(screenerH, rowsH[ticker], 0, ticker)
end
end
-- Коллбэк функция вызывается при изменении значения текущей цены тикера. Обновляет строку тикера в таблице сразу, как происходит изменение.
function InvalidateCallback(index, ticker)
price = sources[ticker]:C(sources[ticker]:Size())
ap = getSecurityInfo(tickers[ticker], ticker).scale
if ap == 0 then price = math.floor(price) end
SetCell(screener, rows[ticker], 1, tostring(price))
SetCell(screenerH, rows[ticker], 1, tostring(price))
for column, days in ipairs(days_before) do
-- Определяем процентр изменения цены тикера за days-дней от минимальных значений за этот период
percent = FromLow(ticker, days)
-- Определяем процентр изменения цены тикера за days-дней от максимальных значений за этот период
percentH = FromHigh(ticker, days)
SetCell(screener, rows[ticker], column + col_shift, string.format("%.2f", percent))
SetCell(screenerH, rowsH[ticker], column + col_shift, string.format("%.2f", percentH))
-- Подкрашиваем ячейку соответственно росту(падению) и величины роста(падения)
SetColor(screener, rows[ticker], column + col_shift, BCellColor(percent), FCellColor(percent), BCellColor(percent), FCellColor(percent))
SetColor(screenerH, rowsH[ticker], column + col_shift, BCellColor(percentH), FCellColor(percentH), BCellColor(percentH), FCellColor(percentH))
end
end
--Функция определяет на сколько процентов выросла или упала бумага относительно N-дней назад
function Change(ticker, days_before)
local len = sources[ticker]:Size() --Сколько всего "дневных" свечей в источнике данных конкретного тикера
local maxval = DaysHigh(ticker, days_before)
--Возвращаем рост(падение) в процентах текущей цены от цены закрытия days_before-торговых сессий назад
return (sources[ticker]:C(len) - maxval) / maxval * 100
end
function FromHigh(ticker, days_before)
local len = sources[ticker]:Size() --Сколько всего "дневных" свечей в источнике данных конкретного тикера
local maxval = DaysHigh(ticker, days_before)
--Возвращаем падение в процентах текущей цены от максимальной цены за days_before-торговых сессий назад (включая текущую)
return (sources[ticker]:C(len) - maxval) / maxval * 100
end
function FromLow(ticker, days_before)
local len = sources[ticker]:Size() --Сколько всего "дневных" свечей в источнике данных конкретного тикера
local minval = DaysLow(ticker, days_before)
--Возвращаем рост в процентах текущей цены от минимальной цены за days_before-торговых сессий назад (включая текущую)
return (sources[ticker]:C(len) - minval) / minval * 100
end
-- Цвет текста в ячейке. Если рост - то цвет "зеленый", падение - "красный"
--function FCellColor(change) if change > 0 then return RGB(0,128,0) else return RGB(158,0,0) end end
function FCellColor(change) if change > 0 then return RGB(0,0,0) else return RGB(0,0,0) end end
-- Маленькая "тепловая карта". Делает фон ячейки более интенсивным, взависимости от величины роста(падения)
function BCellColor(change)
bright = math.floor(255 - min(math.abs(change*11), 235),1) --10 110
if change > 0 then return RGB(bright,255,bright) else return RGB(255,bright,bright) end
end
function DaysHigh(ticker, days_before)
local hi,len = -1000000000,sources[ticker]:Size()
for i = len, len - days_before, -1 do hi = max(hi,sources[ticker]:H(i)) end
return hi
end
function DaysLow(ticker, days_before)
local lo,len = 1000000000,sources[ticker]:Size()
for i = len, len - days_before, -1 do lo = min(lo,sources[ticker]:L(i)) end
return lo
end
-- Функция вызывается перед остановкой скрипта
function OnStop(signal) stopped = true end
-- Функция вызывается перед закрытием квика
function OnClose() stopped = true end;
-- Основная функция выполнения скрипта
function main()
while not stopped do sleep(1) end
end
Надеюсь, этот скрипт сделает вас ещё богаче!
Код скрипта можно загрузить со страницы
https://www.jatotrade.com/download (в конце страницы)
Подписаться на мой ютьюб-канал можно
здесь. Там много чего интересного в части отъема денег умными у сильных.
Есть одно НО :)
www.jatotrade.com/download — тут фон вырвиглаз :(
Можно его поменять?
gyazo.com/e2a53e593bc5541bd5d6755be13cf7c0.png
На белом фоне читается отлично, а тут ну прям я не знаю очень напряжно...
Спасибо.
Может быть конечно индивидуально…
Вот даже квик на 8,5 обновил и уже всё по другому вроде :(
К примеру, есть таблица table, в которой 1 строка и 3 столбца.
При определенном значении переменной х в 2 столбце вся строка должна окраситься в цвет RGB (255,237,140).
Как мне записать выражение с SetColor?
С меня лайк )
кроме копирайта сделайте MIT License или что-то подобное
Спасибо, что не забываете!
Только на всякий случай еще раз уточню: изменение от хай/лоу задаваемого дня до текущей торгуемой цены. А не от хай/лоу за весь период от задаваемого дня до текущей цены (как в скрипте текущего топика).
«относительно списка заданных дат» — я так обширно не надеялся. Хотя бы с одной задаваемой датой, но с выводом в таблицу определенного хай/лоу.