alfacentavra
alfacentavra личный блог
03 августа 2023, 16:35

Qlua: пишем скринер акций Московской биржи

Пока не ушли далеко от темы получения данных из таблицы текущих торгов решил сделать в качестве примера еще и простой скринер акций. Это вполне доступно по тем материалам, которые мы уже прошли. Будем отслеживать динамику изменения цены относительно цены закрытия предыдущего дня.

Нам понадобятся:

1. Таблица для вывода данных (строить уже умеем).

2. Получение данных из таблицы текущих торгов через getParamEx (проходили там же).

3. Тикеры бумаг. Можно взять конкретный список бумаг и работать с ним, но приятнее и правильнее, чтобы скрипт мог автоматом выгружать все торгуемые тикеры из терминала и далее уже отслеживать их динамику. Попробуем это реализовать.

Через sec_list = getClassSecurities(«TQBR») можно получить строку с тикерами акций на Московской бирже, которые будут разделены запятыми. Чтобы пройтись по всем элементам и записать их в массив используем цикл:

for TIKER in string.gmatch(sec_list, "[^,]+") do
  tikers[#tikers + 1]=TIKER
end


Отслеживать будем параметр LASTCHANGE – процент изменения цены от цены закрытия:

local delta = getParamEx(«TQBR», tikers[i], «LASTCHANGE»)

В настоящий момент на фондовой секции Мосбиржи торгуются 248 бумаги (некоторые показываются только индикативно, реальных торгов по ним не ведутся). Создадим таблицу 25 х 10 в которой будем отражать тикер и полученный с таблицы торгов данные, если бумага торгуется в плюсе закрасим её зеленым, если в минусе красным цветом, если без изменений, то без цвета.

Qlua: пишем скринер акций Московской биржи
 

Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_0.lua

Вроде бы всё работает, но не очень удобно искать по тикеру конкретную бумагу: логичнее расположить вывод из массива не горизонтально, а вертикально, переделаем.

Здесь также можно улучшить алгоритм: после получения значений в первой итерации сложим их по тикерам в массив DELTA и если в следующем цикле цифра не будет отличаться, то мы и не будем обновлять её в таблице, что существенно сэкономит нам время на обновление данных. По этой же причине локальная переменная delta теперь стала глобальной, т.к. используется далее вне цикла for.

Результат:

Qlua: пишем скринер акций Московской биржи
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_1_vertical.lua

Уже лучшее, всё работает более быстро, чем в первой версии, но напрашиваются отдельные столбцы для чисел, чтобы они выглядели более форматно, а не плясали по строке то в одну, то в другую сторону.

Дополним скрипт, получим:

Qlua: пишем скринер акций Московской биржи
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_2_columns.lua

И последнее: исключим те тикеры, торговля по которым сейчас не проходит, чтобы данные были максимально по рынку, а не «для коллекции». Для этого добавим функцию, которая будет исключать тикеры, по которым сейчас не проходят торги:

function exc_tik(stock)  
  t = {
    "ACKO",
    "GAZC",
    "GAZS",
    "GAZT",
    "MGNZ"
  }

  for i, v in ipairs(t) do
   if v == stock then return 1 end
  end

  return 0

end

 

И отфильтруем с помощью этой функции массив тикеров, полученных с биржи.

Из нулевых по объему оставил только POLY, надеюсь, что они оперативно вернуться на торги. Остальные белым выделены бумаги, которые в моменте торгуются по цене закрытия вчерашнего дня.

Результат:

Qlua: пишем скринер акций Московской биржи
Файл: https://github.com/morefinances/qlua/blob/main/stockscreener_v1_3.lua

Скрипт можно еще улучшать (будем возвращаться к этому позже), но главное – даже с таким минимальным багажом знаний по qlua можно делать уже вполне себе полезные вещи.

Для удобства изучения решил не перегружать текст кодом, который минимально отличается от версии к версии, а просто приложить соответствующий файл к каждой таблице. Последний вариант (файл v.1.3.) включает все озвученные изменения.
Желающие смогут залезть в код каждой версии и посмотреть изменения, либо потестировать/улучшить итоговый вариант.

Скринер легко модифицируется под любой другой расчет с данных таблицы текущих торгов. Попробуйте, например, сделать вариант с % дневной волатильности по каждой бумаге. 

Теги: qlua для начинающих, кружок авиамоделизма.

32 Комментария
  • Ухо спекулянта
    03 августа 2023, 18:11
    Респект кодерам QLUA 
  • Ухо спекулянта
    03 августа 2023, 18:13
     А слабо скинуть код сеточника бесплатно? 
      • Ухо спекулянта
        04 августа 2023, 08:33
        alfacentavra, кнопка это одно, а бесплатный скрипт это другое, не надо передергивать понятия эти… Мне вот лень много кода писать а вот готовый код подпилить это можно
  • ЛешаКурочкин
    03 августа 2023, 18:40
    Подскажите а есть варианты кроме как через квик это провернуть?
  • Михаил К.
    04 августа 2023, 06:45
    Спасибо, очень интересно. Но, я так понимаю, связать таблицу-скринер с графиком не получится? Ну, так как связываются стандартные таблицы квика с графиками… И, ещё, есть ли в квике возможность вместо скринера, как таблицы, запихнуть его код в график? То есть, например, на графике будет отображаться тот инструмент, который в данный момент соответствует определённым критериям…
      • Михаил К.
        04 августа 2023, 12:51
        alfacentavra, спасибо, понял. 
  • Сергей Иванов
    04 августа 2023, 14:40
    alfacentavra, спасибо за кружок, очень познавательно 
  • DennyV8
    08 августа 2023, 21:07
    Искал тут по сети как вытащить заявку айсберга из потока обезличенных сделок и наткнулся на Ваш пост. Похоже только Qlua мне поможет. Надо попробовать будет, задача определять наибольшую заявку из указанных и выводить ее на график текущего инструмента, помощник своего рода.
  • DennyV8
    25 августа 2023, 00:01
    Спасибо, принято. Сравню с тем что сам сваял, вроде как рабочий даже ))
  • DennyV8
    29 августа 2023, 11:34
    Можно ли в скринере выводить в таблицу расчетные значения, полученные сначала через getParamEx и потом были произведены вычисления.
    Хотелось бы добавить универсальный блок для дополнительного расчета полученных данных из таблицы значений, а то иногда мало того стандарта и нужно что-то посчитать, что-то типа этого : 

    bid = getParamEx(«TQBR», tikers[i], «BID»)
    offer = getParamEx(«TQBR», tikers[i], «OFFER»)
    spread = (offer — bid) / bid * 100

    и выводить в таблицу spread каждого тикера вместо delta, у меня в этом месте затык, чую что всего пара строк кода нужна))

    delta = getParamEx(«TQBR», tikers[i], «LASTCHANGE»)
      • DennyV8
        30 августа 2023, 10:20
        alfacentavra, Я примерно так и сделал сначала, только без проверки с 0, но выдает ошибку на строку с delta
        lua:119: attempt to perform arithmetic on a table value (global 'offer')
      • DennyV8
        30 августа 2023, 11:37
        alfacentavra,  Лишь бы таблица заработала, дальше разберемся, но пока все попытки тщетны ))

        UPDATE
        на просторах нашел часть кода, пишут что рабочий, но проверить не могу.

        --Внутри колбека OnParam
        --Считаем средний спред
                 local tablebid = getParamEx(class_code,  fff, "bid") --получаем таблицу "bid"
                 local bid=tablebid.param_value --из таблицы берём значение
                 local tableoffer = getParamEx(class_code,  fff, "offer") --получаем таблицу "offer"
                 local offer=tableoffer.param_value --из таблицы берём значение
                 local p_spread = (offer - bid) / bid * 100 --считаем текущий спред по бумаге
                 local elem = average_spreads[fff] --создаём таблицу для хранения расчётных данных
                    if elem == nil then
                       average_spreads[fff] = { Count = 1, Spread = p_spread, Avr = p_spread}
                       elem = average_spreads[fff]
                       else
                       elem.Spread = p_spread
                       elem.Avr = (elem.Avr * elem.Count + p_spread) / (elem.Count + 1)
                       elem.Count = elem.Count + 1
                       spread[fff]=elem.Avr
                    end</code>
          • DennyV8
            30 августа 2023, 11:53
            alfacentavra, Вроде работает, вот что значит руки мастера, оперативно сработали, благодарю. Теперь есть поле для маневра с кучей данных из таблицы.
          • DennyV8
            30 августа 2023, 12:30
            alfacentavra, Хотел еще спросить по скринеру акций, я в Quik пытаюсь по коду акции из таблицы скринера вызвать стакан котировок определенной акции, но Quik почти все наши акции на русском языке выдает, может есть какой другой способ?
    • DennyV8
      30 августа 2023, 15:29
      alfacentavra, Вот же я слепой, у меня оказывается это все есть в таблице, простите что отвлек.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн