В первой статье я написал о том, что решил разработать собственную систему, торгующую акциями на российском фондовом рынке.
Попытка 1. Неудачная.
Всё началось не просто. Рассчитывал, что быстро скачаю какую-нибудь библиотеку, протестирую её методы, создам пару заявок на покупку и продажу, сделаю несколько запросов на получение информации об акциях и историю торгов, и сразу же начну разрабатывать функционал робота.
Биржевые терминалы – это какие-то адские приложения, сделанные садистами для мазохистов. В самих то терминалах разобраться крайне сложно, но вокруг них, к тому же, нет никакой современной инфраструктуры.
Я пользуюсь терминалом QUIK, и он позволяет внутри себя создавать простые стратегии и сложные условия стоп-заявок. Можно еще писать роботов, но делать это нужно с помощью встроенных формочек или на внутреннем языке QPILE, а с недавнего времени и используя язык программирования Lua.
Еще данные можно получать с помощью создания DDE сервера, когда информация грузится в excel-файл и в нем регулярно обновляется. И уже из excel-файла доставать данные любым удобным способом. Но сам метод странный, неудобный и не позволяет отправлять команды терминалу Quik.
Я же хотел что-то более серьезное, современное и на знакомых мне технологиях, с возможностью хранения состояния во внешнем хранилище и с возможностью разработки удобного мне пользовательского интерфейса с кнопочками и отчётами.
github нам поможет!
Нет!
Впервые не смог найти ничего полезного на github’е. Как правило, все наоборот – куча разных библиотек, нужно только понять, что лучше подходит для решаемой задачи и выбрать. В области же трейдинга всё плохо. Никакого open source’a. Зато куча сайтов, на которых тебе пытаются продать уже готовых роботов, реализующих бесчисленное множество стратегий и сулящих несметные богатства.
Такое плачевное состояние, подозреваю, вызвано тем, что трейдинг на прямую связан с деньгами, и разработки либо все спрятаны по финансовым организациям (каждая пишет свои костыли), либо разработчики пытаются продавать охотникам за удачей своих роботов. Да и область трейдинга в России производит впечатление быдло-ориентированной, биржи и разные форексы преподносятся на уровне МММ и соответствующей аудитории. Очень мало кто хоть что-то полезное делает или чем-то открыто делится. Все гоняются за легкими деньгами да на семинары заманивают.
Однако, одна библиотека была найдена – StockSharp. Сначала радость. Потом установка. Потом несколько дней пытался разобраться как получить примитивные данные или отправить какую-либо команду терминалу. Часть кода библиотеки StockSharp выложена в open source, часть кода закрыта, часть кода можно использовать только, если купишь лицензию. Очередные разводы на деньги. “Интерпрайз” в плохом понимании этого слова. Универсальная система, которая подключается ко всем возможным терминалам и, как следствие, ужасно перегруженная и плохо работающая.
Но ничего другого не нашёл.
Эксперименты с библиотекой заняли несколько месяцев. Проект выглядел отвратительно, и все базовые модули для реализации робота так и не были собраны до конца. От такого сильного сопротивления и очень медленного прогресса мне стало скучно, и я бросил проект.
А потом у меня умер ssd. И весь код. Я настолько не серьезно относился к тому, что у меня получалось, что даже не утруждал себя заливать результаты экспериментов в репозиторий. Как представлю, что позже, когда я вернулся к этому проекту, мне бы пришлось продолжить разработку на базе StockSharp’а и всего этого ада – плохо становится. Как же полезно иногда всё сжечь и начать с чистого листа. Нам очень тяжело отказываться от того, на что потратили много времени. История с ssd сильно мне помогла и облегчила следующий шаг. Не факт, что на старом фундаменте я в принципе был бы мотивирован продолжать что-то делать.
И это хорошо!
Попытка 2. Уже лучше.
Спустя несколько месяцев я вернулся к проекту. Без особой надежды ещё раз поискал в сети коннекторы к QUIK’у на C# и был приятно удивлён, наткнувшись на библиотеку QuikSharp. Автор библиотеки залил первую версию в тот же месяц, когда мне надоело возиться со StockSharp и я забросил проект.
Решил проверить QuikSharp, скачал исходники, где-то за час разобрался и настроил все скрипты, и еще за пол часа, разобравшись с API, написал первые строчки кода. Примерно такие:
Quik quik = new Quik(); Order newOrder = new Order { ClassCode = "TQBR", SecCode = "SBER", Operation = Operation.Buy, Price = 69.3m, Quantity = 1 }; quik.Orders.CreateOrder(newOrder);
И всё работает! Команда на покупку отправилась в терминал, заявка создалась и выполнилась. Реальные акции за реальные деньги были куплены.
И сразу сформировался план действий.
Так как доверия к библиотеке изначально не было, я решил проверить, что она содержит все нужные для реализации базового алгоритма команды и методы по получению данных. Зафиксировал список всего, что нужно проверить, и приступил к проверке. И сразу же обнаружил, что библиотека не реализована полностью. Автор сделал хорошую базовую версию, реализовал общение с Quik’ом, но обернул только часть методов, которые предоставляет терминал. Часть нужного мне функционала отсутствовала. Но то что было – работало отлично, просто и понятно.
Пришлось разбираться, как работает библиотека QuikSharp.
Терминал Quik внутри себя может запускать скрипты на Lua. Эти скрипты имеют доступ к API терминала и могут как дергать данные, так и отправлять команды. Библиотека QuikSharp состоит из двух частей:
- первая часть – это скрипты на Lua, с их помощью организован обмен данными с C# кодом, а так же вызываются методы терминала.
- вторая часть – C# код, который общается Lua скриптами, обертки над методами терминала и события, в которые трансформируются методы обратного вызова терминала.
Чтобы добавить недостающий метод, нужно написать код на Lua, а вызов этого кода и обработку ответа обернуть, используя C#.
И вот вооружившись документацией по Lua и описанием API терминала Quik, я начал дописывать все недостающие методы. Проверочный список, составленный ранее, превратился в список задач. Реализовал методы работы со стоп-заявками и получения свечей с открытого в терминале графика. Весь добавленный функционал был отправлен автору библиотеки и впоследствии стал её частью.
По завершению, я был уверен в том, что все необходимые API, доступные из C#, у меня есть, и я могу приступить к разработке самой системы.
Заключение.
У программистов всё просто. Решил сделать веб-приложение, игру или утилиту для мобилок. Скачиваешь SDK, выбираешь один из доступных языков и/или фреймворков и приступаешь к разработке. Сразу в бой. Прототипы. Проверка идей. Куча документации. Разбираешься, как вывести “hello world”, и можешь всем рассказывать, что владеешь технологией.
В моём же случае метода “print”, для вывода “hello world” не было. Библиотеки, выводящие в консоль текст легко и непринужденно, без подключения распределенного искусственного интеллекта и блокчейн майнеров для генераций букв ‘d’, ‘e’, ‘h’, ‘l’, ‘o’, ‘r’, ‘w’, отсутствовали. Нужно было самому реализовать метод “print” и все сопутствующие, и хорошо, что появились попутчики, облегчившие мне путь.
И только теперь я смог приступить к реализаций самого алгоритма и инфраструктуры для его запуска. Я смог приступить к тому, что я думал буду делать уже на следующий день, когда у меня появилась идея автоматизации процесса торговли. Но что-то пошло не так. И день растянулся на пол года.
Далее: Симулятор трейдера. Шаг 2.