Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар alfacentavra
    Qlua: структура скрипта для торгового терминала, обработка обрыва связи и её возобновления, работа с файлами

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

    Пройдем:

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

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

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

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

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

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

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



    Авто-репост. Читать в блоге >>>
  2. Аватар alfacentavra
    Qlua: настраиваем торговый терминал и редактор кода.

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

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

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



    Авто-репост. Читать в блоге >>>
  3. Аватар alfacentavra
    Qlua: введение.

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

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

    Qlua: введение.


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

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



    Авто-репост. Читать в блоге >>>
  4. Аватар Magnitny
    Раздаю бесплатно скринер арбитражных спредов под Quik с выводом ТОП10 лучших вариантов
    Всем привет.
    Торгую арбитражные стратегии с помощью роботов.
    Для выбора инструментов использую скринер спредов.
    Решил поделиться)

    Публикуюсь тут впервые, поэтому не знаю, как здесь правильно передавать файлы.
    Давайте вначале так — пишите кому нужен — пришлю
    Если есть какой-то другой вариант, то посоветуйте — исправлю пост.

    Вот такой внешний вид. В первом окне выводится общая информация о Базовом активе, двух ближайших
    фьючерсах и спреде между ними. В последнем столбце активируем какие данные участвует в ТОПЕ
    Во второй столбце выводятся лучшие варианты для сделок
    Раздаю бесплатно скринер арбитражных спредов под Quik с выводом ТОП10 лучших вариантов

    Скачать скрипт — disk.yandex.ru/d/2GcpZeQkL6xZrg

    Авто-репост. Читать в блоге >>>
  5. Аватар evg_gen
    quik lua стаканы
    подскажите, как решается проблема с ограничением в 200 открытых стаканов в QUIK?
    пол дня скрипт работал, и после клиринга начал ошибку писать что макс 200 стаканов моно

    Авто-репост. Читать в блоге >>>
  6. Аватар _sk_
    Ограничитель количества транзакций на чистом QLua
    При торговле с помощью роботов в терминале QUIK рано или поздно встаёт вопрос об ограничении количества отправляемых в секунду транзакций, чтобы не начинались ошибки вида: «Превышен лимит отправки транзакций для данного логина».

    Простой способ, когда вводятся ограничения на уровне каждого торгового робота, приводит к ситуациям, когда заявки отправляются медленно из-за этого ограничения, а свободная пропускная способность ещё есть. Для введения общего ограничения для всех роботов сразу нужно использовать какой-то общий ресурс. В качестве такого ресурса может выступать база данных, собственная dll или что-то ещё. Но чистый QLua не позволяет использовать базу данных без каких-либо внешних библиотек, а dll не всякий умеет писать. К счастью, существует реализация ограничителя на базе файловой системы с помощью чистого QLua.

    Создаётся некая папка D:\throttle\, где работает ограничитель интенсивности. Во время работы QLua-скрипты формируют в этой папке столько файлов, сколько транзакций в секунду разрешено, например 10. При каждой попытке послать транзакцию скрипты, грубо говоря, конкурируют за эти файлы. Если ресурса хватило, то транзакция отправляется, если нет, то скрипт ждёт 10 мс и повторяет попытку заново.

    Авто-репост. Читать в блоге >>>
  7. Аватар Алексей Киселев
    СБЕР брокер - алко-трейдинг (пятница началась в среду)
    Алго-торговля qlua в СБЕР закончилась 30.11.2022

    Рыночные данные стали поставляться в QUIK с задержками в несколько минут… И так уже третий день.
    Техподдержка мычит что-то непонятное в чате. Когда исправят проблемы — не ясно. Видимо ждут приказа Германа.

    Началась пятница — алко-торговля СБЕР.
    СБЕР брокер - алко-трейдинг (пятница началась в среду)

    Герман набрал каких-то дурачков к себе в IT-команду по объявлению на авито.
    ИМХО.

    Авто-репост. Читать в блоге >>>
  8. Аватар Вадим
    В архивной версии Quik 7.14 использовался скрипт на qpile, после перехода на свежие версии терминала старый скрипт перестал работать. Очень не удобно вручную собирать котировки. Помогите написать скрипт на LUA для мониторинга котировок и выгрузки их в текстовый файл в нужном мне формате.
  9. Аватар Алексей Манин
    Синтетическая облигация. Помогите с Qlua.

    Приветствую всех!

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

    Подскажите, что я сделал не так?

    Синтетическая облигация. Ошибка памяти.
    <code>-- ©2022 by Aleksey Manin
    -- Таблица расчета доходности синтетической облигации
    -- Какие инструменты(тикеры) отслеживаем. Таблица пар тикер - площадка
    tickers = {GAZP = {GAZP = "TQBR", GZZ2 = "SPBFUT"},
               SBER = {SBER = "TQBR", SRZ2 = "SPBFUT"},
               PLZL = {PLZL = "TQBR", PZZ2 = "SPBFUT"},
               GMKN = {GMKN = "TQBR", GKZ2 = "SPBFUT"},
               LKOH = {LKOH = "TQBR", LKZ2 = "SPBFUT"},
               AFLT = {AFLT = "TQBR", AFZ2 = "SPBFUT"},
               NVTK = {NVTK = "TQBR", NKZ2 = "SPBFUT"},
               YNDX = {YNDX = "TQBR", YNZ2 = "SPBFUT"},
               --MOEX = {MOEX = "TQBR", MXZ2 = "SPBFUT"},
               ALRS = {ALRS = "TQBR", ALZ2 = "SPBFUT"},
               VTBR = {VTBR = "TQBR", VBZ2 = "SPBFUT"},
               SNGS = {SNGS = "TQBR", SNZ2 = "SPBFUT"},
               MGNT = {MGNT = "TQBR", MNZ2 = "SPBFUT"},
               NLMK = {NLMK = "TQBR", NMZ2 = "SPBFUT"},
               MTSS = {MTSS = "TQBR", MTZ2 = "SPBFUT"},
               ROSN = {ROSN = "TQBR", RNZ2 = "SPBFUT"}}
    rows = {} -- Список строк в таблице по количеству тикеров
    oblig_t = AllocTable() -- Указатель на саму таблицу
    stopped = false -- Остановка скрипта
    
    -- Функция вызывается перед вызовом main
    function OnInit(path)
      AddColumn(oblig_t, 0, "Ticker_BA", true, QTABLE_STRING_TYPE, 8) -- "Ticker"- название первого столбца в таблице
      AddColumn(oblig_t, 1, "Lot_BA", true, QTABLE_INT_TYPE, 8) -- 
      AddColumn(oblig_t, 2, "Ask_BA", true, QTABLE_DOUBLE_TYPE, 10) -- 
      AddColumn(oblig_t, 3, "Ticker_F", true, QTABLE_STRING_TYPE, 10) -- 
      AddColumn(oblig_t, 4, "Lot_F", true, QTABLE_INT_TYPE, 8) -- 
      AddColumn(oblig_t, 5, "Bid_F", true, QTABLE_DOUBLE_TYPE, 10) -- 
      AddColumn(oblig_t, 6, "Day_EXP", true, QTABLE_INT_TYPE, 10) -- 
      AddColumn(oblig_t, 7, "Date_EXP", true, QTABLE_DATE_TYPE, 15) -- 
      AddColumn(oblig_t, 8, "Dohod%", true, QTABLE_DOUBLE_TYPE, 10) -- 
      AddColumn(oblig_t, 9, "Dohod", true, QTABLE_DOUBLE_TYPE, 10) -- 
    
      CreateWindow(oblig_t) -- Создание окна таблицы
      SetWindowCaption(oblig_t, "Синтетическая облигация") -- Даем название таблице
    
      for ticker, two in pairs(tickers) do -- Перебираем пары БА-Фьючерс
        rows[ticker] = InsertRow(oblig_t, -1) -- Заносим тикер в список строк
      end
    end
    
    function Run()
      for ticker, two in pairs(tickers) do -- Перебираем пары БА-Фьючерс
        ask_ba = 0.0
        bid_f = 0.0
        lot_f = 0
        for ticker_two, board in pairs(two) do -- Перебираем Тикеры внутри пары БА-Фьючерс
          if ticker == ticker_two then -- Если Тикер БА
            SetCell(oblig_t, rows[ticker], 0, ticker_two) -- Заполняем ячейке Тикера БА
            SetCell(oblig_t, rows[ticker], 1, -- Заполняем лот БА
                    string.format("%u", getParamEx (board, ticker_two, "LOTSIZE").param_value))
            ask_ba = getParamEx (board, ticker_two, "OFFER").param_value
            SetCell(oblig_t, rows[ticker], 2, string.format("%.2f", ask_ba)) -- Аск БА
          else -- Если Тикер фьючерса
            SetCell(oblig_t, rows[ticker], 3, ticker_two) -- Заполняем ячейку Тикера фьючерса
            lot_f = getParamEx (board, ticker_two, "LOTSIZE").param_value
            SetCell(oblig_t, rows[ticker], 4, string.format("%u", lot_f))
            bid_f = getParamEx (board, ticker_two, "BID").param_value
            SetCell(oblig_t, rows[ticker], 5, string.format("%u", bid_f))
            day_exp = getParamEx (board, ticker_two, "DAYS_TO_MAT_DATE").param_value
            SetCell(oblig_t, rows[ticker], 6, string.format("%u", day_exp))
            SetCell(oblig_t, rows[ticker], 7, 
                    string.format("%u", getParamEx (board, ticker_two, "MAT_DATE").param_value))
            --message('Дата:'..getParamEx (board, ticker_two, "MAT_DATE").param_type)
          end
        end
        sum_ba = ask_ba * lot_f
        --message('Тикер:'..ticker..' lot_f:'..lot_f..' sum_ba:'..sum_ba)
        sum_year = (bid_f - sum_ba) / day_exp * 365
        percent = sum_year * 100 / sum_ba
        SetCell(oblig_t, rows[ticker], 8, string.format("%.2f", percent))
        SetCell(oblig_t, rows[ticker], 9, string.format("%.2f", bid_f - sum_ba))
      end
    end
    
    -- Функция вызывается перед остановкой скрипта
    function OnStop(signal) stopped = true end
    
    -- Функция вызывается перед закрытием квика
    function OnClose() stopped = true end;
    
    -- Основная функция выполнения скрипта
    function main()
      while not stopped do 
        Run()
        sleep(10) 
      end
    end</code>


    Авто-репост. Читать в блоге >>>
  10. Аватар Rostislav Kudryashov
    Quik и QLua. Программируем без ошибок доступ к массивам
    Очень часто программирование для компьютера состоит из быстрого написания программы с ошибками и последующего длительного их выявления. Конечно, сократить второй этап помогает технология экстремального программирования (eXtreme Programming — XP).

    Но в QLua используется много системных таблиц-массивов и разных текстовых констант для именования полей в этих таблицах. Ручной набор такого текста в разных местах программы чреват  мелкими ошибками. Ещё хуже, что на запрос значения неправильно указанного поля Lua втихую выдаёт пустое значение nil. Ошибка в программе выскочит не в этот момент, а в любом месте, где затем потребуется это значение. И не всегда просто будет понять, откуда оно возникло.
    К тому же ошибка явно может и не выскочить, а просто увести разветвление счёта в неправильную сторону.

    Чтобы совместить при выполнении программы место выявления ошибки с местом её возникновения, следует заготовить константы для имён всех полей таблиц QLua. И разместить эти константы в отдельном модуле-таблице. Например, файл QuikConst(qc).lua такого модуля может иметь содержимое

    Авто-репост. Читать в блоге >>>
  11. Аватар Mezantrop
    Уведомления Квика на Lua
    Здравствуйте!
    Есть у кого открытый код стандартных уведомлений квика?
    Стандартного функционала мне мало, а скрещивать ужа с ежом ума не хватает. Вот и есть мысля переколхозить стандарные уведомления с нужным мне функционалом.
    Заранее благодарствую!
    P.S. Страничку стандартного кода не вижу смысла покупать. Окейгугл пока просто не нашел ее…

    Авто-репост. Читать в блоге >>>
  12. Аватар Eugene Unstoppable
    Создать таблицу с помощью Lua

    Здравствуйте. Возможно ли написать скрипт на Lua, который бы создавал таблицу со значениями индикатора ATR.
    Заголовками столбцов были бы даты(30 последних торговых сессий), заголовки строк — короткое наименование ТОП-20 фьючерсов по обороту.
    Нужно, чтобы в ячейках таблицы были значения ATR за n-ный день в таком-то фьючерсе.
    Спасибо.



    Авто-репост. Читать в блоге >>>
  13. Аватар Sergey Pavlov
    moex+quik+lua+candles
    Коллеги!
    Есть два варианта как получать данные в квике в рамках луа-скриптов.
    1. getCandlesByIndex
    2. CreateDataSource

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

    Второй вариант неудобен тем, что не всегда источники данных создаются, нужно выжидать тайм-ауты и всякое такое.

    Подскажите, какой из вариантов вы считаете наиболее правильным/оптимальным или какой используете сами?
    Если накидаете пример кода как это используете, буду премного благодарен!

    Авто-репост. Читать в блоге >>>
  14. Аватар Артур
    Пайтон и Луа
    Кто имеет опыт в программировании роботов на луа и пайтоне одновременно (речь про квик)?
    Какие плюсы/минусы можете указать при использовании того или иного языка.
    Стоит ли роботов, написанных на луа, переводить на пайтон?

    Авто-репост. Читать в блоге >>>
  15. Аватар Андрей
    Требуется помощь с плагином на Lua для QUIK (Брокер БКС)
    Всех привествую!
    Надеюсь у меня получится сделать плагин для удобства подсчета комиссии для БКС. 
    Итак, у БКС комиссия от количества контрактов за сутки на тарифе Трейдер.  
    Хочется сделать плагин, который сможет считать количество контрактов за сутки + оборот по срочке. 
    Ибо считать вручную как то не удобно..
    Или может у кого есть похожие наработки или плагин ? 
    Буду признателен за любую помощь) 

    Авто-репост. Читать в блоге >>>
  16. Аватар EASE
    Как подключиться к таблице состояние счета LUA, QUIK
    Как подключиться к  таблице состояние счета LUA, чтобы робот обращался или брал информацию из этой таблицы?

    Авто-репост. Читать в блоге >>>
  17. Аватар Сашка
    Индикатор спрос/предложение
    Подскажите, есть ли наглядные индикаторы в QIUIK для пар «общий спрос» — «общее предложение» и «кол-во лотов на покупку» — «кол-во лотов на продажу»? Возможно сторонние индикаторы на LUA для QUIK ?
    Спасибо.

    Авто-репост. Читать в блоге >>>
  18. Аватар EASE
    Дозакупка робот Lua
    Подскажите если название функции или где взять пример чтобы робот докупался, если к примеру цена идет не туда то покупает еще  .
    Заранее спасибо!

    Авто-репост. Читать в блоге >>>
  19. Аватар Vkt
    lua quik и сообщения брокера
    Скриптом на QLua есть какая-то возможность читать сообщения в Квике?
    Много нужного мимо проплывает, за всем не уследить.



    Авто-репост. Читать в блоге >>>
  20. Аватар kotopas
    Добрый день, подскажите пожалуйста с помощью какой функции можно получить цену приобретения (Балансовую цену) акции из "таблицы лимитов по бумагам". Может есть другой способ узнать стоимость?

    Авто-репост. Читать в блоге >>>
  21. Аватар Bringo
    Вопрос про QLua
    Здравствуйте. Подскажите, чтобы лучше писать на этом языке нужно ли сначала просто изучить сам язык Lua? Поделитесь советами

    Авто-репост. Читать в блоге >>>
  22. Аватар hedger
    Может кто-нибудь поделится файлами .dat котировок минуток из папки \archive для QUIK начиная с 16.09.2021 для нанесения на него метки сделок участников ЛЧИ?
    Хочу нанести с помощью скрипа smart-lab.ru/blog/754540.php на график и проанализировать сделки участников ЛЧИ 2021. Нужны полные (или почти) минутные котировки акций и фьючерсов начиная с 16.09.2021. У кого всегда отрыты минутные графики по инструменту, накопились котировки. Сам не копил. Котировки акций SBER есть.

    Примерные перечень акций(GAZP,SNGS,RUAL,TCSG,MTLR,RASP,AKRN,ROSN,ALRS,PHOR,TATN,GMKN,MTLRP,SNGSP,VTBR,LKOH,PIKK,VKCO,MAGN,NVTK,
    YNDX,SGZH,ABRD,MGNT,PLZL,OZON и другие ликвидные) и ликвидные фьючерсы.  Полезны будут хоть какие-нибудь котировки из этого списка или другие ликвидные инструменты.

    В ответ готов поделится отредактированным скрипом LUA smart-lab.ru/blog/754540.php, с помощью которого можно будет нанести метки сделок участника ЛЧИ (tatarina) на график этой акции.

    Авто-репост. Читать в блоге >>>
  23. Аватар Vkt
    Бен, это Данила. Бен, ай нид хелп! Колбеки пропали...
    У меня отдельный скрипт ведет полный реестр колбеков за день.
    OnOrder и OnTrade приходят,  OnTransReply нет.
    Раньше были. В чем может быть проблема? Первый раз такое. Может сталкивался кто?

    Авто-репост. Читать в блоге >>>
  24. Аватар die_forelle
    Market-On-Open заявка в QUIK Lua

    Привет, как в QUIK Lua сделать заявку Market-On-Open, чтобы получить покупку актива по цене открытия его основной сессии?

    Сейчас подаю просто рыночную заявку на премаркете до начала основной американской сессии, есть проблема в том, что цена покупки сильно не совпадает с реальной ценой открытия в момент исполнения сделки на открытии сессии (иногда даже открывает по цене выше максимума дня, на что мне брокер отвечает, что «в данный момент на данный объем была такая цена»).



    Авто-репост. Читать в блоге >>>
  25. Аватар Rostislav Kudryashov
    Усердие всё превозмогает... Где смысл? О выявлении крупных сделок
    В источнике smart-lab.ru/blog/760357.php код QLua и картинка из Quik'а.
    Возможно, смысл в том, чтобы отловить сделки крупных игроков. Но склеивание в одну «крупную сделку» всех обезличенных сделок одного направления, пришедших в одну миллисекунду или несколько подряд, вряд ли служит цели. Это заявки разных игроков. Ведь уловка китов, прибегающих к «Айсберг-заявкам», в том и состоит, чтобы расщепить свою крупную заявку во времени.
    Так что если кто хочет схватить такого кита за руку, может попробовать выявлять последовательности тиков одного объёма и направления через равные интервалы времени.
    Но!
    1) Точно ли  все «Айсберг-заявки» формируются равными объёмами и через равные интервалы времени? Это было бы довольно глупо.
    2) Даже если такая глупость существует, к любому тику с заявкой кита может прилепиться много заявок мелкоты. Это сильно затруднит выявление регулярных «Айсберг-заявок».
    3) Самые киты входят-выходят на рынке не одной «Айсберг-заявкой» и даже не в один день! А то и ещё и через день — по обстановке. Шансов опознать именно их заявки среди прочих — ноль.
    4) В самом ли деле так важно знать сделки крупных игроков? Крупняк никогда не проигрывает?

    NB Почему эти вопросы не пришли в голову никому из заинтересованных комментаторов?
    Включая торговый терминал, не забудьте включить голову.

    Авто-репост. Читать в блоге >>>
Чтобы купить акции, выберите надежного брокера: