Блог им. jatotrade_com

-- ©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
Есть одно НО :)
www.jatotrade.com/download — тут фон вырвиглаз :(
Можно его поменять?
gyazo.com/e2a53e593bc5541bd5d6755be13cf7c0.png
На белом фоне читается отлично, а тут ну прям я не знаю очень напряжно...
Спасибо.
Может быть конечно индивидуально…
Вот даже квик на 8,5 обновил и уже всё по другому вроде :(
К примеру, есть таблица table, в которой 1 строка и 3 столбца.
При определенном значении переменной х в 2 столбце вся строка должна окраситься в цвет RGB (255,237,140).
Как мне записать выражение с SetColor?
С меня лайк )
кроме копирайта сделайте MIT License или что-то подобное
Спасибо, что не забываете!
Только на всякий случай еще раз уточню: изменение от хай/лоу задаваемого дня до текущей торгуемой цены. А не от хай/лоу за весь период от задаваемого дня до текущей цены (как в скрипте текущего топика).
«относительно списка заданных дат» — я так обширно не надеялся. Хотя бы с одной задаваемой датой, но с выводом в таблицу определенного хай/лоу.