Блог им. 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
★8
библиотеки. длл, потоки. романтика...
помню тоже этим занимался.
денех то хоть заработал?
avatar

Kapeks

Kapeks, у меня старые АТС тоже есть. Не в деньгах счастье. Но и не в их отсутствии.)
avatar

3Qu

Kapeks, эти вещи, чаще всего, хобби
avatar

vito333

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

3Qu

Kapeks, вот это самое главное в таких постах. Все пишут про технологии, а результата в деньгах нет. :):)
avatar

Susanin

Susanin, ))
На долю АТС даже на МОЕХ уже несколько лет назад приходилось около 60% биржевого оборота. Наверное некоторые из этих АТС неплохо зарабатывают. Как вы думаете?
Кроме того, алготрединг это не только АТС, но и всяческий вспомогательный софт обрабатывающий и анализирующий данные для ручной торговли.
Кстати, в опционах РТС стаканы набиты роботами.)
avatar

3Qu

3Qu, мне кажется все сладкие дни дни давно в прошлом. есть пару арбитражоров с маркетосами. они и делают весь оборот.
времена когда сидя на кухне с ноутом можно было нарубить бабла на скальпинге фьюча ртс давно прошли.
avatar

Susanin

Susanin, весь фокус в том, что не надо с ними соревноваться или даже пытаться это сделать, все равно не догонишь.)
Именно потому мне не нужны какие-то сверхбыстрые каналы, а достаточно обычного Quik.
avatar

3Qu

3Qu, да не поспоришь. тогда остается тренд следящие системы со всеми недостатками и низкой эффективностью. и даже их очень сложно сделать.
avatar

Susanin

Susanin, скорее да, трендследящие. Сделать их действительно непросто, но принципы просты: купи дешево — продай дорого. Вопрос только определения этих понятий для конкретной системы.
Ну, а сами понятия описываются-определяются математикой (статистикой той-же), все библиотеки есть — В Питоне, например. Не самим же в Lua писать библиотеки.))
А вот и результат моделирования одной из таких стратегий в Питон:


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

avatar

3Qu

3Qu, вот лучше бы они Питон к Квику прикрутили, чем Lua.
avatar

Value

Value, напрямую прикрутить Питон вряд-ли получится, а Lua уже изначально для этого предназначен, и для таких применений и разрабатывался.
Но какой-то порт к Питону из Quik был бы действительно неплох. Хотя, это через DLL все организуется, и плодить порты тоже ни к чему. В общем, палка о двух концах.
avatar

3Qu

3Qu, поделитесь идеями. Уж очень странно выглядит.
avatar

Susanin

Susanin, сходу не скажу к какой именно модели этот график. Тем не менее, все они know how.
Но, если кратко, — находим стат устойчивые параметры графика, на них и играем. Сплошная мат статистика и ничего более.
avatar

3Qu

Мне бы похожее, да на питоне, да уже готовое, чтобы только стратку вставить и пиу-пиу. Эх… лень. Сначала поток закажи, потом перенаправь, в удобоваримый формат переделай, проведи алгоритмические вычисления/операции, потом все обратно пакуй… буэээ 
Нету в мире стабильности.
avatar

Винни Пух

Винни Пух, пока DLL универсальная, АТС в нее можно вставить любую. И хотя вспомогательного софта уже много, но это будет моя первая АТС под Quik. Раньше были другие терминалы, и пришлось все начинать с нуля.
Пока еще до конца не решил что именно буду туда впихивать — есть несколько вариантов. Питон, кстати, один из них.
avatar

3Qu

3Qu, я на чистом LUA писал роботов в QUIK, работает очень шустро. С dll никогда не связывался. Надеюсь когда-нибудь дойдут руки, надо разобраться. В этом направлении планов много.
avatar

Винни Пух

Винни Пух, да, Lua среда достаточно шустрая, я тоже на ней делал некоторые вспомогательные программы и индикаторы. Но не для всех АТС Lua подходит. Если нужны внешние мат. библиотеки, то в Lua их не втащишь иначе чем через DLL. Но в таких случае разумнее и проще уже внешняя АТС.
avatar

3Qu

Винни Пух, 
С dll никогда не связывался. Надеюсь когда-нибудь дойдут руки, надо разобраться. В этом направлении планов много.
Если дойдут, то не далее как вчера опубликовал здесь проект простейшей DLL для связи с Quik - Переход на 64-бит Quik. Пляски с DLL. 2.
Достаточно скачать, вставить в VS, скомпилировать, и можно работать, или использовать как шаблон.
avatar

3Qu

3Qu, обязательно посмотрю, спасибо.
avatar

Винни Пух

Винни Пух, А Вам бы я посоветовал посмотреть код коннектора для C# с открытым исходным кодом QuikSharp (если не ошибаюсь), там вроде несложно серверную часть на питон перевести. Есть маленькая прокладка на lua, но ее вообще можно не менять, т.к. единственное что она делает — это событие которое в нее приходит пересылает по сокету в коннектор. А тот дальше его распаковывает и обрабатывает. Причем там передается какая-то метаструктура, которая охватывает все инструменты и действия над ними. Видимо, это самый сложный момент — понять как она устроена. Но поскольку есть исходники — просто берешь, разбираешься и в итоге у тебя свой коннектор на питон. Можно же ведь тупо перевести с языка на язык, там не такой код, с которым могут возникнуть сложности. Странно, если этого до сих пор никто еще не сделал.
avatar

tranquility

tranquility, Спасибо за совет. На GitHub есть код, но т.к. Си мне незнаком совсем, синтаксис и логику придется разбирать долго. Поэтому все в долгий ящик отложено.
avatar

Винни Пух

а разве с квиком нет связи напрямую, а не через это Lua?
avatar

alexKa

alexKa,  есть — DDE и ODBC. Но это не варианты.
avatar

3Qu

ITI предлагает API для доступа к торгам без терминала вообще, по отдельному логину. В терминале можно параллельно смотреть за торгами.
avatar

Денис Г.

Денис Г., все это известно, но не всегда и не всем это подходит.
avatar

3Qu

Зачем там многопоточность?
avatar

Value

Value, это совсем просто. Все события Lua работают в очереди, в одном потоке, являющимся потоком терминала. Если вы будете долго обрабатывать событие, то все другие события и терминал встанут.
В мануале ARQA QLua написано, что нам нужно как можно быстрее обработать событие и освободить поток событий и терминала.
Собственно, для этого мы и уходим в другой поток, чтобы обеспечить поступление следующих событий и нормальную работу терминала.
avatar

3Qu

3Qu, «глобальный» чанк (то, что просто в тексте скрипта) — это поток терминала. А функция main — уже отдельный поток. Иначе sleep в main фризил бы терминал.
avatar

Денис Г.

Денис Г., да, разумеется, main() отдельный поток. Я писал о событиях.
avatar

3Qu

3Qu, я это написал вот к этому:
Если вы будете долго обрабатывать событие, то все другие события и терминал встанут.

Lua сама по себе многопоточна. QLua даже предлагает потокобезопасные функции для работы с таблицами, которые их блокируют до окончания обработки, чтобы в параллельном потоке не испортить результат.
avatar

Денис Г.

А, кажется понял, о чём вы именно. Колбеки да, в общем потоке, но колбеки легко вынести в отдельный поток.
avatar

Денис Г.

VS 19 вроде уже рабочая 
avatar

Skifan

Skifan, не знаю, не пробовал.
avatar

3Qu

3Qu, раз всё равно переходите, можно было бы сразу на 2019 перейти.
avatar

Value

Value, тогда у меня весь комп будет сплошь забит Визуал Студиями.))
avatar

3Qu

Скорее всего квик падал из-за критической ошибки в DLL. Например из-за data race, access violation  и т.д. Если после перекомпиляции с новой версией компилятора и CRT больше не крашится, это не значит что это не произойдет в будущем. ИМХО надо аккуратно просмотреть код DLL, прогнать статическим анализатором, посмотреть утечки памяти и т.д. С++ дело такое, легко отстрелить себе ногу.
avatar

imperativ

imperativ, эт вряд ли. Не первый год замужем.)
Но, если DLL при компиляции VS 2017 показала намного лучшие результаты, этого одного уже достаточно, чтобы перейти на нее, и забыть о VS 2015 и более старых.
DLL с утра и по сию пору работает и все выполняется, и никаких подвисаний Quik или задержек вообще нет. Визуально, по крайней мере.
avatar

3Qu

Пока все ОК. 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

3Qu

Пилю проекты на Borland C++ Builder 6. Чувствую, что-то со мной не так… )
avatar

robomakerr

robomakerr, запускаются еще? =)
avatar

Андрей К

Андрей К, а чего б им на XP не запускаться =)
avatar

robomakerr

robomakerr, ааа, точно =))
avatar

Андрей К

Не понял в чем проблема. У самого подобное реализовано было 3 года назад. quik-lua-dll-socket-socket-exe (и обратно). Работало стабильно в круглосуточном режиме. Я так маркетдату полностью сохранял включая стакан.
P.S. Да, припоминаю, сам сталкивался с подобной ошибкой. Причина в том что под конец сессии приходят стаканы с пустыми бидами или асками. Собственно они имеют значение nil. Просто проверять надо и дальше у себя интерпретировать nil как пустой массив.
P.P.S. Вот именно чего не понял, так это разговор про версию Вижуал студии. Это же все равно, хоть на 6й компилируйте свою dll — должно будет работать. Единственное, на очень старой версии 64-битную dll собрать не получится.
avatar

tranquility

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

3Qu, 

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

avatar

tranquility

tranquility, MMF -  memory mapped files.
ЗЫ Посмотрел ресурс. По вашей ссылке действительно сокеты. Ну уж больно много кода Lua. C DLL, имхо проще получается.
Я говорил о другом ресурсе с примерно аналогичным названием — там используются MMF.
avatar

3Qu

3Qu, в моем случае надо каждый раз менять код луа, задавать там какие инструменты посылать в dll (имена фьючей ведь меняются раз в месяц-квартал). А подход как в этом коннекторе позволяет 1 раз написать код луа и забыть про него (пока не выйдет суперновое обновление что-то не сломает). Такой подход мне кажется более привлекательным. Менять имена инструментов тоже надо будет, но уже только в той среде, в которой крутится алгоритм.
avatar

tranquility

tranquility, я в Луа создаю таблицу с именами инструментов и прочими параметрами и в init Lua передаю ее в DLL.
avatar

3Qu

3Qu, ну так мы вряд ли делаем по-разному. Просто упомянутый коннектор получает сразу метасообщение, которое может содержать информацию о любом событии которое послал квик в луа. Т.е. в луа не нужно писать код вроде «подписаться на стакан по такому-то инструменту», это делается уже в c#, а код луа остается неизменным.
avatar

tranquility

tranquility, такой  подход не оч хорош. Если у вас подписка и др. команды Луа выполняются налету, то Луа их должен скомпилировать, а потом исполнить, а это время.
Т.к. код Луа небольшой и все данные реал-тайм передаются в обработку ДЛЛ, то мне это вообще ни к чему. Решение о сделке принимается вне Луа. Кто конкретно будет исполнять, Луа или trans2quik — пока не решил.
avatar

3Qu


....все тэги
2010-2020
UPDONW