Материал доступен также в качестве видео:
В наш век, очень многих волнует вопрос нетрудового получения крупных сумм денег рискованными путями.
Есть какие-то черные и серые темы, мошенничество, взломы, вирусы-вымогатели и т.д., но заниматься таким я бы никому не советовал.
Получите судимость, и на нормальную работу потом устроиться будет очень трудно.
Поэтому, под хоть как-то оправданным риском в данном случае я понимаю разнообразные ставки на спорт, а так же игру на бирже.
А чтобы уменьшить риски, сделать выигрыш более-менее системным, требуется осваивать много информации и проводить регулярную аналитическую работу.
Чувствуете? Опять придется работать.
Это не всегда интересно людям, и они стараются автоматизировать и переложить на кого-то рутину, а именно загрузку данных, их анализ, принятие оптимального решения, и совершение транзакций.
В идеале должен быть программный продукт, в котором есть одна кнопка "Деньги", при нажатии на которую на счет падает круглая сумма.
Безусловно, азартные игры (в том числе на бирже под соусом солидного инвестирования) это порок, и я не агитирую играть, поскольку слабовольные люди могут легко поломать себе судьбу с помощью всего этого. Но и отговаривать не буду - я вам все-таки не нянька.
К слову, у меня был опыт и в разработке анализатора коэффициентов букмекерских контор, но было это лет 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.
В момент, когда робот чует, что произойдет разворот курса, он делает заявку на покупку/продажу актива, или же фьючерса на актив. Одновременно с этим, можно выставить стоп-лосс, либо стоп+тейк профит, в зависимости от вашей стратегии.
Если вы верите в теории заговора, о том что брокер, видя у себя ваш стоп-лосс на тысячу рублей, спит и видит как бы его нахлобучить в сговоре с ВЭБом, вы можете реализовать собственный приватный умный стоп-лосс внутри своего робота, который, например, не будет срабатывать при длинных проколах на свече, и прочих кукловодских происках, а мужественно держаться до победного маржин-кола. )
В общем, далее все ограничивается только вашей фантазией и знанием Граалей.