Блог им. jatotrade_com

QLua скринер. Обновление.

Всем привет!
В продолжение топика «QLua скринер в 10 строк кода. Или „за базар отвечаю“, можно качать обнулённый обновлённый скринер.
Выглядит так в статике:
QLua скринер. Обновление.
А так в динамике.
Если в прошлом скринере отображалось изменение текущей цены от цен закрытия за соответствующее количество торговых сессий (список „срезов“ задается пользователем), то в этом будет две таблицы. Первая таблица — изменение текущей цены от предыдущих хаев (чуть не оговорился...) за 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 (в конце страницы)
Подписаться на мой ютьюб-канал можно здесь. Там много чего интересного в части отъема денег умными у сильных.
  • обсудить на форуме:
  • Quik Lua
★54
21 комментарий
Евгений спасибо за труд.
Есть одно НО :)
www.jatotrade.com/download — тут фон вырвиглаз :(
Можно его поменять?
Свой Мужик, да не вопрос, поменяю, я только не понял: фон где?
Евгений Шибаев, ну вот эти графики вокруг, голова через 2 минуты заболела :(
gyazo.com/e2a53e593bc5541bd5d6755be13cf7c0.png
На белом фоне читается отлично, а тут ну прям я не знаю очень напряжно...
Спасибо.
Свой Мужик, ой блин, что ж вы так мучаетесь, написали бы сразу, вот в новой сборке Джато все норм, там только луа скрипт новый и со всеми Квиками версии выше 8. Обновитесь, если не получится пишите я специально для вас настрою. Новая сборка от вчера:



Евгений Шибаев, я про сам сайт, до закачки пока не дошёл, читаю а у меня в глазах бегает :(
Может быть конечно индивидуально…
Свой Мужик, а понял о чем вы…
Свой Мужик, Все говорят «фильм для дураков, а мне понравился!». Мне вот настолько понравился фон на сайте, что решил купить лицензию
Михаил Перминов, да я не спорю с какого устройства смотрите? Тут для всех по разному.
Вот даже квик на 8,5 обновил и уже всё по другому вроде :(
Свой Мужик, и с ПК, и с мобильного не вызывает дискомфорта для глаз. Наверное, всё же, обсуждаем фломастеры)
чуть не оговорился
 
 
avatar
/../, да тут уж с этими обновлениями-обнулениями, хайями — уйями, запутаться можно
Только начал Луа изучать и возник вопрос, как пользоваться SetColor. 

К примеру, есть таблица table, в которой 1 строка и 3 столбца.
При определенном значении переменной х в 2 столбце вся строка должна окраситься в цвет RGB (255,237,140).

Как мне записать выражение с SetColor?
С меня лайк )
Врач-бондиатОр, как-то так SetColor(table, 1, 2, RGB (255,237,140), RGB (0,0,0), RGB (255,237,140), RGB (0,0,0)) ну это если цвет текста черный а фон RGB (255,237,140)
Евгений Шибаев, спасибо! Попробую )
спасибо за скрипт
avatar
непонятна лицензия с которой распространяется данный софт
кроме копирайта сделайте MIT License или что-то подобное
avatar
gardist, да, MIT нужно сделать, спасибо что заметили.
Таким образом, техзадание (ТЗ) участника тусовки Weddy практически выполнено, остается доделать, как он просил, тот же функционал, только относительно списка заданных дат.
Жду-жду :)
Спасибо, что не забываете!
Только на всякий случай еще раз уточню: изменение от хай/лоу задаваемого дня до текущей торгуемой цены. А не от хай/лоу за весь период от задаваемого дня до текущей цены (как в скрипте текущего топика).
«относительно списка заданных дат» — я так обширно не надеялся. Хотя бы с одной задаваемой датой, но с выводом в таблицу определенного хай/лоу.
avatar
Weddy, да понял, доделаю обязательно, как и обещал.
Евгений, спасибо за скрипт, вы очень крутой) Но что касается сайта на WIX все очень плачевно, со структурой засада, да и со всем остальным тоже) Но я заметил такую закономерность — чем круче продукт, тем хуже сайт, так что с терминалом у вас полный порядок) Скачал бесплатную версию, спасибо)
avatar
Спасибо за оценку, да есть такое — насчет сайта), я не парюсь особо, во первых времени не хватает, а во вторых терминал делал под себя, а не для всех, по- этому и ошибки иногда встречаются — но все испытано на собственной шкуре, сам торгую только через Джато) Завтра будет обновление и в скрипте и в терминале в части Квика (АРКА каждый день что-то придумывает...)

теги блога Евгений Шибаев

....все тэги



UPDONW
Новый дизайн