3Qu
3Qu личный блог
24 марта 2020, 14:04

Алготрейдинг, Quik и Visual Studio 2017.

Делаю новую алгоритмическую торговую систему (АТС) под Quik. Базовой в системе является достаточно сложная многопоточная C++ DLL, связывающаяся с Quik через Lua. Для разработки с самого начала использовалась VS 2015. Т.к. в настоящее время перешел на х64 Quik занялся перекомпиляций всего своего х86 софта под Quik на платформу х64.
Все бы ничего, но при больших рыночных потоках данных Quik начинал подтормаживать, а при подключении DDL, Quik подтормаживал еще сильнее и через некоторое время падал вместе с DLL. Переход на х64 существенно улучшил ситуацию, Однако эпизодические падения, значительно реже, но продолжались.
Надо сказать, что все эти многопоточности и были ранее введены в DLL для снижения нагрузки на Quik, чтобы не грузить поток событий терминала. Вся обработка событий заключалась лишь в том, чтобы преобразовать данные получаемые из Lua и отдать их соответствующему потоку для дальнейшей обработки.
В общем, о стабильной АТС приходилось только мечтать, и думать что дальше с этим делать.
У меня на компе давно без дела пылилась Visual Studio 2017. Требований к железу она предъявляет больше чем VS 2015, и я ее использовал считанные разы, скорее, чтобы посмотреть что в ней нового и отличия от VS 2015. Существенных отличий не заметил, и продолжал работать на старой VS 2015.
Вчера уже поздно вечером с чего-то решил открыть проект DLL в VS 2017. Ну, уж коли открыл, заодно и скомпилировал.
Сегодня подключил скомпилированную на VS 2017 DLL к Lua Quik. Уже несколько часов все, и Quik и DLL, стабильно штатно работают, ничего не подвисает. Просто все на редкость здорово. А всего-то надо было...)).
В общем, те кто работает под Windows 10 со старыми VS, переходите на VS 2017. Наверняка многие проблемы уйдут сами.

PS Вчера залез на Microsoft, оказывается они уже выпустили VS 2019. Ставить не стал, лучшее — враг хорошему.)
51 Комментарий
  • Kapeks
    24 марта 2020, 14:11
    библиотеки. длл, потоки. романтика...
    помню тоже этим занимался.
    денех то хоть заработал?
    • vito333
      24 марта 2020, 14:33
      Kapeks, эти вещи, чаще всего, хобби
    • Susanin
      24 марта 2020, 15:08
      Kapeks, вот это самое главное в таких постах. Все пишут про технологии, а результата в деньгах нет. :):)
        • Susanin
          24 марта 2020, 16:14
          3Qu, мне кажется все сладкие дни дни давно в прошлом. есть пару арбитражоров с маркетосами. они и делают весь оборот.
          времена когда сидя на кухне с ноутом можно было нарубить бабла на скальпинге фьюча ртс давно прошли.
            • Susanin
              24 марта 2020, 16:25
              3Qu, да не поспоришь. тогда остается тренд следящие системы со всеми недостатками и низкой эффективностью. и даже их очень сложно сделать.
                • Value
                  24 марта 2020, 16:51
                  3Qu, вот лучше бы они Питон к Квику прикрутили, чем Lua.
                • Susanin
                  25 марта 2020, 14:53
                  3Qu, поделитесь идеями. Уж очень странно выглядит.
  • Винни Пух
    24 марта 2020, 14:13
    Мне бы похожее, да на питоне, да уже готовое, чтобы только стратку вставить и пиу-пиу. Эх… лень. Сначала поток закажи, потом перенаправь, в удобоваримый формат переделай, проведи алгоритмические вычисления/операции, потом все обратно пакуй… буэээ 
    Нету в мире стабильности.
      • Винни Пух
        24 марта 2020, 14:50
        3Qu, я на чистом LUA писал роботов в QUIK, работает очень шустро. С dll никогда не связывался. Надеюсь когда-нибудь дойдут руки, надо разобраться. В этом направлении планов много.
          • Винни Пух
            24 марта 2020, 16:22
            3Qu, обязательно посмотрю, спасибо.
    • tranquility
      25 марта 2020, 10:00
      Винни Пух, А Вам бы я посоветовал посмотреть код коннектора для C# с открытым исходным кодом QuikSharp (если не ошибаюсь), там вроде несложно серверную часть на питон перевести. Есть маленькая прокладка на lua, но ее вообще можно не менять, т.к. единственное что она делает — это событие которое в нее приходит пересылает по сокету в коннектор. А тот дальше его распаковывает и обрабатывает. Причем там передается какая-то метаструктура, которая охватывает все инструменты и действия над ними. Видимо, это самый сложный момент — понять как она устроена. Но поскольку есть исходники — просто берешь, разбираешься и в итоге у тебя свой коннектор на питон. Можно же ведь тупо перевести с языка на язык, там не такой код, с которым могут возникнуть сложности. Странно, если этого до сих пор никто еще не сделал.
      • Винни Пух
        25 марта 2020, 10:44
        tranquility, Спасибо за совет. На GitHub есть код, но т.к. Си мне незнаком совсем, синтаксис и логику придется разбирать долго. Поэтому все в долгий ящик отложено.
  • alexKa
    24 марта 2020, 14:27
    а разве с квиком нет связи напрямую, а не через это Lua?
  • iddqd3n
    24 марта 2020, 14:40
    ITI предлагает API для доступа к торгам без терминала вообще, по отдельному логину. В терминале можно параллельно смотреть за торгами.
  • Value
    24 марта 2020, 14:59
    Зачем там многопоточность?
      • iddqd3n
        24 марта 2020, 15:19
        3Qu, «глобальный» чанк (то, что просто в тексте скрипта) — это поток терминала. А функция main — уже отдельный поток. Иначе sleep в main фризил бы терминал.
          • iddqd3n
            24 марта 2020, 15:38
            3Qu, я это написал вот к этому:
            Если вы будете долго обрабатывать событие, то все другие события и терминал встанут.

            Lua сама по себе многопоточна. QLua даже предлагает потокобезопасные функции для работы с таблицами, которые их блокируют до окончания обработки, чтобы в параллельном потоке не испортить результат.
            • iddqd3n
              24 марта 2020, 15:51
              А, кажется понял, о чём вы именно. Колбеки да, в общем потоке, но колбеки легко вынести в отдельный поток.
  • Skifan
    24 марта 2020, 15:24
    VS 19 вроде уже рабочая 
      • Value
        24 марта 2020, 16:48
        3Qu, раз всё равно переходите, можно было бы сразу на 2019 перейти.
  • imperativ
    24 марта 2020, 15:45
    Скорее всего квик падал из-за критической ошибки в DLL. Например из-за data race, access violation  и т.д. Если после перекомпиляции с новой версией компилятора и CRT больше не крашится, это не значит что это не произойдет в будущем. ИМХО надо аккуратно просмотреть код DLL, прогнать статическим анализатором, посмотреть утечки памяти и т.д. С++ дело такое, легко отстрелить себе ногу.
  • robomakerr
    25 марта 2020, 00:44
    Пилю проекты на Borland C++ Builder 6. Чувствую, что-то со мной не так… )
    • Андрей К
      25 марта 2020, 16:03
      robomakerr, запускаются еще? =)
      • robomakerr
        26 марта 2020, 13:15
        Андрей К, а чего б им на XP не запускаться =)
  • tranquility
    25 марта 2020, 09:32
    Не понял в чем проблема. У самого подобное реализовано было 3 года назад. quik-lua-dll-socket-socket-exe (и обратно). Работало стабильно в круглосуточном режиме. Я так маркетдату полностью сохранял включая стакан.
    P.S. Да, припоминаю, сам сталкивался с подобной ошибкой. Причина в том что под конец сессии приходят стаканы с пустыми бидами или асками. Собственно они имеют значение nil. Просто проверять надо и дальше у себя интерпретировать nil как пустой массив.
    P.P.S. Вот именно чего не понял, так это разговор про версию Вижуал студии. Это же все равно, хоть на 6й компилируйте свою dll — должно будет работать. Единственное, на очень старой версии 64-битную dll собрать не получится.
      • tranquility
        25 марта 2020, 22:31
        3Qu, 

        Не знаю что такое MMF, но вот место где передается запрос из луа github.com/finsight/QUIKSharp/blob/master/src/QuikSharp/lua/qsutils.lua
        ММF там где-то есть, оно?
        С остальным согласен. Просто я так ине перешел на 10ку, на десктопе 8.1 крутится до сих пор...

          • tranquility
            26 марта 2020, 00:44
            3Qu, в моем случае надо каждый раз менять код луа, задавать там какие инструменты посылать в dll (имена фьючей ведь меняются раз в месяц-квартал). А подход как в этом коннекторе позволяет 1 раз написать код луа и забыть про него (пока не выйдет суперновое обновление что-то не сломает). Такой подход мне кажется более привлекательным. Менять имена инструментов тоже надо будет, но уже только в той среде, в которой крутится алгоритм.
              • tranquility
                26 марта 2020, 01:35
                3Qu, ну так мы вряд ли делаем по-разному. Просто упомянутый коннектор получает сразу метасообщение, которое может содержать информацию о любом событии которое послал квик в луа. Т.е. в луа не нужно писать код вроде «подписаться на стакан по такому-то инструменту», это делается уже в c#, а код луа остается неизменным.

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

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