Постов с тегом "qlua": 173

qlua


Qlua: структура скрипта для торгового терминала, обработка обрыва связи и её возобновления, работа с файлами

Сегодня начинаем уже писать полноценные скрипты для терминала, а не отдельные блоки кода на lua.

Пройдем:

  • Структуру типового скрипта qlua с примерами.
  • Обработку скриптом «обрыва связи» с сервером и возобновления работы.
  • Работу с файлами: запись, перезапись и чтение файла.
  • getScriptPath, getWorkingFolder

Структура скрипта

В торговом терминале можно запускать небольшие примеры на lua, как мы это делали ранее, но если говорить о постоянно работающем алгоритме, а не о компактной программе, которая должна выполнить только несколько коротких действий, то минимальная структура скрипта для квика будет содержать следующие функции:

Qlua: структура скрипта для торгового терминала, обработка обрыва связи и её возобновления, работа с файлами

function OnInit – инициализирует глобальные переменные и константы (например, торгуемые бумаги, размеры тейка и стопа, торговый счет и пр.), имена таблиц, необходимых файлов.

function OnStop – функция остановки скрипта, активируется при нажатии клавиши «Остановить» в панели скриптов терминала.

function main – основная функция, создает отдельный поток для выполнения скрипта. Обычно внутри main создается цикл для непрерывной работы, т.к. без него функция выполнит один раз весь код, который в ней прописан и скрипт остановится.



( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Qlua: основы, часть 2

Продолжаем погружаться в основы языка. Сегодня рассмотрим:

 

Циклы for … do… end
while do … end
repeat … until
sleep
Как пройти весь массив циклом
Как пройти таблицу по ключам и значением
break
goto
Локальные и глобальные переменные
Функции
Получение даты и времени
Получение данных через getInfoParam


Цикл for … end

for index = start, end, step do 
-- start – начало отсчета, 
-- end – конец отсчета, step - шаг

  -- тело цикла

end



Пример:

for i = 1, 10 do -- пройтись от 1 до 10 c шагом 1 (по умолчанию)<br />
  message("i="..i)  -- вывод i<br />
end

Можно задать шаг:

for i = 1, 10, 2 do -- пройтись с 1 до 10 с шагом 2

  message("i="..i)

end

Цикл while do...end

while (условие) do

  -- тело цикла

end


Выполняет тело цикла, пока соблюдается условие. Если условие на старте не соблюдается, то цикл не запустится.

Пример:

a = 1

while a < 9 do

   a = a + 1

   message(tostring(a))

end

 

Цикл repeat … until



( Читать дальше )

Qlua: основы, часть 1

Весь материал, который здесь и далее будет рассматриваться по qlua, работает на 10й версии квика. Вполне допускаю, что со временем какие-то функции разработчики перепишут и в новых версиях что-то нужно будет сверять c мануалами, уточнять хелпом и на форумах, но предполагаю, что а) эти изменения будут вводиться очень не быстро и б) синтаксис и основа при этом останутся без существенных изменений.

Сегодня рассмотрим:

  • message
  • конкатенация
  • фильтрация по сообщениям в терминале
  • PrintDbgStr
  • комментарии
  • типы данных
  • type
  • операции с числами
  • операции со строками
  • операции с таблицами
  • условные операторы

 

message

Выводит сообщение в торговом терминале в формате окна (в прошлой статье говорил, что удобнее отключить, чтобы не отвлекаться постоянно) и в таблице системных сообщений.  

Особенности message: функция после вывода делает перенос строки, поэтому если необходимо вывести несколько значений в одной строке нужно делать их слияние (об этом ниже).

Для корректного отображения русских букв необходимо выбирать котировку файла Windows-1251 (об этом также в прошлый раз мы уже говорили). Иногда по этой причине некоторые разработчики пишут только на английском весь вывод текста в терминал, чтобы не заморачиваться с кодировкой, в т.ч. при размещении на github и совместной работе с кодом.



( Читать дальше )

Qlua: настраиваем торговый терминал и редактор кода.

Для людей уже торгующих через Quik можно перейти сразу к настройкам редактора кода, а тем, кто хорошо знаком с Notepad++, то сразу к запуску скрипта.

В прошлой статье я привел статистику ЦБ, что клиентов, работающих через мобильные приложения брокеров сейчас в разы больше тех, кто работает через торговые терминалы. По этой причине я решил кратко затронуть и установку квика, и поделиться полезными настройками на старте (хотя, полагаю, что среди аудитории смартлаба, доминирующая часть именно тех, кто с терминалом «на ты», продвинутые пользователи сами могут в комментариях указать свои лайфхаки по настройкам и работе).

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



( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Qlua: введение.

Cерия статей по языку QLua и алгоритмической торговле для тех, кто хочет автоматизировать свою работу на финансовых рынках, освоить написание скриптов, индикаторов, торговых советников и роботов для терминала Quik.

В 2022 году ЦБ выпустил презентацию «Портрет клиента брокера». В ней указано, что в РФ всего 0,03% клиентов используют алгоритмическую торговлю.

Qlua: введение.


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

У меня нет задачи популяризировать эту тему, скорее помочь тем, кто будет идти той же дорогой. Дело в том, что открытой информации по qlua и алгоритмической торговле через Quik в сети немного: есть несколько сайтов энтузиастов, где кусочками выложены разные полезности, часть из этой информации порой уже устаревшая (работает только на более ранних версиях терминала), есть несколько коммерческих проектов (продажи роботов, либо обучения) там информация актуальная, но за неё нужно платить. Есть интересные библиотеки, но отдельные (например, какие-то библиотеки визуального интерфейса) могут отваливаться с появлением новых версий квика.



( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Получение тикеров торгуемых бумаг через getClassSecurities

Благодаря наводке @quant_trader (за что отдельное спасибо!), переписал свой первый скрипт из поста https://smart-lab.ru/blog/916765.php по выгрузке из терминала всех торгуемых бумаг. Теперь всё выполняется штатными средствами с помощью getClassSecurities.

Далее второй скрипт (из поста выше) выгружает из торгового терминала под закрытие дня (под закрытие основной, либо вечерней сессии — можно устанавливать, я делаю обе выгрузки) необходимые данные по всем бумагам списка.

Особенности запроса. Если ввести:

sec_list = getClassSecurities("TQBR")<br />message(sec_list)

то терминал выдаст строку, где через запятую будут все тикеры, при этом видим, что список не полон, обрывается на RTSB:

Получение тикеров торгуемых бумаг через getClassSecurities

Как выяснилось, это связано только с ограничением самого терминала на вывод строки (не более 899 символов).

При этом если посмотреть длину строки, то будет видно, что символов больше:

sec_list = getClassSecurities("TQBR")
message(tostring(string.len(sec_list)))

выдаст 1281

Разбив строку по запятым получим весь массив тикеров для дальнейшей работы:



( Читать дальше )

Выгрузка данных на конец дня по всем акциям Московской Биржи

Иногда бывает необходимым проанализировать не отдельную бумагу, а рынок в целом.

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

Получить котировки на конкретную дату можно через сайт Московской Биржи (https://www.moex.com/ru/marketdata/#/mode=groups&group=4&collection=3&boardgroup=57&data_type=history&date=2023-06-27&category=main), но это не очень удобно т.к. требуется либо парсить (для чего нужен уже нетривиальный уровень в программировании), либо вручную выдергивать эту страницу, например в excel (тем, кто попробует выгрузить всё по кнопкам скачать Excel / CSV биржа предложит воспользоваться платной подпиской для получения данных).



( Читать дальше )

Лайфхак QLUA для загрузки больших данных

    • 27 апреля 2023, 22:45
    • |
    • GOLD
      Популярный автор
  • Еще
Мой дорогой друг, если ты гоняешь бэктесты в QLUA, то тебе регулярно приходится загружать исторические данные. Как правило, это текстовый файл с тысячами строк в формате D,T,O,H,L,C,V:

20220915,090000,61420,61497,61406,61464,241
20220915,090100,61460,61476,61420,61451,160
20220915,090200,61444,61489,61436,61479,185

Осмелюсь предположить, что эти строки ты заливаешь в массив с помощью string.match. Это готовый парсер строки с разделителем. Работает достаточно шустро. Я на нем сидел пару лет.

Когда данных не много, такой метод загрузки не напрягает. Но когда за день 20-30 раз загружаешь сотни тысяч или миллион строк, то потери времени становятся невыносимыми.

Стал искать способ ускорить этот процесс. И он таки нашелся. Выяснил следующее:

Если строки в файле истории сконвертировать в такой вид (делается 1 раз):

table.insert(MyTable,{«20220915»,«090000»,61420,61497,61406,61464,241})
table.insert(MyTable,{«20220915»,«090100»,61460,61476,61420,61451,160})
table.insert(MyTable,{«20220915»,«090200»,61444,61489,61436,61479,185})



( Читать дальше )

Анализ паттерна "молот" по акциям российских компаний.

Всем привет!
В предыдущем своем посте я приводил небольшой обзор проведенного анализа паттерна «падающая звезда». 
Как и обещал, я провел аналогичный анализ по паттерну «молот». 
На всякий случай вот краткое определение этого паттерна:
"Паттерн молота — это бычий разворот, который появляется после длительного медвежьего тренда. У него маленькое тело с длинной нижней тенью. Это ценовой паттерн, при котором цены открытия и закрытия близки, указывая на то, что медведи активизировались, но цена остается близкой к уровню открытия."

Более подробный анализ я провел в статье на Дзен

Приведу тут некоторые выводы проведенного анализа. Для анализа были взяты графики цен по 246 российским компаниям. Изучались следующие тайм-фреймы: 1 минута, 5 минут, 10 минут, 30 минут, 1 час, 4 часа, 1 день и 1 неделя.

Запуск скрипта проводился 24 февраля. Скрипт собирал данные около 30 минут.
Всего было выявлено 88544 свечи, соответствующих паттерну «молот» (Это больше, чем находилось «падающих звезд». Их было 62146 на тех же графиках и тех же тайм-фреймах). Для своих исследований я принял условие, что нижняя тень должна быть не менее чем в три раза больше остальной части свечи.

( Читать дальше )

Индикатор дневных уровней

Индикатор DHLM показывает Хай, Лоу и среднее значение за торговый день.
Индикатор дневных уровней

 

 

Settings =
{
    Name = «DHLM»,
        line =
{
    {
    Name = «High»,
        Color = RGB(0,200,64),
        Type = TYPET_BAR,
        Width = 1
    },
{
    Name = «Low»,
        Color = RGB(200,0,64),
        Type = TYPET_BAR,
        Width = 1
    },
{
    Name = «Median»,
        Color = RGB(0,64,200),
        Type = TYPET_BAR,
        Width = 1
        }
   }
}

local hlm = {}
local math_max = math.max
local math_min = math.min

function Init()
      return #Settings.line
end
function OnCalculate(index)
local dt = T(index)

if O(index) then
if dt.day ~= hlm.day or
          dt.month ~= hlm.month or
          dt.year ~= hlm.year then
           hlm.year = dt.year
           hlm.day = dt.day
           hlm.month = dt.month
           hlm.high = H(index)
           hlm.low = L(index)
      else
           hlm.high = math_max(hlm.high,H(index))
           hlm.low = math_min(hlm.low,L(index))
           hlm.median = (hlm.high + hlm.low)/2
      end
end
return hlm.high,hlm.low,hlm.median
end

 


....все тэги
UPDONW
Новый дизайн