Quik Lua

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

    Продолжаю изучать волшебный мир Луа в волшебном мире Квика и добрался до размещения скриптом заявок.
    На текущий момент есть такой скрипт (в общем виде).

    local SecCode = «LKU0»
    local Quantity=1

    function main()

    while stopped == false do


    local Quotes = getQuoteLevel2(«SPBFUT», SecCode)
    local Offer_Price = tonumber(Quotes.offer[1].price)
    local Offer_Vol = tonumber(Quotes.offer[1].quantity)

    --отправка формы заявки
    local LimitOrderBuy = { ххххх}

    --условие входа в лонг

    if Offer_Vol>10 then
    message(Order)
    local Order = sendTransaction(LimitOrderBuy)
    end

    sleep (200)
    end

    Смысл его такой: если количество лукойла в первой строке стакана больше 10, то покупается 1 бумага и работа скрипта завершается.
    Так как скрипт срабатывает при определенном условии, то для перезапуска используется while stopped == false do и sleep (200).
    Прикол в том, что при наступлении условия, скрипт начинает бомбить заявки по 1 шт  пока не кончаются деньги (виртуальные).

    Вопрос: какой размыкатель цикла можно тут использовать, чтобы после покупки 1 бумаги работа скрипта завершилась?

    На ресурсах есть getItem, битовые флаги и пр., но изложено это как-то непонятно.
    Помогите плиз..)
    ЗЫ: обещаю поставить лайк хорошим ответам )




    Авто-репост. Читать в блоге >>>
  2. QLua скринер. Обновление.
    Всем привет!
    В продолжение топика «QLua скринер в 10 строк кода. Или „за базар отвечаю“, можно качать обнулённый обновлённый скринер.
    Выглядит так в статике:
    QLua скринер. Обновление.
    А так в динамике.
    Если в прошлом скринере отображалось изменение текущей цены от цен закрытия за соответствующее количество торговых сессий (список „срезов“ задается пользователем), то в этом будет две таблицы. Первая таблица — изменение текущей цены от предыдущих хаев (чуть не оговорился...) за N-торговых сессий, вторая — от предыдущих лоёв.
    В первой таблице от минимумов выделена строка с длинными ОФЗ. Видно, что минимум цены за 30 торговых сессий был на прошлой сессии.
    А во второй таблице, мы видим, что Яндекс и Магнит обновили сегодня свои максимумы за последние 90 торговых сессий.
    Таким образом, техзадание (ТЗ) участника тусовки Weddy практически выполнено, остается доделать, как он просил, тот же функционал, только относительно списка заданных дат.

    Авто-репост. Читать в блоге >>>
  3. Вопрос 1 по Lua
    Всем привет!

    Начал изучать Lua для квика и сразу возник вопрос:
    К примеру, скрипт создает таблицу с интересующими параметрами по инструменту.
    В таблице новая строка создается командой InsertRow(#table ID, -1).
    После этого в нее добавляются параметры через команду setCell

    Если инструмент один, например, в таблице только Лукойл, то все работает без проблем.
    А как быть, если я хочу добавить несколько тикеров?

    Добавление еще раз InsertRow(#table ID, -1) создает новую строку, а копипаст «заполняющих» команд с параметрами другого тикера новую строку не заполняет...



    Авто-репост. Читать в блоге >>>
  4. QLua скринер в 10 строк кода. Или "за базар отвечаю".
    Всем привет!
    Никогда не давайте обещаний которые не можете выполнить. Во-первых — это портит карму. Во-вторых, за сказанное нужно отвечать. В далеких (не очень) 90-х, если человек не держал слова, к нему приезжали «санитары» с электроприборами, типа дрель, паяльник, утюг — все перечислять не буду, чтобы не пугать читателя, т.к. пост многие найдут полезным не только для торговли, но и для написания собственного кода. Так вот, пообещал я человеку, дело было так:
    QLua скринер в 10 строк кода. Или "за базар отвечаю".
    Мой родной язык, помимо русского, Common Lisp. С недавних пор породнился с Питоном. А тут луа, да еще с Квиком вперемешку. Не фиг было обещания давать. Больше времени потратил на изучение структур данных луа и особенностей QLua. Сам код был написан за пару часов, как увидите ниже — чё там писать-то...
    Как я обещал — пользователь Смартлаба Weddy получает код бесплатно, как и остальные участники тусовки. Ну а я, в качестве вознаграждения получаю приобретенный опыт. Проверял сегодня — работает с любым Квиком (6, 7, 8). Конечно дополнительных «наворотов» я не делал, как в идеале желал Weddy, но это уже детали.

    Авто-репост. Читать в блоге >>>
  5. Библиотека luacom для Quik 8.6 с Lua 5.3.5 свяжет с Excel'ом и с чем угодно через COM-интерфейс.
    На github.com/davidm/luacom/issues/24 указан адрес дистрибутива github.com/moteus/luacom

    Авто-репост. Читать в блоге >>>
  6. Может кто порекомендовать нормальный бесплатный скрипт для квика с горизонтальными объемами?

    Авто-репост. Читать в блоге >>>
  7. Индикатор для QUIK на LUA
    Добрый день.

    Ищу специалиста, который напишет индикатор для QUIK на LUA.
    Для обсуждения условий, прошу оставить контакты либо в личку, либо в этой теме.

    Также буду благодарен, если кого то рекомендуете или напишите специализированный ресурс.

    Авто-репост. Читать в блоге >>>
  8. Как я переехал на версию Quik 8.5 ничего не перекомпилируя и не переделывая в роботах. Лайфхак для нубов в программировании.
    Из за того, что у меня накрылся на прошлой неделе арендуемый физический сервер, я решил его проапгрейдить  заодно установить в ВТБ новый квик.
    В ВТБ  в частности постоянно прилетало сообщение, что надо устанавливать новый квик, что то там с нумерацией заявок на срочном рынке, а так же о том, что версия ЛУА, встроенного в квик, тоже проапгрейдится, и возможно скрипты работать не будут.

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

    Ну ладно, деваться некуда, тем более, что когда с сайта ВТБ качаешь дистрибутив квика, там сейчас безвариантивно доступна только версия 8.5

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

    Авто-репост. Читать в блоге >>>
  9. Алготрейдинг. Получение данных свечей средствами QLUA и запись их в .CSV

    Алготрейдинг. Получение данных свечей средствами QLUA

    Очень часто бывает необходимо получить данные последних N-свечей различного интервала инструмента торговли. К сожалению, в справке QLUA нет достаточно полных примеров кода работы получения данных. В скрипте приведён пример получения данных интервала М1 инструмента BRN0 в формате <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>. Данные пишутся в CSV формат.
    Почему просто не выводить по DDE график и обрабатывать его в чём-нибудь более приятном? Есть простые вещи, для которых нет необходимости в таких конструкциях (проанализировать резкое изменение объема, найти определенную формацию/комбинацию свечей, а затем вывести в quik сообщение).
    -------------------------------------------------------------------------------------------------------
    --- Функция получения результатов свечей в .CSV в виде:
    --- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>
    --- BRN0	1	20200605	200100	42.15	42.16	42.1	42.1	2150
    -------------------------------------------------------------------------------------------------------
    is_run=true
    
    -- Параметры
    tInstr="BRN0" --код инструмента/бумаги
    classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT
    iNterval=INTERVAL_M1 --таймфрейм
    -- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource
    -- пример INTERVAL_H1
    corrTime=3 --Время МСК. C сервера время приходит без корректировки.
    pFile="w:\\temp" --путь, где будет создаваться файл
    cBars=10 --сколько свечей надо вывести
    --настройка параметров
    
    function OnInit()
    	out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
    	is_run=(out_file~=nil)
    	ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных
    	ds:SetUpdateCallback(NewChartData) --обновление последних данных
    end
    
    function strText(int)
    	local m=tostring(int)
    	local mLen=string.len(int)
    
    	if mLen==1 then
    		Output="0" .. tostring(m)
    	else Output=m
    	end
    	return Output
    end
    
    function main()
    	while is_run do
    	local Size=ds:Size() --Получение количества всех свечей в источнике данных
    
    	if cBars>Size then
    		cBars=Size-1
    	end
    
    	for i=Size-cBars, Size, 1 do
    		local O=ds:O(i) -- Значение цена открытия свечи
    		local H=ds:H(i) -- Значение High для свечи
    		local L=ds:L(i) -- Значение Low для свечи
    		local C=ds:C(i) -- Значение Close для свечи
    		local V=ds:V(i) -- Значение Volume для свечи
    		local T=ds:T(i) -- Значение Time для свечи
    
    		sTime=os.time(T)
    		datetime=os.date("!*t",sTime)
    
    		--вывод в файл
    		out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n")
    		out_file:flush() --запись данных
    	end
    		out_file:close()
    		sleep(1000)   -- приостановка на 1 секунду
    		out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
    	end
    end
    


    Авто-репост. Читать в блоге >>>
  10. Измерение волатильности. Выбор индикатора.
    Иногда для ТС требуется измерение волатильности. Написал два индикатора, вначале простой, потом более сложный. Каждый из них имеет совершенно разные принципы работы, каждый имеет свои преимущества и недостатки. И, вот, сижу, чешу репу, и не могу выбрать.
    Смотрим рисунок:
    Измерение волатильности. Выбор индикатора.
    В более хорошем разрешении картинку можно посмотреть здесь.
    На разницу числовых показаний можно не обращать внимания, это вопрос калибровки.
    Все настройки индикаторов на картинке полностью идентичны.

    Те, у кого в Квик уже есть Lua 5.3.5 могут посмотреть индикаторы в своем терминале. Скачать скомпилированные индикаторы можно здесь.




    Авто-репост. Читать в блоге >>>
  11. Индикатор в LUA для Квик
    Добрый день.

    Решил написать индикатор на LUA. Подскажите, пожалуйста, есть ли уже стандартная функция (или куда можно посмотреть), которая, например, на 15 минутном графике получит данные свечки с дневки.

    Авто-репост. Читать в блоге >>>
  12. Quik 8.5.2.11, Lua 5.3.5. Первые впечатления.
    Quik, по сравнению с версией 8.2, стал несколько лучше. Меньше подвисает, но иногда бывает. Мелкие, наверно несущественные, изменения в интерфейсе — не сразу и заметил.
    Lua 5.3.5, по сравнению с Lua 3.1, летает. То, что исполнялось несколько секунд, теперь пролетает практически мгновенно. В программах Lua никаких изменений делать не пришлось, мною не использовались специфические для Lua 5.1 конструкции.
    Вот, DLL, цепляющиеся к Lua, все упали, в буквальном смысле. Пару дней разбирался, несколько изменился C-API, пришлось переделывать функции luaopen в DLL. Помогли ребята с http://quikluacsharp.ru/, если что — смотрите решение у них.
    В DLL, по идее, еще надо переделывать int на 64 бит целое (при компиляции куча алармов на эту тему), но, кроме номеров заявок в обозримом будущем, не обязательно. Кроме заявок-сделок, таких номеров в инструментах нет. Пока, по крайней мере.

    Авто-репост. Читать в блоге >>>
  13. КВИК-->Lua-->Python. Трансляция данных из КВИКа в Питон в реальном времени
    Всех с пятницей — самоизолятницей!
    Представляю общественности Python-сервер (в 9 строк кода) для получения данных из КВИКа в Питон через луа-скрипт в режиме реального времени.
    Для примера приведу получение тиковых данных по SIM0.
    Нам понадобятся следующие ингредиенты.
    1. Понятное дело КВИК, версии ниже 8 или 8.5.2 и выше.
    2. Питон Jupyter Notebook (Anaconda 3)
    3. Луа-скрипт, взятый из Jatotrader (в нем буквально изменено пару строк)
    Как работает сервер можно посмотреть в этом видео (1 мин. 38 сек.) Ну и по правилам хорошего тона, естественно сам текст ниже.


    Авто-репост. Читать в блоге >>>
  14. Замотала, эта Lua.
    Давненько я не брал в руки шашки не писал индикаторов на Lua. Вчера ближе к ночи приспичило перенести старый отработанный индикатор с Python в терминал на Lua-QLua.
    Взял, как водится, какой-то готовый, и начал его переделывать. Дел, в общем, немного, вместо одной линии нарисовать три, и оставив болванку везде поменять код. Python, в общем, похож на Lua (все языки программирования оч. похожи), а потому, берем код Python, в Notepad++ копипастим его в Lua индикатор, немного исправляем синтаксис, немного исправляем код под особенности индикаторов, и через 20 минут готово.
    Пытаемся добавить на график. Счас! Индикатор вообще не виден.
    Начинаем корежить код и танцевать с бубном. Че сделали, так и не поняли, но индикатор в меню настроек появился — победа! Но, не тут-то было. Однако, добавить не удается, тут же вылетает. Опять танцы с бубном.
    Теперь добавляется, но Quik наглухо виснет и падает. Но, зато начал писать ошибку — строка 86, там какой-то nil. Какой еще nil, там строка, типа, buff[i] = a*b[i]^2 + c*d[i]^2. Да, сколько можно? Откуда там nil? Бредятина какая-то.

    Авто-репост. Читать в блоге >>>
  15. Lua индикатор для Quik, Bollinger Bands %b Oscillator. Кому интересно....
    Кому интересно, переделал индикатор Bollinger Bands (ВВ.lua) под осциллятор Bollinger Bands  %B   

    В теме  https://smart-lab.ru/blog/623989.php



    Ниже копипаст как его интерпретировать:


    Как интерпретировать график индикатора

    По принципу своей работы индикатор %b – это моментум- осциллятор, сходный, например, со стохастиком. Однако есть и отличия: если у стохастического осциллятора цены колеблются в интервале от 1 до 100, то у нашего индикатора цена может и выходить за эти пределы, например, значение может быть 1,15 или -0,15, что означает- цена находится выше или ниже на 15% от ширины ленты. То, что формально интервал обозначен уровнями 0 и 1, не должно вас путать – это одно и то же, но умноженное на коэффициент 100.


    Но что означают, все эти нулевые или единичные уровни?

    Это означает, что если:

    • График на уровне=0, то цена находится на нижней границе полосы Боллинджера,
    • График на уровне=1, значит, цена на верхней границе,
    • График на уровне 0,5 – цена находится на скользящей средней,
    • График ниже уровня=0 означает, что произошел прорыв полосы в сторону падения,
    • График выше уровня=1 – прорыв полосы в сторону повышения.


    Авто-репост. Читать в блоге >>>
  16. Enter Trade 0.1 - Торговый привод для терминала Quik с открытым исходным кодом



    Авто-репост. Читать в блоге >>>
  17. Lua индикатор для Quik, Bollinger Bands %b Oscillator
    Доброго времени всем.
    Ищу Lua индикатор для Quik, Bollinger Bands %b (Bollinger Bands %BB Oscillator).  На MT4 есть в открытом виде. Возможно у кого-то уже есть переделанный в lua. Буду очень признателен в помощи его отыскать. Если не найду, придется переписывать самому в lua...(

    Авто-репост. Читать в блоге >>>
  18. Прошу написать простой индикатор
    Приветствую, сильно увлекся арбитражем, на данный момент прошу написать код простого индикатора на Lua, который просто будет считать разницу между по ценами 2-х инструментов.
    Например есть Сбербанк и Сбербанк преф.
    Нужно посчитать разницу между ценам закрытия свечей и вывести ее в виде графика.
    Условно цена закрытия бара на Сбер 190 руб, цена закрытия бара Себер преф 170 руб, соответственно на графике должен быть результат 20 руб.
    Соответственно эти расчеты могут уходить в минус, что означает, что условно цена Сбера стала меньше цены Сбера преф.
    Буду благодарен если воткнете вторую возможность выбора сравнения цен инструмента относительно изменения в %. Что бы можно было сравнить например Газпром и Лукойл. 

    Задача найти максимумы и минимумы в рублях за период по каждому бару.

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

    Авто-репост. Читать в блоге >>>
  19. Quik, DDE, Excel
    Напомню, что обмен по DDE придуман в далеком 1995 году, еще для Windows 3.1.  DDE считается сильно устаревшим методом обмена данными и практически не поддерживается современными приложениями. Остался один Quik, который цепляется за DDE из последних сил.
    Вывод по DDE в Excel еще и не удобен для обработки данных. Понадобилось мне, скажем, ввести дополнительно пару-тройку столбцов на опционную доску — в результате, в Excel все столбцы таблицы на листе сместятся, и всю адресацию ячеек листа Excel в программе надо будет переделывать заново.
    В MS Access также имеется DDE-сервер, и есть возможность заполнять таблицы БД по DDE, однако Quik c Access по DDE работать не умеет.
    В общем, решил, что экспорт таблицы из Quik по DDE надо запихнуть в таблицу базы данных (БД), и уже из БД программно работать с опционной доской. Что, кстати, гораздо удобней для любой таблицы Quik.
    Хотел было через Lua — вроде все просто, Lua с таблицами работает. Ан нет, к доске опционов Lua доступа не имеет.
    Наверное на С++ или C# связь по DDE надо делать.
    И подумалось, а может у Смартлабовцев есть такие уже готовые рабочие решения, чего велосипеды изобретать? По крайней мере, для DDE (никогда программно с ним не работал? djj,ot yt gh), а в БД я и сам запихну, и если нужно поделюсь решением — здесь нет никаких ноу-хау.
    Помогайте, граждане кто чем может.

    Авто-репост. Читать в блоге >>>
  20. Автозапуск QUIK QLUA
    Пожалуй, каждый, даже, самый ленивый программист на LUA презентовал свою версию для запуска QUIK.
    Пришла и моя очередь.
    Вчера, за небольшую благодарность, swerg перевёл w32.dll на LUA 5.3.
    Теперь есть поддержка QUIK 8.5 и выше.
    Скачать: http://pmntrade.ru/avtozapusk_quik_qlua/avtozapusk_quik_qlua.zip
    Страница программы: http://pmntrade.ru/avtozapusk_quik_qlua.html


    Авто-репост. Читать в блоге >>>
  21. Поделитесь роботом на Луа....плиз...
    Какое-то время были посты от благодетелей, которые предлагали выкладывать скрипты для создания роботов.

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

    Думаю, что многие бы сказали спасибо...




    Авто-репост. Читать в блоге >>>
  22. Опыт доработки QLua-скриптов для QUIK 8.5.2
    В новой версии терминала QUIK 8.5.2 произведён апгрейд языка Lua для написания торговых скриптов с версии 5.1 до версии 5.3. Это нужно для того, чтобы корректно обрабатывать 19-значные номера заявок и сделок на срочном рынке МосБиржи. Типа number в Lua 5.1 не подходит: там все числа хранятся как double, соответственно целые числа до 2^53 = 9 007 199 254 740 992 записываются без потери точности, а 19-значные номера заявок и сделок будут больше этой границы.

    Версия Lua 5.3 обратно несовместима с Lua 5.1. Я почти не использовал внешние библиотеки и для меня было два важных изменения: отказ от module (это было сделано в версии 5.2) и введение целочисленной арифметики (версия 5.3).

    Для избавления от использования module пришлось переработать много кода, хотя изменения были несложные. Приведу пример. Раньше был такой код Arrays.lua для работы с массивами:

    --
    -- Выполнение действий с массивами.
    --
    
    local pairs = pairs
    local type = type
    
    module(...)
    
    --- Создать копию массива (таблицы)
    -- @return копию массива (таблицы)
    function copy(array)
        local copy_array = {}
        if type(array) ~= "table" then
            return array
        end
        for k, v in pairs(array) do
            if type(v) == "table" then
                copy_array[k] = copy(v)
            else
                copy_array[k] = v
            end
        end
        return copy_array
    end
    
    --- Узнать, начинается ли индексация в массиве с нуля или с единицы.
    -- @return 0 или 1
    function base(array)
        if array[0] ~= nil then
            return 0
        else
            return 1
        end
    end
    
    --- Вычислить число элементов в массиве.
    -- @return число элементов в массиве
    function size(array)
        local n = 0
        for _, _ in pairs(array) do
            n = n + 1
        end
        return n
    end
    
    --- Проверить пустой или нет массив.
    -- @return true/false
    function isEmpty(array)
        for _, _ in pairs(array) do
            return false
        end
        return true
    end
    
    --- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1.
    -- @return первый индекс массива, где ничего не записано
    function firstEmptyIndex(array)
        local i = 1
        while array[i] ~= nil do
            i = i + 1
        end
        return i
    end


    Авто-репост. Читать в блоге >>>
  23. Робот для Квика на Луа.
    Здравствуйте. Нужен робот, тех.задание готово.  Робот без наворотов, простой, два индикатора +стандартный набор функций (стоп, трейл, выбор позиции и т.д). Цена фиксированная ( адекватная), по возможности-укажите Ваши ценовые предпочтения(почасовую оплату не предлагать). Все предложения в личку или на мыло.Спасибо.

    Авто-репост. Читать в блоге >>>
  24. Доброе утро.

    Подскажите пожалуйста, сам не понимаю что делать.

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

    Но при выводе переменной в график индикатора, показывает сразу не нулевое значение, там где операции не велись. Как будто, значение в начало расчетов было вставлено процессом из середины.

    Мне кажется тут проблема при работе с глобальными переменными из функции OnCalculate.
    Если вы знаете об этой проблеме, пожалуйста помогите ее решить.

    Овечкин Алексей
  25. Не компилится проект, для подключения для работы с Quik lua через dll.

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