Найти в Дзене

Как я писал биржевого робота для Quik. Часть 1

Материал доступен также в качестве видео: В наш век, очень многих волнует вопрос нетрудового получения крупных сумм денег рискованными путями. Есть какие-то черные и серые темы, мошенничество, взломы, вирусы-вымогатели и т.д., но заниматься таким я бы никому не советовал. Получите судимость, и на нормальную работу потом устроиться будет очень трудно. Поэтому, под хоть как-то оправданным риском в данном случае я понимаю разнообразные ставки на спорт, а так же игру на бирже. А чтобы уменьшить риски, сделать выигрыш более-менее системным, требуется осваивать много информации и проводить регулярную аналитическую работу. Чувствуете? Опять придется работать. Это не всегда интересно людям, и они стараются автоматизировать и переложить на кого-то рутину, а именно загрузку данных, их анализ, принятие оптимального решения, и совершение транзакций. В идеале должен быть программный продукт, в котором есть одна кнопка "Деньги", при нажатии на которую на счет падает круглая сумма. Безусловно, азарт

Материал доступен также в качестве видео:

В наш век, очень многих волнует вопрос нетрудового получения крупных сумм денег рискованными путями.

Есть какие-то черные и серые темы, мошенничество, взломы, вирусы-вымогатели и т.д., но заниматься таким я бы никому не советовал.

Получите судимость, и на нормальную работу потом устроиться будет очень трудно.

Поэтому, под хоть как-то оправданным риском в данном случае я понимаю разнообразные ставки на спорт, а так же игру на бирже.

А чтобы уменьшить риски, сделать выигрыш более-менее системным, требуется осваивать много информации и проводить регулярную аналитическую работу.

Чувствуете? Опять придется работать.

Это не всегда интересно людям, и они стараются автоматизировать и переложить на кого-то рутину, а именно загрузку данных, их анализ, принятие оптимального решения, и совершение транзакций.

В идеале должен быть программный продукт, в котором есть одна кнопка "Деньги", при нажатии на которую на счет падает круглая сумма.

Безусловно, азартные игры (в том числе на бирже под соусом солидного инвестирования) это порок, и я не агитирую играть, поскольку слабовольные люди могут легко поломать себе судьбу с помощью всего этого. Но и отговаривать не буду - я вам все-таки не нянька.

К слову, у меня был опыт и в разработке анализатора коэффициентов букмекерских контор, но было это лет 10 назад, сейчас я сильно в эту тему не погружен, и об этом как-нибудь в другой раз.

Сегодня хотелось бы поговорить о биржевой торговле, на примере московской бирже, также известной как ММВБ, ММВБ-РТС, мамба, MOEX.

И о технических аспектах организации торговых роботов.

Для торговли предоставляется биржевой терминал, который называется Quik.

Разумеется, поторговав через него, в какой-то момент мне стало интересным написать какого-то торгового робота. Который бы торговал за меня, а я бы занялся наиболее интересной частью процесса - тратил бы выигранные на бирже деньги.

Я изучил предложение на рынке конструкторов таких роботов, и решил что хотя идея набора логики из кубиков хороша для детей, не нюхавших кода, но в них недостаточно возможностей.

Как назло, еще и апи для расширения для них было на шарпе (C#), а я все-таки больше люблю в Java/Scala, а одновременная разработка на джаве/скале и шарпе чревата шизофренией, уж не обессудьте.

Поэтому я решил, что проще накорябать на коленке своего робота для Квика на джаве/скале, а там уж как пойдет, адаптировать под плазу2, или еще под что.

Квик предоставлял несколько вариантов взаимодействия с внешним миром, а именно:

1. Выгрузка в файлы

2. Выгрузка в бд

3. Онлайн подключения посредством расширений на ЛУА

Разумеется, поскольку речь про деньги, мне хотелось обеспечить наиболее быстрый обмен, поэтому я выбрал третий способ.

Язык ЛУА не является мега-популярным, и реализовывать всю логику робота в нем было бы странно, учитывая что к примеру в java/scala доступена масса библиотек, технологий и инструментов, начиная с возможности парсинга новостей, и заканчивая анализом бигдаты в хадупе и спарке.

Забегая вперед, одной лишь джавой/скалой мне ограничиться не удалось, пришлось плотно интегрировать все это хозяйство с питоном.

Тем не менее, было необходимо связать Квик через ЛУА с приложением в джава машине.

Замечательный сайт Смарт Лаба с ходу предложил прототип решения - через так называемые Windows named pipe.

Спустя пару часов решение подтвердило свою работоспособность, но с недостатками.

1. В ЛУА существуют так называемые колбеки, которые, присылают обновления стакана, а также обезличенные сделки (из которых, собственно, можно на лету рисовать свечной график).

А пример со смартлаба предполагал интерактивные запросы в квик, что существенно увеличило бы задержку.

Недолго думая, я продублировал поток, с тем чтобы один пересылал колбеки, а второй - обрабатывал в квике входящие запросы.

2. Второй недостаток был серьезнее. То ли из-за реализации работы с named pipe в джаве, то ли из-за моих кривых рук во время отладки приложения квик регулярно зависал. Как только отваливалось джава приложение, квик приходилось аварийно завершать через диспетчер задач, а частенько я не успевал сделать это вовремя, и вся машина намертво висла. Это было крайне неприятно.

3. Третье. В моем распоряжении имелся домашний сервер, собственно, просто комп с мощным многоядерным камнем, забитый под завязку оперативкой общим оъемом под сотню гигабайт, для эксперементов с бигдатой.

Разумеется, под линуском, с несколькими виртуалками внутри. Для работы с Windows named pipe, по определению, требовалась Windows, что не позволяло использовать в приложении большой объем памяти сервера, либо требовалось промежуточное звено для шлюзования команд и колбеков из named pipe в какой-то сетевой протокол.

Что было бы лишним звеном.

Короче говоря, я нашел более приличный способ - библиотеку сетевых сокетов для ЛУА, а основную идею двух каналов, оставил как есть.

Тайминги проброса данных по локальной гигабитной сетке, по моей оценке, примерно те же что и при локальной передаче через named pipe, а именно десятки миллисекунд.

На стороне робота организуется tcp сервер, слушающий несколько портов. Квик посредством скрипта на ЛУА цепляется туда, и происходит обмен данными.

Данные стаканов и обезличенных сделок обрабатываются на лету, но также складируются в сиквел базу данных - у меня Postgres, но также это могут быть например и паркетные файлы в спарке, или прости господи Json в MongoDb.

В момент, когда робот чует, что произойдет разворот курса, он делает заявку на покупку/продажу актива, или же фьючерса на актив. Одновременно с этим, можно выставить стоп-лосс, либо стоп+тейк профит, в зависимости от вашей стратегии.

Если вы верите в теории заговора, о том что брокер, видя у себя ваш стоп-лосс на тысячу рублей, спит и видит как бы его нахлобучить в сговоре с ВЭБом, вы можете реализовать собственный приватный умный стоп-лосс внутри своего робота, который, например, не будет срабатывать при длинных проколах на свече, и прочих кукловодских происках, а мужественно держаться до победного маржин-кола. )

В общем, далее все ограничивается только вашей фантазией и знанием Граалей.