Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар Rostislav Kudryashov
    Можно бесконечно долго смотреть на .. две вещи
    … как растёт рублёвое золото GLDRUB_TOM и серебро SLVRUB_TOM.
    Оказалось, что если с начала 2019 среднегодовой рост 20% и 23% соответственно, то с начала 2024 это уже 34% и 57% годовых. Серебро обгоняет золото.
    Я даже для удобства написал для Quik'а скрипт на Lua
    function OnInit (scriptPath)
      lu = require ("LuaUtil(lu)")
      ScriptDir, ScriptName = lu.SplitPath (scriptPath)
      DataPath = ScriptDir .. ScriptName ..".dat"
      message (DataPath)
    end -- OnInit()
    
    function dtToStr (dt)
      return type (dt) ~= "table" and "nil" or
        string.format ("%4d.%02d.%02d", dt.year, dt.month, dt.day)
    end
    
    function main()
      os.execute ("notepad.exe ".. DataPath)
      dofile (DataPath)
      DS, err = CreateDataSource (ClassCode, SecCode, INTERVAL_D1)
      if not DS then
        message ("err\n".. err)
        return
      end
      local ini, fin = 1, DS:Size()
      for i = 1, fin do
        local dt = dtToStr (DS:T(i))
        if dt >= IniDate then
          ini = i
          break
        end
      end
      local finPrice = DS:C(fin)
      local finDate  = DS:T(fin)
      local iniPrice = DS:C(ini)
      local iniDate  = DS:T(ini)
      local iniTime = os.


    Авто-репост. Читать в блоге >>>
  2. Аватар cryptonex
    Программисты Lua!
    Во- первых с праздником!
    Во-вторых, очень нужна помощь.

    Отправка из квика в телеграм канал оповещения.
    На Lua.
    На php знаю как а на луа опыта нет

    Авто-репост. Читать в блоге >>>
  3. Аватар Rostislav Kudryashov
    Эврика! Зачем кодировать сложно, когда можно просто
    До сих пор для ввода данных в скриптах Quik Lua я использовал библиотеку IUP. Довольно громоздкая процедура только для того, чтобы получить фиксированные значения переменных. Но если эти значения никак не опираются на внутренние таблицы Quik'а, для их ввода проще использовать вызов текстового редактора. Например вот так

    local dp = glb_ScriptDir… glb_ScriptName ..".dat"
    os.execute («start /w /b notepad »… dp)
    dofile (dp) — Data

    ...
    Эврика! Зачем кодировать сложно, когда можно просто
    Сначала редактируем значения переменных скрипта, затем загружаем их в память.

    Авто-репост. Читать в блоге >>>
  4. Аватар econopulse
    Инвестору: Структурируйте свой портфель с помощью нового Lua-скрипта для QUIK
    Инвестору: Структурируйте свой портфель с помощью нового Lua-скрипта для QUIK

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



    Авто-репост. Читать в блоге >>>
  5. Аватар Gambler <osaengine.ru>
    Создание Торговых Стратегий с Помощью ИИ: Легче, Чем Печь Блины
    Алгоритм субботняшний

    1) Зайти на chatgpt.com/

    2) Написать вопрос

    Создание Торговых Стратегий с Помощью ИИ: Легче, Чем Печь Блины

    3) Получить ответ

    -- Настройки
    SEC_CODE = "SBER" -- Код инструмента
    CLASS_CODE = "TQBR" -- Код класса инструмента
    SHORT_MA_PERIOD = 10 -- Период короткой скользящей средней
    LONG_MA_PERIOD = 50 -- Период длинной скользящей средней
    QTY = 1 -- Количество лотов
    
    -- Переменные
    short_ma = {}
    long_ma = {}
    prices = {}
    position = 0 -- Текущая позиция: 0 - нет позиции, 1 - лонг, -1 - шорт
    
    -- Функция для расчета скользящей средней
    function calculate_ma(prices, period)
        local sum = 0
        for i = #prices-period+1, #prices do
            sum = sum + prices[i]
        end
        return sum / period
    end
    
    -- Функция для обработки новых тиков
    function OnAllTrade(alltrade)
        if alltrade.sec_code == SEC_CODE and alltrade.class_code == CLASS_CODE then
            table.insert(prices, alltrade.price)
            if #prices >= LONG_MA_PERIOD then
                table.insert(short_ma, calculate_ma(prices, SHORT_MA_PERIOD))
                table.


    Авто-репост. Читать в блоге >>>
  6. Аватар econopulse
    Автоматизированная тепловая карта рынка: скрипт Lua для QUIK
    Данный скрипт, разработанный на языке программирования Lua для терминала QUIK, представляет собой тепловую карту рынка российских акций. Основные функциональные возможности программы:
     
    1. Сортировка данных:

    — По временному интервалу

    — По алфавиту
    — По процентному изменению от предыдущего закрытия свечи на выбранном интервале
    Автоматизированная тепловая карта рынка: скрипт Lua для QUIK


        — По капитализации компании



    Авто-репост. Читать в блоге >>>
  7. Аватар evg_gen +100(100)
    QUIK lua помощь нужна
    можно ли в lua прописать сортировку в таблице?
    скажем мне нужны ТОЛЬКО заявки по покупкам, и если несколько покупок по одной бумаге, то отсортировать и их?

    Авто-репост. Читать в блоге >>>
  8. Аватар Алексей Греднев
    Добрый вечер. Кто-нибудь может мне дать ссылку на пример qlua скрипта для Квик с работой советника с индикатором Fractals. github.com/OlegBirykov/ParabolicSAR/blob/master/library.lua — здесь я нашёл интересный пример на Parabloic SAR и RSI
  9. Аватар Rostislav Kudryashov
    Скрипты Lua в Quik'е могут строить свою доску опционов - как от Мосбиржи
    В скриптах напрямую доступны все данные Quik'а, кроме греков с доски опционов. Но есть возможность рассчитывать их по формуле Блэка-Шоулза, исходя из доступных значений базы, страйка, дюрации и волатильности.
    Чтобы удостовериться в совпадении греков с доски и расчётных, пришлось в скрипте отваять на Lua C API сервер DDE для приёма экспорта от доски опционов. И вот картинка
    Скрипты Lua в Quik'е могут строить свою доску опционов - как от Мосбиржи
    Разница в самом главном Греке — Дельте — менее 1%.
    Через Lua в Quik'е доступны все возможности Windows.
    local Titles, Entries, Desk = {}, {}, {}
    local Wn1_Hndl
    local Wn1_Field1, Wn1_Field2, Wn1_Field3, Wn1_Field4, Wn1_Field5
       = "Код CALL", "Страйк", "Дельта CALL", "Дельта расч", "Теор. расч"
       
    function OnInit (scriptPath)
      qu = require ("QuikUtil(qu)") -- qc, lu, tu
      blk = require ("BlackScholes(blk)")
      glb_ScriptDir, glb_ScriptName = lu.SplitPath (scriptPath)
      message (glb_ScriptName .." started")
      server = require ("OptionDesk")
    end -- OnInit()
    
    function OnStop (signal)
      if Wn1_Hndl then DestroyTable (Wn1_Hndl) end
      StopFlag = true
      return 1000 -- 1 sec
    end
    
    local function ShowWin (cols)
      for k = 1, #Desk do
        local calCode = Desk[k][Entries[Wn1_Field1]]
        if calCode:sub (3,3) == "0" then
          calCode = calCode:sub (1,2) .


    Авто-репост. Читать в блоге >>>
  10. Аватар alfacentavra
    Qlua: работа со сделками, позициями и денежными лимитами. Часть 2.

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

    Для анализа состава портфеля, лимитов и их динамики используются таблицы:

    Клиентский портфель (получаем данные через getPortfolioInfo и getPortfolioInfoEx).
    Позиции по деньгам (getMoney и getMoneyEx, money_limits).
    Позиции по инструментам (getDepo, getDepoEx, depo_limits).
    Ограничения по клиентским счетам (futures_client_limits).
    Позиции по клиентским счетам (futures_client_holding).

    Таблица «Клиентский портфель» даёт сводную информацию по лимитам и параметрам риска брокерского счета. Таблицы «Позиции по деньгам» (лимиты) и «Позиции инструментам» (ценные бумаги) показывают данные в разрезе фондового рынка. Таблицы «Ограничения по клиентским счетам» (лимиты) и «Позиции по клиентским счетам» (фьючерсы и опционы) – только про срочному рынку.



    Авто-репост. Читать в блоге >>>
  11. Аватар Rostislav Kudryashov
    Доска опционов Quik'а пробита через Lua скрипт!
    Эта доска — единственное, к чему нет прямого доступа из скрипта. Пришлось мастерить DLL с помощью Lua C API.
    Для чего она мне нужна в скрипте, пока не знаю. Но интересно будет посмотреть, насколько различается  дельта по Блэку-Шоулзу от дельты на доске.
    Ещё осталась заковыка, что вывод в скрипт с доски по DDE зависает на кнопке «Остановить вывод». Нормально остановить можно только через кнопку «Отменить» и затем «Остановить» в диалоге «Доступные скрипты».
    В чём тут засада?

    Авто-репост. Читать в блоге >>>
  12. Аватар alfacentavra
    Qlua: статус файла.
    Иногда бывает необходимо учесть в программе, что файл с которым собираетесь работать отсутствует, занят другой программой или пуст.

    Для проверки наличия файла я использую функцию, которую сам когда-то нашел в сети, она возвращает размер файла в байтах, если файл существует и nil если не найдет его.

    Qlua: статус файла.

    Проверить занят ли файл, а также проверить что он не пустой можно следующей функцией:


    Авто-репост. Читать в блоге >>>
  13. Аватар alfacentavra
    Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.

    Функция OnTrade
    Сохранение параметров сделки в файл.
    Работа с таблицей сделок.
    Сохранение всех сделок дня.
    Скрипт автосохранения всех заявок и сделок под завершение торгового дня.

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

    В файле QLUA.chm в директории терминала находим через поиск описание самой функции:

    Qlua: работа со сделками, позициями и денежными лимитами. Часть 1.
    И таблицу с параметрами:



    Авто-репост. Читать в блоге >>>
  14. Аватар George Martin
    Добавление индикаторов в Qucik в Lua script. Ну типа помощь нужна )
    Камрады, добрый день или что еще существует в вашей реальности)) Вопросом озадачен я, как сделать так чтобы грааль волшебный в Lua, индикатор тобишь, был помещен в сосуд волшебный, т.е. Quick, при том что изначально чародей создал заклятье в Pine script(e)? Поскольку разумом и знанием слегка я обделен, спросил я нейросеть, что знает все на свете, могла б ли ты помочь мне в этом и перевести заклятье? В итоге получив два разных варианта перевода, естественно от разных сеток, я переправил это мудрецам из круга своего знакомых… Те были несказанно в думе, мгогозначительно сказав, что нет прямого перевода Пина в Луа, что сети явно мне солгали, при этом взяв на изученье сей манускрипт сетей. Однако зная лет 15, что на ресурсе шмартлабру, издревля существуют создатели кодов, а также продавцы порожняка, решил я сделать сие повествование, в надежде помощи и кооперации, а также безусловно предложений алчных от неких тайных колдунов ))) последние конечно алтын с меня стянуть не смогут...)))
    Кароче, товарищи кодеры, кто прям на раз два с луа и добавлял в квика свои творения не раз, подсобите прикрутить или быть может дать какие то материалы наводки, что кенты мои смогли допилить. п.с. там очень хорошая штука. аналоговнет))  

    Авто-репост. Читать в блоге >>>
  15. Аватар oldLa3o
    здравствуйте, Может кто знает как называется поле «значение» в таблице текущих торгов? Хотелось бы получать значение индексов мосбиржи из та...

    oldLa3o, сам решил проблему, все поля таеблицы текущих торгов описаны тут:-- quikluacsharp.ru/quik-qlua/poluchenie-dannyh-iz-tablits-quik-v-qlua-lua/
  16. Аватар oldLa3o
    здравствуйте, Может кто знает как называется поле «значение» в таблице текущих торгов? Хотелось бы получать значение индексов мосбиржи из таб. текущих торгов, а не из графиков. Как нибудь так:
    ИндексМосбиржи=getParamEx(«RTSIDX», «IMOEX», «FACE_VALUE»). Скачал скрипт all_entitis.lua, но не вышло. Спасибо Альфк центавре, хороший курс
  17. Аватар Никто
    Квик луа почему не обсуждают
    Вот лично пишу что то там. Сам не знаю зачем, но положительных эмоций больше. Это как совет как время коротать унылое, путина пережить, глянуть что будет хоть одним глазком. Опять таки тема о общения. То текущие торги пытался налить, не нашел, теперь историю. А что удобно, в квике данные есть, в выходные можно их вертеть так и эдак, А что делать в выходные, есть идеи получше?

    Авто-репост. Читать в блоге >>>
  18. Аватар Егор Фещенко
    getMoneyEx выдает ошибку nill, все параметры беру с таблицы состояния счета

    Всем привет, только учусь работать с QUIK и LUA, возникла проблема с выводом баланса.

    Вот скрипт:

    function main()
    Firm_ID = «MC0139600000»
    client_code = «4105TE2»
    moneyRu = getMoneyEx(Firm_ID, client_code, «EQTV», «SUR»,0)
    TradeBalance = moneyRu.currentbal/2
    message('Баланс RUB = '..moneyRu.currentbal)
      if(FakeBalance>0)
     then
     message('Баланс RUB = '..moneyRu.currentbal)
     else
      message('Баланс для покупки = '..TradeBalance)
      end
    end

    Выдает ошибку attempt to index a nil value (global 'moneyRu')

    Буду очень благодарен если кто-нибудь подскажет в чем проблема.



    Авто-репост. Читать в блоге >>>
  19. Аватар Врач-бондиатОр
    Появился ли доступ Lua к доске опционов?
    А то экспорт через ДДЕ относительно удобен при работе только с одним инструментом

    Авто-репост. Читать в блоге >>>
  20. Аватар alfacentavra
    Qlua: работа с заявками (часть 3).

    Сегодня завершаем работу с заявками:

    Функция OnTransReply
    Функция OnOrder
    Получение остатка по заявке, контроль исполнения полного объема
    Таблица транзакций
    Общая логика выставления лимитной заявки в стакане

    В предыдущих примерах мы закладывали на обработку заявки небольшой таймаут (в пределах от 300 мс до 1 секунды), но правильнее отслеживать результат по коллбэкам, т.к. это время может быть и менее 300 мс, а может затянуться (по разным причинам) на секунды. Поможет нам в этом отслеживании функции обратного вызова OnTransReplyиOnOrder.

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

    Функция OnTransReply возвращает ответ на транзакцию, выставленную средствами qlua.



    Авто-репост. Читать в блоге >>>
  21. Аватар alfacentavra
    Qlua: работа с заявками (часть 2).

    Сегодня:

    Узнаем общее количество заявок
    Функции getNumberOf и getItem
    Как пройтись циклом по всем заявкам
    Вывод активных заявок
    Снять скриптом заявку
    Снимаем все активные заявки скриптом
    Снимаем только заявки, выставленные конкретным скриптом


    В прошлый раз мы научились
    выставлять скриптом заявки в терминале, теперь можем поработать с ними.
    Выставим скриптом 5 заявок на покупку и продажу от лучших цен
    BIDи OFFERстакана заявок с шагом в 0,01.

     

    Напишем функцию, которая будет выдавать нам необходимые цены (лучшую цену спроса и предложения) со стакана:

    Qlua: работа с заявками (часть 2).

    И возвращать -1, если предложения или покупки в стакане не найдены (стакан закрыт, либо нет торгов).

    Тогда основной алгоритм в main будет выглядеть:



    Авто-репост. Читать в блоге >>>
  22. Аватар alfacentavra
    Qlua: работа с заявками (часть 1).

    Зачем нужен демо терминал?
    Где открыть демо квик?
    Выставление заявки в торговом терминале через скрипт.
    Делаем функцию выставления заявки по требуемым условиям
    Карман заявок и tri-файлы
    Параметры для заявок с примерами по разным рынкам

    Почему важно начинать работу с заявками на qlua с демо терминала?

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

    Достаточно, например, прописать в



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

    Сегодня:

    Работа с биржевым стаканом через getQuoteLevel2
    Особенность нумерации в стакане заявок терминала квик
    Работа через функцию обратного вызова OnQuote
    Примеры работы со стаканом из скрипта
    Сравнение реализации одной алгоритма через разные функции

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

    Работать с биржевым стаканом можно через getQuoteLevel2 и функцию обратного вызова OnQuote.

    Функция getQuoteLevel2 возвращает 2 массива котировок (bid и offer) и 2 значения: количество бидов в стакане (bid_count) и количество офферов (offer_count). Чтобы нам не было скучно разработчики терминала решили последних 2 параметра передавать в виде строки, поэтому при работе их нужно перевести в числа (через tonumber).

    Массивы bid и offer содержат цены (price) и количество (quantity) по каждому уровню заявок стакана. Их также нужно будет предварительно перевести в число.



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

    Сегодня:

    Добавляем статистику по акциям роста и падения.
    Составляем TOP лидеров роста и падения.
    Быстрый поиск акций по тикеру в терминале.

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

    Напомню, что скринер выводил по тикерам акции, которые торгуются на Московской Бирже (за минусом бумаг с нулевыми объемами), и по ним через каждые 10 секунд проверял значение LASTCHANGE (% роста/снижения к закрытию прошлого дня) через getParamEx.

    В первичной итерации скринер выглядел следующим образом:

    Qlua: дополняем скринер акций статистикой, лидерами роста и падения.

    Логично продолжить изменения скрипта и сделать расчеты, которые напрашивались, глядя на сам скринер: подсчитаем сколько бумаг торгуется в плюсе, сколько в «красной зоне». Также можно рассчитать средний процент роста/снижения всего по списку, плюс отдельно по растущим бумагам, отдельно по падающим.



    Авто-репост. Читать в блоге >>>
  25. Аватар alfacentavra
    Qlua: работа с лентой всех сделок (часть 2).

    Сегодня завершаем работу с лентой всех сделок:

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

    Начало: https://smart-lab.ru/blog/935919.php


    Еще раз про отличия ленты всех сделок и биржевого стакана – некоторые заявки могут исполняться очень быстро, их можно просто не заметить в стакане, но они точно отразятся в ленте. Какие-то заявки и движения в стакане могут быть для создания видимости крупных игроков, при этом они могут как отменяться как только цена начинает приближаться, так и очень оперативно переставляться. Лента сделок покажет реальную картину: какие объемы и по каким ценам прошли, какие проходят в текущем моменте.

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



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