Сегодня:
Добавляем статистику по акциям роста и падения.
Составляем TOP лидеров роста и падения.
Быстрый поиск акций по тикеру в терминале.
Пока не перешли к следующей теме решил показать, как можно улучшить скринер акций, который делали ранее. Кто еще не знаком или уже забыл о чем был скрипт лучше вернуться и хотя бы бегло ознакомиться с логикой и пошаговым построением, чтобы было легче вникнуть в текущие изменения.
Напомню, что скринер выводил по тикерам акции, которые торгуются на Московской Бирже (за минусом бумаг с нулевыми объемами), и по ним через каждые 10 секунд проверял значение LASTCHANGE (% роста/снижения к закрытию прошлого дня) через getParamEx.
В первичной итерации скринер выглядел следующим образом:
Логично продолжить изменения скрипта и сделать расчеты, которые напрашивались, глядя на сам скринер: подсчитаем сколько бумаг торгуется в плюсе, сколько в «красной зоне». Также можно рассчитать средний процент роста/снижения всего по списку, плюс отдельно по растущим бумагам, отдельно по падающим.
Для этого для расчета средних введем переменные UpAver и DownAver, а для подсчета количества растущих и падающих бумаг SumUp и SumDown. Общую динамику по всем бумагам будем считать в TotalDelta. Также можно будет добавить еще % долю растущих и падающих бумаг.
Добавим в цикл for, который проходит по всем тикерам бумаг, следующие условия:
Добавим вывод заголовков (только один раз, при построении таблицы, когда индекс первой итерации index_two == 0)
В целях оптимизации скорости работы скрипта будем фиксировать предыдущие значения по каждой переменной и только если они поменялись обновлять их в таблице:
Функция mprint – это округлением до 2 знака через форматирование строки:
function mprint(numb) return string.format("%.2f", numb) end
В блоке построения таблицы увеличим границу цикла до 28, чтобы у нас добавилось еще 3 строки:
for i=1, 28 do InsertRow(m_t,-1) end
Запускаем скрипт, получаем:
242 – бумаги по которым сейчас работает скринер (исключены тикеры с нулевыми объемами «ACKO», «GAZC», «GAZS», «GAZT», «MGNZ» – они прописываются в самом коде, Polymetal пока не удаляю из мониторинга, т.к. надеюсь, что они всё же вернутся на нашу биржу).
Ср.всего – средняя динамика роста/снижения по всем бумагам, в %. Т.к. скринер преимущественно красного цвета, то и средняя общая динамика отрицательная.
Ср.рост – средняя динамика роста только по бумагам, которые торгуются в плюсе, в %. Таковых на момент скрина 57 бумаг, что составляет 23,6% от всего рассматриваемого массива компаний.
Аналогично Ср.сниж – средний % снижения по бумагам, которые в «красной зоне». Таких 177 или 73,1%.
23,6% + 73,1% = 96,7% куда делись еще 3,3%?
Это погрешность расчета? Нет, это доля в общем массиве тех компаний, по которым в моменте цена равна цене закрытия предыдущего дня (с учетом округления до второго знака): 8 компаний (включая POLY), это и есть 8/242=3,3%.
Составляем TOP лидеров роста и падения.
Добавим еще столбцы, в которых будем делать пересчет лучших и худших по динамике бумаг.
AddColumn(m_t, 21, " ", true, QTABLE_STRING_TYPE, 3) -- столбец нумерации AddColumn(m_t, 22, "TOPLIST", true, QTABLE_STRING_TYPE, 9) -- тикеры лучших AddColumn(m_t, 23, " ", true, QTABLE_DOUBLE_TYPE, 7) -- столбец значений AddColumn(m_t, 24, "ANTI TOP", true, QTABLE_STRING_TYPE, 9) -- тикеры худших AddColumn(m_t, 25, " ", true, QTABLE_DOUBLE_TYPE, 7) -- столбец значений
Логично рейтинг сделать после того как уже будет сформирован массив DELTA со всеми текущими значениями роста/падения по бумагам, чтобы один раз пройтись по нему циклом и определить лидеров.
Нам понадобятся 2 массива TOPPLUS = {} и TOPMINUS = {}, которые мы определим в первой итерации цикла for и первыми значениями разместим {tikers[x], DELTA[tikers[x]]} первый тикер и его значение. Далее мы будем сравнивать и если новое значение больше минимального в списке лидеров или меньше максимального значения в списке худших, то в соответствующем массиве дополнять новым элементом. Как только любой из массивов превысит по этой логике 25 элементов будем удалять наихудший элемент.
Аналогично с топом худших:
Осталось полученные массивы TOPPLUS и TOPMINUS отдельными циклами вывести в новые столбцы таблицы:
Здесь если в рейтинге лучших появляется ноль или отрицательные значения (может быть, когда весь рынок «красный»), то не выводим такое значение. Аналогично в худших: если появляется положительно число или ноль, то не выводим. При этом в обоих случаях стираем предыдущее значение и тикер.
Запускаем скрипт, получаем такой вариант скринера с расчетами и рейтингами:
Удобно видеть в онлайне (с обновлением через каждые 10 секунд) лидеров и антилидеров на фоне общей картины рынка.
Файл скринера на github. Цветовые настройки можно поменять в самом скрипте (задаются в OnInit)
Быстрый поиск акций по тикеру в терминале.
Так как в таблице присутствует в т.ч. акции 2 и 3 эшелона, которые не на слуху и которых не удобно по тикеру постоянно подглядывать в таблицу текущих торгов, то полезно использовать в терминале поиск по бумаге:
Если не находите на панели терминала, нажимаем правую клавишу мыши на панели квика, выбираем Поиск инструмента:
Вбив в форму поиска тикер бумаги и нажав enter получаем таблицу результата поиска:
Нас интересуют акции (код класса TQBR). Здесь можно как провалиться в биржевой стакан (двойной клик мышкой), получить информацию по инструменту (ALT + I, либо: правая клавиша мышки, Информация об инструменте) или построить график цены и объема (правая клавиша мышки, График цены и объема).
Желающие могут сократить массив тикеров и, например, оставить только ТОП100 компаний, либо только бумаги, которых входят в индекс Мосбиржи IMOEX (ТОП лидеров в этом случае вполне достаточно делать по 10 компаниям). Можете попробовать реализовать это в качестве самостоятельной работы. Но лично мне интереснее наблюдать динамику всего рынка, поэтому я смотрю в широком формате.
В качестве дополнительного упражнения желающие могут попробовать по аналогии с массивом предыдущих значений таблицы сделать соответствующие массивы предыдущих значений по полученным рейтингам (TOPLIST/ ANTI TOP) и обновлять эти данные таблицы только когда они в новой итерации поменялись.
Позднее мы еще вернемся к небольшим улучшениям данного скрипта, но уже после прохождения всех базовых тем для начинающих.
А в следующей статье мы рассмотрим тему работы через скрипт с биржевыми стаканами в терминале.
Теги: qlua для начинающих, кружок авиамоделизма.
Ранее:
Qlua: введение
Доля клиентов, использующих алгоритмическую торговлю
«Кружок авиамоделизма»
Разные торговые терминалы, почему Quik
Основной функционал qlua
https://smart-lab.ru/blog/917696.php
Настраиваем торговый терминал и редактор кода
Установка торгового терминала
Подготовка терминала
Вкладки в терминале
Сохранение и загрузка настроек
Таблица системных сообщений
Отключение окна сообщений
Редактор Notepad++
Настройка русского языка в редакторе
Выбор синтаксиса языка и кодировки
Цветовые настройки
Дублирующий просмотр
Запуск первого скрипта
https://smart-lab.ru/blog/918869.php
Основы qlua, часть 1:
message, конкатенация
фильтрация по сообщениям в терминале
PrintDbgStr, комментарии
типы данных, type
операции с числами
операции со строками
операции с таблицами
условные операторы
https://smart-lab.ru/blog/920031.php
Основы qlua, часть 2:
Циклы for … do … end, while do … end, repeat … until.
sleep, break, goto.
как пройти весь массив циклом, как пройти таблицу по ключам
локальные и глобальные переменные, функции
получение даты и времени
получение данных через getInfoParam
https://smart-lab.ru/blog/921366.php
Qlua: структура скрипта.
Структура типового скрипта qlua с примерами.
Обработка скриптом «обрыва связи» с сервером и возобновления работы.
Работа с файлами: запись, перезапись и чтение файла.
getScriptPath, getWorkingFolder
https://smart-lab.ru/blog/922044.php
Qlua: получение данных из таблицы текущих торгов, создание таблиц в торговом терминале.
Получение биржевых данных через функцию getParamEx
Выгрузка списка параметров функции getParamEx через DDE из торгового терминала
Создание пользовательских таблиц в торговом терминале
https://smart-lab.ru/blog/923365.php
Qlua: работа с таблицами (продолжение). Пишем своего советника (начало).
Интегрируем таблицы в структуру скрипта qlua.
Удаляем таблицы через DestroyTable.
Останавливаем скрипт через IsWindowClosed.
Обработка события закрытия таблицы через коллбэк.
Работа с цветом SetColor, Highlight, SetSelectedRow.
Пишем простого советника.
https://smart-lab.ru/blog/924710.php
Qlua: дополняем скрипт советника таймингом:
Устанавливаем время старта работы скрипта,
Ставим тайминг на получение сигналов на вход,
Устанавливаем таймер на приостановку скрипта.
https://smart-lab.ru/blog/925421.php
Qlua советник: дополняем сигналами на закрытие позиции, таблицей для вывода данных и расчетом финансового результата по позициям.
Дополняем сигналами на закрытие позиции.
Создаем дополнительную таблицу для вывода данных.
Делаем расчет финансового результата.
https://smart-lab.ru/blog/926972.php
Qlua: завершаем апгрейд советника:
Пропуск «поздних» сигналов на старте.
Обработка советником обрыва связи.
Сохранение сигналов и логов в файл.
https://smart-lab.ru/blog/927748.php
Qlua: пишем скринер акций Московской биржи
https://smart-lab.ru/blog/928152.php
Qlua: получение данных биржевых свечей с сервера брокера, обработка данных, пишем скрипт выгрузки котировок
Функция CreateDataSource
Получение количества свечек данных
Пауза для подгрузки данных
Получение по инструменту OPEN, HIGH, LOW, CLOSE, VOLUME
Обработка времени и даты
Закрытие источника данных
Примеры: получение данных последних 10 свечей, выгрузка новой минутной свечки после её закрытия, текущее значение простой средней SMA10 по минуткам
Простой скрипт выгрузки котировок
https://smart-lab.ru/blog/929905.php
Qlua: получение данных с графиков терминала.
Идентификатор инструмента
Получаем количество свечей через getNumCandles
Получаем свечные данных через getCandlesByIndex
Читаем данные с индикатора SMA
Данные с верхней и нижней линии Price Channel
Графики с таблицы текущих торгов.
Сравнение получение данных через CreateDataSource и через getCandlesByIndex
https://smart-lab.ru/blog/931408.php
Qlua: работа с метками, пишем торгового советника на индикаторах.
Вывод текста на график
Вывод графических сигналов
Удаление меток с графика
Торговый советник на индикаторах
Удаление данных вечерней/утренней сессии с графика.
https://smart-lab.ru/blog/933582.php
Qlua: работа с лентой всех сделок.
Что такое таблица обезличенных сделок.
Настройка таблицы в терминале.
Что делать, если таблица открылась, но она пустая.
Вывод данных с таблицы по DDE.
Работа с таблицей обезличенных сделок через скрипт qlua с примерами.
Пишем советника, показывающего на графике крупных игроков.
https://smart-lab.ru/blog/935919.php
Qlua: работа с лентой всех сделок (часть 2).
Различия данных ленты всех сделок и биржевого стакана.
Большие покупки и продажи в ленте сделок и динамика цены.
Альтернативные варианты поиск крупных игроков по ленте сделок.
https://smart-lab.ru/blog/938053.php
github.com/morefinances/qlua/blob/main/stockscreener_v2_1_medium_final.lua
Подправил в части стирания предыдущих значений рейтинга, если TOPLIST или ANTITOP меньше 25 бумаг:
if #TOPPLUS < 25 then
Аналогично и для #TOPMINUS.for _ = #TOPPLUS, 25 do
SetCell(m_t, _, 22, " ")
SetCell(m_t, _, 23, " ")
end
end
Сегодня рынок выглядит так: