Quik Lua

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

    Собираюсь пока поторговать его руками, чтобы окончательно убедиться в его работоспособности и потому, что еще не программировал на Lua вообще и для «квика» в частности.

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

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

    Выручка от торгов BTC/USD с осени 2016 года:

    Тестирую алгоритм



    Фьючерс S&P500 с начала 2015 года, когда он стоил 2055 пунктов:

    Тестирую алгоритм



    Авто-репост. Читать в блоге >>>
  2. Аватар McDuck
    У кого есть Lua .
    Здравствуйте народ. Хотел спросить может у кого есть Lua скрипт работающий по пересечению индикатором нулевой зоны гистограммой, который можно подключить через идентификатор в QUIK.  Либо чтобы открывались сделки по данным скрипта qpl по перевесу (дельте) оборота сделок. Скрипт прилагаю, в нем подсчитывается объем.  
    Написание скрипта тоже рассмотрю, пишите в личку.  
    PORTFOLIO_EX LUK;
    DESCRIPTION Объёмы купли/продажи за интервал;
    CLIENTS_LIST ALL_CLIENTS;
    FIRMS_LIST FIRMID;
    
    PROGRAM
    
    'Автор:  Михаил Булычев
    'Что делает:
    '   подсчитывается объёмы купли\продажи по определённому инструменту за 
    '   заданный интервал   
    'Как использовать:
    '  В следующих строках следует указать код бумаги и код класса для 
    '  отслеживаемого инструмента
    
    '=============================НАСТРОЙКИ===============================
    SecCode="LKOH" '  Код инструмента
    ClassCode="TQBR" 'Код класса
    interv=3600 'является интервалом в секундах
    razn = 0 'смещение часового пояса относительно времени торговой системы. 
    '=============================НАСТРОЙКИ===============================
    
    
    FUNC is_in_interval(interval, trade_time, sys_time, hour_shift)
      csys_time_value=0
      c_time_value=0
      csys_time_value =0 + (0 + get_value(sys_time, "Hour") + hour_shift)*3600 + _
                        get_value(sys_time, "Min")*60 + _
                        get_value(sys_time, "Sec")
      c_time_value=0 + ((0 + substr("" & trade_time, 0, 2)) * 3600) + ((0 + substr("" & trade_time, 2, 2)) * 60) + ((0 + substr("" & trade_time, 4, 2)))
    
    csys_time_value = csys_time_value + 0
    c_time_value = c_time_value + 0
    
    k=csys_time_value - c_time_value
    
    if k <= interval
        result=1
      else
        result=0
      end if
    END FUNC
    
      buy_value=0
      sell_value=0
      total_value=0
      sys_time = GET_DATETIME()
      delete_all_items() 
      mString=create_map()
      
    
    
      j=0
      n=get_number_of("ALL_TRADES")
      for i from 0 to n
        mTrade=get_item("ALL_TRADES", n-i)
        trade_time=get_value(mTrade, "TIME")
        if (get_value(mTrade, "SECCODE")= SecCode) AND (get_value(mTrade, "CLASSCODE")= ClassCode)
          if is_in_interval(interv, trade_time, sys_time, 0-razn) = 1
            value=0+get_value(mTrade, "VALUE")
            j=j+1
            if (get_value(mTrade, "OPERATION") = "BUY")
              buy_value=buy_value+value    
            else
              sell_value=sell_value+value      
            end if
            total_value=total_value+value
          else
            break
          end if
        end if    
      end for
      mString=set_value(mString, "vol", total_value)
      mString=set_value(mString, "volbuy", buy_value)
      mString=set_value(mString, "volsell", sell_value)
      add_item(1, mString)
    END_PROGRAM
    
    PARAMETER vol;
    PARAMETER_TITLE vol;
    PARAMETER_DESCRIPTION Купили;
    PARAMETER_TYPE NUMERIC(10,0);
    END
    PARAMETER volbuy;
    PARAMETER_TITLE volbuy;
    PARAMETER_DESCRIPTION Купили;
    PARAMETER_TYPE NUMERIC(10,0);
    END
    PARAMETER volsell;
    PARAMETER_TITLE volsell;
    PARAMETER_DESCRIPTION Продали;
    PARAMETER_TYPE NUMERIC(10,0);
    END
    END_PORTFOLIO_EX
    


    Авто-репост. Читать в блоге >>>
  3. Аватар Андрей Иванов
    QUIK 8.5 важно для алготрейдеров на Lua
    Вышел QUIK 8.5 качаем и тестируем тут ftp://ftp.quik.ru/public/updates/8.5/quik_8.5.1_upd.zip

    Ключевое это поддержка идентификатора заявок и сделок 19 десятичных знаков+переход на Lua 5.3.5 x64

    Отличия Lua 5.1(5.2) от 5.3 можно глянуть например тут http://antirek.github.io/luabook/incompatibility.htm

    Подробнее про необходимость перехода и кому переходить тут https://forum.quik.ru/forum1/topic5117/

    С 25 мая на бирже будет переход на идентификатор заявок 19 знаков, поэтому из Lua нельзя будет работать с заявками на срочном рынке.

    P/S Модератор перенеси в раздел алготрейдинг

    Возможности новой версии
    1. Реализован функционал быстрого фильтра в таблицах. Для активации \ деактивации быстрого фильтра используется пункт «Включить быстрый фильтр» \ «Выключить быстрый фильтр» контекстного меню, открываемого для заголовка самого левого столбца таблицы. Данный функционал позволяет фильтровать информацию в таблицах QUIK с наглядным отображением критериев фильтрации.



    Авто-репост. Читать в блоге >>>
  4. Аватар Kot_Begemot
    Open Source : Lua - MatLab Connector (3)


    Краткое описание :

    Библиотека Matlab2Lua  позволяет интегрировать Lua скрипты и Маtrix Laboratory Engine.


    Полное описание :

    Библиотека позволяет Lua и Матлаб обмениваться данными при помощи функций :

    lua variable = Get( string Matlab varname );  — получение переменной из среды матлаб по имени, поддерживаются Double Array, Cell Array of Strings, Double Value, Integer Value, String Value. Возвращает -1 в случае неудачи.

    int Eval ( string MatlabСommand ) — передает команду в MatLab Command Line, в качестве переменной типа string; возвращает -1 в случае неудачи, и 1 в случае успеха.

    int PutVal( string Name, string/number Value) — передает в Матлаб значение Value типа string или number под именем Name. 1- успех, -1 — неудача.

    int PutDouble( string Name, table T) — передает в Матлаб под именем Name таблицу Луа, заполненную численными значениями. Ответ — аналогичный.

    int PutCell( string Name, table T)  — передает в Матлаб под именем Name таблицу Луа, заполненную строковыми или численными значениями, подлежащими преобразованию в строки. Ответ — аналогичный.


    Авто-репост. Читать в блоге >>>
  5. Аватар Kot_Begemot
    Интеграция Lua и С++ (2)

    Обмен данными между Lua и Сpp осуществляется через Lua-стэк, то есть через специальным образом структурированное (по принципу Last In — First Out) пространство. 


    Интеграция Lua и С++ (2)

    Иллюстрация процесса добавления переменных в Cтэк (Push) и извлечения переменных из Стэка (Pop).

    Иными словами, Lua стэк — это одномерный массив переменных (список, строка) с прямой (от 1 до n) индексацией.



    Заполняется стэк командами lua_push (С-side) :

    void lua_pushnumber (lua_State *L, lua_Number n);
    
    const char *lua_pushstring (lua_State *L,  const char *s);
    

    и другими. 


    Новой переменной в стэке Луа длинной n автоматически присваивается индекс [n+1] или [-1], где n+1 — абсолютный индекс переменной, а -1 — индекс новой переменной относительно конца (!) стэка. 




    Доступ, к переменным, соответственно осуществляется функциями lua_to (C-side) :

    lua_Number lua_tonumber (lua_State *L, int index);
    
    const char *lua_tostring (lua_State *L, int index);
    
    где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.

    Авто-репост. Читать в блоге >>>
  6. Аватар _sk_
    QLua: таблица крупных "склеенных" обезличенных сделок
    Иногда хочется наблюдать за ситуациями, когда участники торгов исполняют по рынку крупные заявки. Конечно, можно смотреть на обычную ленту обезличенных сделок с настроенными фильтрами на размер сделки, но ведь можно написать специальный QLua-скрипт, который будет отбирать сделки, являющиеся результатом исполнения.

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

    Если суммарный объём не менее какой-то границы, которую можно задать для каждого инструмента индивидуально, такие «склеенные» сделки выводятся в таблице. В ней указаны:
    — суммарный объём;
    — количество обезличенных сделок, которые были склеены;
    — начальная цена и конечная цена;

    Авто-репост. Читать в блоге >>>
  7. Аватар _sk_
    QLua: формирование свечных данных для робота
    Поделюсь своим опытом, который может быть полезен начинающим алготрейдерам, пишущим своего робота на QLua.

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

    Пример 1. Мы торгуем акции на 30-минутках и при этом не хотим учитывать свечу, которая получается в 9:30 из-за аукциона открытия, и не хотим, чтобы аукцион закрытия портил последнюю свечу дня в 18:30. Хотим только нужные свечи в одном массиве.

    Пример 2. Мы торгуем фьючерсы только в дневную сессию, а вечернюю сессию выбрасываем, поскольку наша стратегия в этом случае даёт более приличный график эквити. Хочется иметь «отфильтрованный» свечной ряд.

    Пример 3. Мы торгуем американские акции на Санкт-Петербургской бирже и хотим, чтобы время свечей было как в Америке, а не как на бирже, и хотим оставить только основные торги с 9:30 до 16:00 по буржуйскому времени.

    Авто-репост. Читать в блоге >>>
  8. Аватар Ур Урычь
    Здравствуйте, кто нибудь может мне скинуть простой работающий скрипт на LUA для акций, пытаюсь разобраться с LUA нужен скрипт работающий для примера, покупка продажа отслеживания цены.

    Авто-репост. Читать в блоге >>>
  9. Аватар 3Qu
    Смена x86 Quik 7.27.2.1 на x64 Quik 8.4.1.6. Пляски вокруг DLL.

    Признаться уже достал этот 32-битный Quik 7. Работать стало почти невозможно, начал подвисать практически на пустом месте. А если повесить на Quik Lua, а к Lua прицепить DLL, то вообще все эпизодически вставало. DLL-ки, вообще-то, многопоточные и освобождают вызывающие потоки (события) Lua практически за миллисекунды, но если таких событий много Quik встает. Хотя, он и без Lua и DLL тоже регулярно встает.)

    Были и другие причины ухода от 32-бит Quik, но это уже связано с брокером.
    Итак, новый брокер — новый 64-битный Quik 8.4.1.6. Наконец сбылась мечта идиота!
    Что можно сказать, — х64 Quik работает гораздо лучше, все равно временами немного подвисает, но, вроде, некритично. После логин-пароля, прежде чем работать надо подождать, — потоки обезличенных сделок начинают работать только через 3-4 минуты после старта. В общем, с этим все более-менее ОК.
    Следующий этап — надо переводить весь софт с х86 на х64, и если есть исходники, то никаких проблем не должно появиться. Если вы не используете в своем софте каких либо дополнительных DLL, то все должно ограничиваться двумя действиями.
    1. Меняете в проекте С++ в разделе Файлы ресурсов 32-битную версию файла Lua5.1.lib на 64-битную версию Lua5.1.lib,
    2. Выставляете в свой свойствах проекта компиляцию в x64. Можно даже так:



    Авто-репост. Читать в блоге >>>
  10. Аватар 3Qu
    Почему я не продолжаю тему "Quik->Lua->C++ DLL".
    Посмотрите на тематику сайта последние 2-3 недели — коронавирус, кризис — уже наступил, или еще только собирается, покупать или продавать, обсуждение падения, от все пропала до мы еще о-го-го, и счас как отскочим в небеса.
    До каких-то Lua, DLL и автоторговли сейчас нет никому никакого дела. Кто сейчас это будет читать, когда и в более спокойные времена читали лишь немногие. Писать просто так не хочется, писать для себя — мне это тоже не нужно.
    В общем, решил подождать с этой темой до лучших, более спокойных, времен. А там посмотрим, м.б. высохнет, и само отвалится.

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

    Есть ли на свете руководства или адекватные форумы по которым можно было научиться писать несложных роботов на Lua?

    Логика работы робота проста: если А больше В, то купить маркетом или лимиткой.

    Есть сайт https://oojoo.ru/, но он единственный что я нашел...



    Авто-репост. Читать в блоге >>>
  12. Аватар Дмитрий К
    Как экспортировать данные из квика через сокеты - ответ и тут же вопрос
    Последние несколько месяцев время от времени начинал времени ломать голову над одной задачкой.
    Суть в следующем.
    Я сделал скрипт на питоне, на основе торговых данных пишет заявки в tri файл квиковский.
    Чтоб заявку создать нужно принять решение на основе каких то данных из таблиц квика (например исполнилась какая то ранняя заявка, или банально цена дошла до нужного уровня, и т.п.)
    Данные из таблиц квика, как известно, встроенными методами можно экспортировать через ДДЕ сервер, или в базы данных через ODBC.
    То есть — для этого не надо обладать знаниями по программированию, это простые, очевидные способы, доступные всем, у кого установлен квик.
    Я выбрал способ по ODBC, и пользуюсь им.
    Связка работает стабильно, ничего не рушится, правда пару раз за несколько месяцев зависал сам квик из за того, что кончалась оперативная память (сервер слабенький у меня).

    Но у такой связки есть слабое место, приходится в питоне запускать таймер, по кjторому питон опрашивает базу данных.

    Авто-репост. Читать в блоге >>>
  13. Аватар Rostislav Kudryashov
    Все ли знают, что в Quik'е у каждого скрипта main() свой отдельный Windows-поток (thread)?
    Пишу потому, что к большому моему удивлению открыл, что весьма активные писатели Смарт-лаба этого не знают. В главном потоке программы Quik работают только функции обратного вызова типа OnTransReply, OnTrade и индикаторы. Кстати, OnTrade срабатывает не только по заявкам из скрипта, но и поданным интерактивно.

    Дело обработчиков событий не обрабатывать, но регистрировать их.
    Неверные представления о потоках в Quik'е вынуждают этих писателей городить абсурдный обмен данными между Quik'ом и внешними приложениями. Тогда как вся информация по событиям может быть обработана средствами QLua во вторичных скриптовых потоках без помех для главного потока Quik'а.

    Хотя QLua обладает весьма эффективными средствами взаимодействия с любым приложением Windows, не так просто придумать повод для обращения QLua за посторонней помощью. Например, сохранять на диске текущие данные QLua может массой способов от простейшего io.read/write до SQLite.
    Количество библиотек для QLua просто изумляет.

    NB. Известная проблема скриптовых языков, что ошибки-описки в именах функций и переменных влекут трудно диагностируемые сбои работы, решается двумя простейшими средствами.

    Авто-репост. Читать в блоге >>>
  14. Аватар Oleg45
    просто не пойму quik полное значение передает в переменой или через цикл по 1 надо прогонять
    чтоб значение вывести
  15. Аватар Oleg45
    Здравствуйте, извиняюсь за ранее т.к. звучать будет глупо, но я все таки немного не понял, надеюсь что кто нибуть подскажет или даст ссылку на пост, я знаю что такое яп и принцип работы, LUA не знаю, но учу по немногу, основной вопрос я не пойму взаимодействия quik c qlua, что именно возращают функции, в какую переменную и как вывести это число
  16. Аватар 3Qu
    Quik->Lua->C++DLL. Опыт разработки и немного кода.

    Начал вчера работы по реализации "Брошенной стратегии". Хорошо когда есть наработки: взял готовые куски кода, немного доработал под новые нужды, соединил их вместе и уже все готово — почти все необходимые данные передаются в DLL, расставляются по местам и готовы к использованию. С этим почти закончено, остальное будет делаться по ходу пьесы, и по мере необходимости.

    С передачей данных закончено, а стратегия даже не начиналась. Система новая и архитектора системы пока не ясна, есть несколько вариантов, выбрать из которых не так просто.
    Пока суд, да дело, решил написать о передаче данных из Quik в С++DLL.
    О том как сделать простую С++DLL для работы с Quik-Lua написано на сайте https://quikluacsharp.ru  здесь и о передаче данных из Lua — здесь и в других материалах сайта. Наверняка многие из вас все это видели и знают, а некоторые это даже применяют. Я это все не использую, не очень разбирался, но, тем не менее, сам сайт



    Авто-репост. Читать в блоге >>>
  17. Аватар Eugene Bright
    На самом деле для построения роботов все эти действия абсолютно не нужны. Поэтому, собственно, таких возможностей и не предусмотрено.

    Практически со 100% вероятности то что вам необходимо, делается другими способами, которые являются документированными и стандартными.

    s_mike@rambler.ru, Ну, что ж, Вам, «практически со 100% вероятности», лучше видно… Правда, я решил за время, прошедшее с момента задания вопроса, половину этих проблем. Нахожусь в процессе решения второй половины. Роботы — они такие разные! Кому-то хватает автоматизации простого «скользящего среднего» и отправки заявок, мой же робот, однажды запущенный, полностью контролирует свою жизнь. Одним ЛУА тут не обойтись, конечно. Но на то и мозги имеются, чтоб «шуршать»…
  18. Аватар s_mike@rambler.ru
    На самом деле для построения роботов все эти действия абсолютно не нужны. Поэтому, собственно, таких возможностей и не предусмотрено.

    Практически со 100% вероятности то что вам необходимо, делается другими способами, которые являются документированными и стандартными.
  19. Аватар Eugene Bright
    Здравствуйте, коллеги!

    ВОПРОС:
    можно ли средствами только QLUA (не открывая окон редактирования настроек графика) менять настройки и параметры графика цен?
    Нужно управлять:
    1. идентификатором инструмента (например, заменить SRZ9 на SRH0 в определенный момент времени),
    2. назначением имён линий графика (линия цен, линия индикатора) на подобие тех, что устанавливаются в окне «Редактирование настроек графика».

    Eugene Bright,

    1. Нет

    2. Нет

    И такой же ответ на остальные вопросы из этой серии.

    s_mike@rambler.ru, Понятно, безнадёга, «краткость — сестра таланта», — раньше так говорили.
  20. Аватар s_mike@rambler.ru
    Здравствуйте, коллеги!

    ВОПРОС:
    можно ли средствами только QLUA (не открывая окон редактирования настроек графика) менять настройки и параметры графика цен?
    Нужно управлять:
    1. идентификатором инструмента (например, заменить SRZ9 на SRH0 в определенный момент времени),
    2. назначением имён линий графика (линия цен, линия индикатора) на подобие тех, что устанавливаются в окне «Редактирование настроек графика».

    Eugene Bright,

    1. Нет

    2. Нет

    И такой же ответ на остальные вопросы из этой серии.
  21. Аватар s_mike@rambler.ru
    Здравствуйте. Подскажите где взять подробный учебник (для начинающего) или какой нибудь видео курс по обучению QLUA?

    930095,

    Не существует.

    Только документация по луа, qlua и эксперименты.
  22. Аватар s_mike@rambler.ru
    Куда QUIK сохраняет (буферизует) запущенный на нем скрипт Lua?
    И главное — может ли брокер (тех. служба) «иметь доступ» к этому скрипту (отдельному потоку)?
    Просто хочется узнать народное мнение.

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



    1. Не может.

    2. Скрипты считываются с диска и запускаются в памяти.
  23. Аватар s_mike@rambler.ru
    Всем привет!

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



    Да, конечно. Смотрите в хелпе в разделе работа с экранными таблицами. Функция называется settablenotification или как то похоже.

    Каждой таблице можно назначить колбеки на разные действия пользователя, в том числе и на двойной клик.
  24. Аватар ZdenniZ
    Всем привет!

    Вопрос вот возник. Как (и можно ли вообще) из экранной таблицы открыть еще одно окно поверх этой таблицы, например по двойному клику на какую-нибудь ее ячейку?
  25. Аватар Александр
    Куда QUIK сохраняет (буферизует) запущенный на нем скрипт Lua? И главное - может ли брокер (тех. служба) "иметь доступ" к этому скрипту (отдельному потоку)? Просто хочется узнать народное мнение.

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