Блог им. 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 или что-то подобное
Спасибо, что не забываете!
Только на всякий случай еще раз уточню: изменение от хай/лоу задаваемого дня до текущей торгуемой цены. А не от хай/лоу за весь период от задаваемого дня до текущей цены (как в скрипте текущего топика).
«относительно списка заданных дат» — я так обширно не надеялся. Хотя бы с одной задаваемой датой, но с выводом в таблицу определенного хай/лоу.