buybackoff
buybackoff личный блог
21 декабря 2014, 07:21

QuikSharp - интерфейс Quik Lua полностью в .NET

Представляю вашему вниманию библиотеку для работы с Quik из C#/F#/.NET — QuikSharp.

Последняя неделя показала, что мне нельзя торговать руками на такой волатильности, и заставила задуматься о более серьезном подходе к автоматизации. В итоге — пока нет доступа к Plaza, Fix и другим нормальным API — я набросал эту библиотеку.

Главная идея библиотеки — всё, что написано в руководстве к Луа работает из .NET без изменений интерфейса. Quik и Lua — недружественная территория по сравнению с .NET, хочется свести их использование к абсолютному минимуму.

Реализован и протестирован механизм обмена данными на основе TCP sockets. Ping/Pong roundtrip с Квиком занимает 190 микросекунд на моем компьютере. Также реализованы сервисные функции и несколько функций обратного вызова.

Установить библиотеку в свой .NET проект можно из NuGet. В проекте будет создана папка lua, из которой нужно запускать в Квике скрипт QuikSharp.lua.

Примеры использования находятся в юнит-тестах здесь.

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

Цель — реализовать и оттестировать 100% из функционала QLUA из руководства. Если найдутся желающие помочь дописать эту библиотеку, пишите здесь а лучше на ГитХабе в Issues.

В коде все должно быть кристально понятно — как добавить новые функции и события. Я генерирую структуры данных (таблицы) из описания QLUA документации с помощью Эксель-файла в корне проекта. Все имена в структурах данных полностью соотвествуют документации QLUA. Пример структур данных из QLUA в этой папке, пример простейших функций в этом файле, пример событий (функций обратного вызова) — здесь. Эти примеры — шаблон для других функций.

Пользуйтесь на здоровье и следите за обновлениями на ГитХабе! (+ оставляйте отзывы и предложения)

Update (v.0.1.3):

Немного подкрутил и время туда-обратно снизилось с 200 микро- до 60 микросекунд! :)
Добавил еще три простых функции и пару событий. Копипаст шаблона уверенно и легко работает для новых фукнций.

План:
1. Все функции обратного вызова
2. Функции взаимодействия скрипта Lua и Рабочего места QUIK (включая функции для работы со свечами)
3. Функции для заказа стакана (сделано)
...
Самым последним в планах — сделать Функции для работы с таблицами Рабочего места QUIK, так как это слишком специфично для Квика.

 



67 Комментариев
  • crazyFakir
    21 декабря 2014, 07:27
    >>пока нет доступа к Plaza

    почему нет? — есть.

    и что за дурь делать из говна конфету?
      • crazyFakir
        21 декабря 2014, 08:19
        buybackoff, у всех есть, у него нету.

        религия не позволяет?
          • crazyFakir
            21 декабря 2014, 08:39
  • Алексей Ван <o-s-a.net>
    21 декабря 2014, 08:21
    Привет.
    Идея хорошая. С удовольствием забрал бы в свои проекты по готовности.
    Но чесно, не совсем понял зачем тестировать инструкцию по скриптовому языку и переносить функционал ЛУА в .Net. Просто набить руку… Ну или я не так понял просто.
    Для олд скул программистов нет нормального и бесплатного Api к Quik. Всё из костылей…
    Если бы ты сделал хорошее Api, вроде SmartCom (без косяков только))), с простыми вызовами базовых функций свойственных для Api к бирже(а не какого-то непонятного скриптового языка) тебя бы на руках носили лет десять.
    Вот описание Смарт Ком: www.itinvest.ru/software/smartcom/ как стандарт.

    Да, и что такое GPL3 — можно будет в коммерческих проектах такую штуку применять или только за бесплатно всё должно быть?
    • crazyFakir
      21 декабря 2014, 08:36
      Алексей Ван,
      >> Если бы ты сделал хорошее Api, вроде SmartCom
      еше один фантазер.
      ты реально не представляешь что ты говоришь.
      • Алексей Ван <o-s-a.net>
        21 декабря 2014, 08:41
        crazyFakir,
        Ещё один тупой троль, не понимающий о чём речь.
        да. Посмотри мой блог, земеля.
  • Алексей Ван <o-s-a.net>
    21 декабря 2014, 08:35
    да… и по твоей ссылке всё на не понятном иностранном языке. Что такое? Квик за пределами этой страны вроде не используют))
      • Алексей Ван <o-s-a.net>
        21 декабря 2014, 10:01
        buybackoff, У меня есть короче подключение к SmartCom (обёртка для их Api) и Quik(DDe(закрытое лицензией)+Trans2Quik) свои + к стокшарп сделал порт на прошлой неделе (это закрытая лицензия конечно). Все подключения доступны из одного класса контроллера. Очень удобно. Подключаешь к проекту, цепляешь на этот контроллер робота/привод и можно выбирать прям из одного места, к какому порту перекинуть соединение. Без лазанья в коде. С менюшкой простой.
        Свободное из всего этого только SmartCom. Но каркас с архитектурой уже понятны хотябы.
        Менюшка переключения соединения и мой привод:

        Была тоже давно идея сделать открытое Api для подключения к куче бирж, но забросил эту идею давно. Да и на тот момент мало практики было.
        Короче не теряйся. Open Source жив. ГовноКомментаторов не слушай.
        Надо подумать, может вместе попробовать что-нить делать.
  • ace-fltrade
    21 декабря 2014, 10:28
    Хотел на праздниках писать коннектор к квику, похоже задача упростилась… Будем тестировать. Думаю смогу вклад в проект внести. Какой самый удобный для тебя формат обратной связи ( куда писать?)
  • П М
    21 декабря 2014, 10:45
    пользуясь случаем, пропиарю и свою поделку
    On-Line получение данных из Quik в Java и не только
    для доступа к Lua используется named pipe
    скорость на реальном счете
    18 миллисекунд — подключение к Lua (createpipe), затем 1 миллисекунда на каждый запрос (получение свечей, статуса соединения с сервером, времени сервера, стакана по любому инструменту)
    Код на github рабочий как Proof Of Concept, но я с тех пор внёс несколько изменений для улучшения стабильности. Как нибудь выложу и их тоже.

    Код состоит из части на Lua (server) и Java. Вместо Java можно использовать C# или любой другой язык с доступом к WinAPI, в том чиcле через FFI прокси.
      • П М
        21 декабря 2014, 11:34
        buybackoff, насчёт более универсальный и гибкий, чем докажешь? :)
        художника легко обидеть.
        уж не знаю чем привязка к С# универсальнее и гибче.
        а скрипт на Lua легко дописать.
        не нашел у тебя в примерах получение свечей или стаканов. поэтому сложно оценить разницу.
        если ты про то что к Soсket можно подключиться удалённо, то я специально сделал Named Pipe локальным. Паранойя, знаешь ли.


        кстати я запушил только что последние изменения к себе.
          • П М
            21 декабря 2014, 11:54
            buybackoff, т.е. пока ничего нет. ясно. ну, у меня-то уже всё написано.
            по поводу гибкости — последним коммитом добавил получение немедленного слепка стакана.
            до этого было ожидание, пока стакан изменится, чтобы получить свежую информацию, теперь два варианта.
            всё для гибкости и универсальности.
            больше не отвлекаю. пост плюсанул.
  • SL
    21 декабря 2014, 18:15
    Здравствуйте, я пока так ничего и не понял как этим воспользоватся, как например подписаться на получение всех сделок или стакана? Нужна какая то хотя бы минимальная документация, что б можно было что то потестировать.
    Спасибо.
  • Ilya
    21 декабря 2014, 18:42
    Вечер добрый, buybackoff!
    Можно ваш контакт скайп или маил в случае вопросов работы с интерфейсом?
    Недавно сам тоже приступил к реализации своего проекта и очень понравился вариант от ПВМ, так как в моем проекте необходимо делать выгрузку данных ленты принтов с последующей ее обработкой и выводом на график в сам Quik. Pipe подошел в данном случае из-за универсальности обмена в обе стороны. Единственное прийдется переписать QAPI от ПВМ, так как на .NET у меня Pipe сервер, а скрипт для выгрузки и скрипт индикатора будут подсоединяться как клиенты.
    Ваш вариант тоже интересен на будущее.
    С уважением,
  • Ilya
    21 декабря 2014, 18:59
    buybackoff, хотябы маил (на GitHub маила не увидел), в личку здесь я не могу писать, рейтинга не хватает)))
      • П М
        21 декабря 2014, 22:48
        buybackoff, в порядке дружеской колкости, у тебя в коде вижу ты время измеряешь в миллисекундах
        Console.WriteLine(«MultiPing takes msecs: » + sw.ElapsedMilliseconds);
        а в посте пишешь про микросекунды (10^-3 и 10^-6)
        что на самом деле в результатах-то? микро или милли?
        BTW, выставление заявки, я позавчера наконец проверил точно, через Trans2Quik.dll занимает ОТ 57 миллисекунд. За это время она успевает дойти до биржи, зарегаться там и в программу приходит ответ. От отправки до ответа — 57 миллисекунд. (Сервер естественно не у брокера) Так что сильно ускоряться смысла нет, imho. Quik хорош для дней, часов, ну, мб минут, но на тиках надо уже брать что-то пошустрее, так что скорость важна постольку, поскольку.
          • П М
            21 декабря 2014, 23:17
            buybackoff, можно попробовать заявки отправлять через Lua, может у тебя будет быстрее. Но думаю порядка 50 миллисекунд всё равно будет на заявку уходить.

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

            сериализацией точно можно принебречь. если ты только не десяти КБ гонять собираешься
              • П М
                21 декабря 2014, 23:34
                buybackoff, ну, а если многопоточно обращаться к Lua с запросами ответами..
                на каждого клиента нужен поток.
                или там просто очереди на вход и выход и 1 поток клиента 1 сервера? если с очередями, то хорошо получится, но не сильно маштабируемо, т.е. скорость высокой не будет.
                хотя некоторый выигрыш будет в двунаправленной неблокирующей обработке.
                я может быть тоже про неё прочитаю, должно получиться и с pipe.
                спасибо за наводку :)
    • SL
      22 декабря 2014, 18:02
      Это события изменения стакана и всех сделок или функции для получения таких?
  • wyg
    19 января 2015, 11:08
    "… мне как раз не хватает пока времени и идей сделать универсальную модель объектов / API.
    Типа как S#, но мне она местами не очень нравится и она закрытая. Или типа OpenGamma.
    Когда есть интерфейсы для портфеля, сделки, ордера, и т.д. И всё open source." buybackoff

    Возможно есть смысл полюбопытсвовать здесь:
    bitbucket.org/SazanProject
    на библиотеку эту (исходники C# под SmartCom) наткнулся здесь на этом портале,
    автор smart-lab.ru/my/SergeyEgorov/blog/all/
    виде по использованию библиотеки
    www.youtube.com/user/codetraidingsystem/playlists
  • Valeriy
    02 февраля 2015, 19:39
    У меня карма не достаточная для личного сообщения, оставлю тут

    Хотел попробовать использовать твою библиотеку для квика. Взял из нугета.
    пытаюсь загрузить скрипт lua. Quik выдает ошибку
    error loading module 'socket.core' from file '...\lua\clibs\socket\core.dll':

    Не найден указанный модуль.

    Библиотека по этому пути есть
      • Valeriy
        06 февраля 2015, 23:19
        buybackoff, я натравил Dependency Walker на библиотеку core.dll
        Dependency Walker, показал не найденую зависимость API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL. я не знаю что это за библиотека

        >>Это полное сообщение об ошибе, или обрезанное?
        Это полное сообщение.

        >>Вам или еще кому-то
        Не мне :)
  • dav
    02 сентября 2015, 15:16
    проект развивается?
  • dork
    24 сентября 2015, 14:07
    Спасибо, друг! По описанию это то, что я искал. Будем смотреть. Хотел уже named pipes делать поднимать в qlua… Как прогер я слабоват, но шлю лучи поддержки и плюсики в профиль.
  • dork
    24 сентября 2015, 19:26
    У меня 1300 мсек в среднем со 2го по 10 раунды в тестах. Что сделать чтобы было 600?
      • dork
        24 сентября 2015, 21:07
        buybackoff, сначала я запускал проект Profiler. А MultiPingFast действительно печатает 600. Спасибо. Буду изучать дальше.
  • 2:5020/1164
    26 сентября 2015, 02:21
    +++ (силы нет, поэтому ставлю тут). Респект автору. Вопрос: 3-4 опционных серии (SI, RI) потянет на получение рилтайм-котировок? (бид/аск/объем/время)? Всего тикеров 200 требуется.
      • 2:5020/1164
        02 октября 2015, 13:30
        buybackoff, работает отлично, читаю котировки 4-х опционных досок. Спасибо за решение. Ощущение большей простоты и надежности, чем SmartCOM. А об универсальности и говорить не приходится.
  • Prophetic
    02 октября 2015, 21:21
    Господа, кто-нибудь из местных пробовал создавать Windows Form-приложение с подключением данной библиотеки?
    Уже неделю мучаюсь. С консольным проблем нет, а в WindowsForm
    строка типа _quik = new Quik();
    не отрабатывает.
    Попытка отследить точку проблемы через отладчик, привела к исключению Esent (что-то типа: база данных должна быть дефрагментирована или удалена)
    Глубже нифига понять не смог.

    Познания в C# неглубокие. Может кто-нибудь подсказать как ПРАВИЛЬНО создать простейшее WindowsForm- приложение, чтобы эта библиотека в нем работала?
      • Prophetic
        02 октября 2015, 23:53
        buybackoff, еще бы знать как это делается...
        Но за идею спасибо, буду изучать.
        Кстати, Вы были правы на счет того, что студия глючит с путями к пакетам. Ручное отключения связей с ними, и последующее их восстановление решило проблему желтых восклицательных знаков.
          • Prophetic
            03 октября 2015, 11:46
            buybackoff, Да, это был я. Но боюсь, что это не столько технический вопрос, сколько недостаток знаний в моей голове. Поэтому и не стал на гитхабе этот вопрос задавать.
    • 2:5020/1164
      10 октября 2015, 01:13
      Prophetic, да, было такое) Но быстро понял в чем дело и ушел на консоль. Если получится решить задачу на WinFormz, отпишитесь пожалуйста, интересно. У меня этот проект лишь как драйвер большой БД котировок опционов, поэтому работает — да и ладно.
      • Prophetic
        10 октября 2015, 13:25
        2:5020/1164, данную проблему решил. Правда, сам до конца не понял как. Очень долго танцевал с бубном (читай экспериментировал) и в какой-то момент все заработало. Остальная информация по моим изысканиям есть на гитхабе
  • Dmitriy
    29 октября 2015, 21:15
    Подскажите, пожалуйста, как начать использовать QuikSharp? Я подключил его через nuget к проекту, но что дальше?
    как хотя бы запустить тест ping?
  • Алимат Мирзо
    25 сентября 2016, 18:53
    Девелоперские платформы с API можно взять здесь (если кому-либо интересно): http://getanyplatform.com
  • Иван Ру
    23 марта 2018, 23:15

    Опыт в теме у меня небольшой, возможно что-то делаю нет. Не получается.

    C...QuikSharp.csproj: error: пространством имен XML по умолчанию для этого проекта должно быть пространством имен MSBuild XML. Если проект создан в формате MSBuild 2003, добавьте xmlns=«schemas.microsoft.com/developer/msbuild/2003» в элемент <Project>. Если проект был создан в старом формате 1.0 или 1.2, преобразуйте его в формат MSBuild 2003. C:\Users\LOOD\Documents\Visual Studio 2015\Projects\QUIKSharp-master\src\QuikSharp\QuikSharp.csproj

     

    После попытки сборки выдает около 200 ошибок. В основном — связанных с пространством имен. 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн