Блог им. 3Qu

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

    • 24 марта 2020, 14:04
    • |
    • 3Qu
  • Еще
Делаю новую алгоритмическую торговую систему (АТС) под 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. Ставить не стал, лучшее — враг хорошему.)
  • обсудить на форуме:
  • QUIK
★9
51 комментарий
библиотеки. длл, потоки. романтика...
помню тоже этим занимался.
денех то хоть заработал?
avatar
Kapeks, у меня старые АТС тоже есть. Не в деньгах счастье. Но и не в их отсутствии.)
avatar
Kapeks, эти вещи, чаще всего, хобби
avatar
vito333, это действительно оч интересная задача, даже класс задач. Но неплохо, когда хобби совмещается с некоторым доходом.
avatar
Kapeks, вот это самое главное в таких постах. Все пишут про технологии, а результата в деньгах нет. :):)
avatar
Susanin, ))
На долю АТС даже на МОЕХ уже несколько лет назад приходилось около 60% биржевого оборота. Наверное некоторые из этих АТС неплохо зарабатывают. Как вы думаете?
Кроме того, алготрединг это не только АТС, но и всяческий вспомогательный софт обрабатывающий и анализирующий данные для ручной торговли.
Кстати, в опционах РТС стаканы набиты роботами.)
avatar
3Qu, мне кажется все сладкие дни дни давно в прошлом. есть пару арбитражоров с маркетосами. они и делают весь оборот.
времена когда сидя на кухне с ноутом можно было нарубить бабла на скальпинге фьюча ртс давно прошли.
avatar
Susanin, весь фокус в том, что не надо с ними соревноваться или даже пытаться это сделать, все равно не догонишь.)
Именно потому мне не нужны какие-то сверхбыстрые каналы, а достаточно обычного Quik.
avatar
3Qu, да не поспоришь. тогда остается тренд следящие системы со всеми недостатками и низкой эффективностью. и даже их очень сложно сделать.
avatar
Susanin, скорее да, трендследящие. Сделать их действительно непросто, но принципы просты: купи дешево — продай дорого. Вопрос только определения этих понятий для конкретной системы.
Ну, а сами понятия описываются-определяются математикой (статистикой той-же), все библиотеки есть — В Питоне, например. Не самим же в Lua писать библиотеки.))
А вот и результат моделирования одной из таких стратегий в Питон:


по Х — номер сделки, по У — накопленный профит.
Я эту картинку уже публиковал.
Таких моделей несколько, одну из них буду реализовывать.

avatar
3Qu, вот лучше бы они Питон к Квику прикрутили, чем Lua.
avatar
Value, напрямую прикрутить Питон вряд-ли получится, а Lua уже изначально для этого предназначен, и для таких применений и разрабатывался.
Но какой-то порт к Питону из Quik был бы действительно неплох. Хотя, это через DLL все организуется, и плодить порты тоже ни к чему. В общем, палка о двух концах.
avatar
3Qu, поделитесь идеями. Уж очень странно выглядит.
avatar
Susanin, сходу не скажу к какой именно модели этот график. Тем не менее, все они know how.
Но, если кратко, — находим стат устойчивые параметры графика, на них и играем. Сплошная мат статистика и ничего более.
avatar
Мне бы похожее, да на питоне, да уже готовое, чтобы только стратку вставить и пиу-пиу. Эх… лень. Сначала поток закажи, потом перенаправь, в удобоваримый формат переделай, проведи алгоритмические вычисления/операции, потом все обратно пакуй… буэээ 
Нету в мире стабильности.
avatar
Винни Пух, пока DLL универсальная, АТС в нее можно вставить любую. И хотя вспомогательного софта уже много, но это будет моя первая АТС под Quik. Раньше были другие терминалы, и пришлось все начинать с нуля.
Пока еще до конца не решил что именно буду туда впихивать — есть несколько вариантов. Питон, кстати, один из них.
avatar
3Qu, я на чистом LUA писал роботов в QUIK, работает очень шустро. С dll никогда не связывался. Надеюсь когда-нибудь дойдут руки, надо разобраться. В этом направлении планов много.
avatar
Винни Пух, да, Lua среда достаточно шустрая, я тоже на ней делал некоторые вспомогательные программы и индикаторы. Но не для всех АТС Lua подходит. Если нужны внешние мат. библиотеки, то в Lua их не втащишь иначе чем через DLL. Но в таких случае разумнее и проще уже внешняя АТС.
avatar
Винни Пух, 
С dll никогда не связывался. Надеюсь когда-нибудь дойдут руки, надо разобраться. В этом направлении планов много.
Если дойдут, то не далее как вчера опубликовал здесь проект простейшей DLL для связи с Quik - Переход на 64-бит Quik. Пляски с DLL. 2.
Достаточно скачать, вставить в VS, скомпилировать, и можно работать, или использовать как шаблон.
avatar
3Qu, обязательно посмотрю, спасибо.
avatar
Винни Пух, А Вам бы я посоветовал посмотреть код коннектора для C# с открытым исходным кодом QuikSharp (если не ошибаюсь), там вроде несложно серверную часть на питон перевести. Есть маленькая прокладка на lua, но ее вообще можно не менять, т.к. единственное что она делает — это событие которое в нее приходит пересылает по сокету в коннектор. А тот дальше его распаковывает и обрабатывает. Причем там передается какая-то метаструктура, которая охватывает все инструменты и действия над ними. Видимо, это самый сложный момент — понять как она устроена. Но поскольку есть исходники — просто берешь, разбираешься и в итоге у тебя свой коннектор на питон. Можно же ведь тупо перевести с языка на язык, там не такой код, с которым могут возникнуть сложности. Странно, если этого до сих пор никто еще не сделал.
avatar
tranquility, Спасибо за совет. На GitHub есть код, но т.к. Си мне незнаком совсем, синтаксис и логику придется разбирать долго. Поэтому все в долгий ящик отложено.
avatar
а разве с квиком нет связи напрямую, а не через это Lua?
avatar
alexKa,  есть — DDE и ODBC. Но это не варианты.
avatar
ITI предлагает API для доступа к торгам без терминала вообще, по отдельному логину. В терминале можно параллельно смотреть за торгами.
avatar
Денис Г., все это известно, но не всегда и не всем это подходит.
avatar
Зачем там многопоточность?
avatar
Value, это совсем просто. Все события Lua работают в очереди, в одном потоке, являющимся потоком терминала. Если вы будете долго обрабатывать событие, то все другие события и терминал встанут.
В мануале ARQA QLua написано, что нам нужно как можно быстрее обработать событие и освободить поток событий и терминала.
Собственно, для этого мы и уходим в другой поток, чтобы обеспечить поступление следующих событий и нормальную работу терминала.
avatar
3Qu, «глобальный» чанк (то, что просто в тексте скрипта) — это поток терминала. А функция main — уже отдельный поток. Иначе sleep в main фризил бы терминал.
avatar
Денис Г., да, разумеется, main() отдельный поток. Я писал о событиях.
avatar
3Qu, я это написал вот к этому:
Если вы будете долго обрабатывать событие, то все другие события и терминал встанут.

Lua сама по себе многопоточна. QLua даже предлагает потокобезопасные функции для работы с таблицами, которые их блокируют до окончания обработки, чтобы в параллельном потоке не испортить результат.
avatar
А, кажется понял, о чём вы именно. Колбеки да, в общем потоке, но колбеки легко вынести в отдельный поток.
avatar
VS 19 вроде уже рабочая 
avatar
Skifan, не знаю, не пробовал.
avatar
3Qu, раз всё равно переходите, можно было бы сразу на 2019 перейти.
avatar
Value, тогда у меня весь комп будет сплошь забит Визуал Студиями.))
avatar
Скорее всего квик падал из-за критической ошибки в DLL. Например из-за data race, access violation  и т.д. Если после перекомпиляции с новой версией компилятора и CRT больше не крашится, это не значит что это не произойдет в будущем. ИМХО надо аккуратно просмотреть код DLL, прогнать статическим анализатором, посмотреть утечки памяти и т.д. С++ дело такое, легко отстрелить себе ногу.
avatar
imperativ, эт вряд ли. Не первый год замужем.)
Но, если DLL при компиляции VS 2017 показала намного лучшие результаты, этого одного уже достаточно, чтобы перейти на нее, и забыть о VS 2015 и более старых.
DLL с утра и по сию пору работает и все выполняется, и никаких подвисаний Quik или задержек вообще нет. Визуально, по крайней мере.
avatar
Пока все ОК. Quik и DLL продержались весь день — с утра до 18:44.
На перерыв может упасть, т.к. из Квик после закрытия торгов и при открытии поступают некорректные рваные данные. Но с этим бороться пока не планирую, иначе как запуском после начала торгов и приостановкой перед завершением.

Зы. И точно, но даже не упало, но появилась ошибка -C:\Uralsib\QUIK\Lua\CalSpred2.lua:99: bad argument #-1 to 'GlassPrice' (table expected, got nil)" Некорректные данные по стакану то-ли в самой Lua, то-ли в DLL.

Зы2 Открытие торгов в 19:00 отработано штатно. Раньше открытие торгов для связки Quik-DLL заканчивалось фатальным исходом.)
avatar
Пилю проекты на Borland C++ Builder 6. Чувствую, что-то со мной не так… )
avatar
robomakerr, запускаются еще? =)
avatar
Андрей К, а чего б им на XP не запускаться =)
avatar
robomakerr, ааа, точно =))
avatar
Не понял в чем проблема. У самого подобное реализовано было 3 года назад. quik-lua-dll-socket-socket-exe (и обратно). Работало стабильно в круглосуточном режиме. Я так маркетдату полностью сохранял включая стакан.
P.S. Да, припоминаю, сам сталкивался с подобной ошибкой. Причина в том что под конец сессии приходят стаканы с пустыми бидами или асками. Собственно они имеют значение nil. Просто проверять надо и дальше у себя интерпретировать nil как пустой массив.
P.P.S. Вот именно чего не понял, так это разговор про версию Вижуал студии. Это же все равно, хоть на 6й компилируйте свою dll — должно будет работать. Единственное, на очень старой версии 64-битную dll собрать не получится.
avatar
tranquility, 
P.P.S. Вот именно чего не понял, так это разговор про версию Вижуал студии. Это же все равно, хоть на 6й компилируйте свою dll — должно будет работать. Единственное, на очень старой версии 64-битную dll собрать не получится.
Однако, как оказалось, версия VS имеет значение.
Если один и тот же код при компиляции в VS 2015 работает нестабильно, а при компиляции в VS 2017 нестабильность исчезает, то это означает, что VS 2015 не оч подходит для проектов под Windows 10. И это уже факт.

Что касается связи с Питон, то да, наверное сокеты оптимальный и наиболее простой вариант, тем более, что в Питон есть уже готовая библиотека Socket.
Остается только написать С++ DLL c сокетами под Lua.

В quikluasharp связь с внешним миром реализована через MMF. Не в курсе, есть ли такая либа в Питон. Ну, и в случае MMF, там код проще, а возни больше.
avatar
3Qu, 

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

avatar
tranquility, MMF -  memory mapped files.
ЗЫ Посмотрел ресурс. По вашей ссылке действительно сокеты. Ну уж больно много кода Lua. C DLL, имхо проще получается.
Я говорил о другом ресурсе с примерно аналогичным названием — там используются MMF.
avatar
3Qu, в моем случае надо каждый раз менять код луа, задавать там какие инструменты посылать в dll (имена фьючей ведь меняются раз в месяц-квартал). А подход как в этом коннекторе позволяет 1 раз написать код луа и забыть про него (пока не выйдет суперновое обновление что-то не сломает). Такой подход мне кажется более привлекательным. Менять имена инструментов тоже надо будет, но уже только в той среде, в которой крутится алгоритм.
avatar
tranquility, я в Луа создаю таблицу с именами инструментов и прочими параметрами и в init Lua передаю ее в DLL.
avatar
3Qu, ну так мы вряд ли делаем по-разному. Просто упомянутый коннектор получает сразу метасообщение, которое может содержать информацию о любом событии которое послал квик в луа. Т.е. в луа не нужно писать код вроде «подписаться на стакан по такому-то инструменту», это делается уже в c#, а код луа остается неизменным.
avatar
tranquility, такой  подход не оч хорош. Если у вас подписка и др. команды Луа выполняются налету, то Луа их должен скомпилировать, а потом исполнить, а это время.
Т.к. код Луа небольшой и все данные реал-тайм передаются в обработку ДЛЛ, то мне это вообще ни к чему. Решение о сделке принимается вне Луа. Кто конкретно будет исполнять, Луа или trans2quik — пока не решил.
avatar

теги блога 3Qu

....все тэги



UPDONW
Новый дизайн