{"id":15138486,"url":"https://github.com/i-wonderful/tinkoff-robot-spread","last_synced_at":"2025-10-23T15:30:23.058Z","repository":{"id":100698735,"uuid":"492607563","full_name":"i-wonderful/tinkoff-robot-spread","owner":"i-wonderful","description":"Java trading robot for https://github.com/Tinkoff/invest-robot-contest","archived":false,"fork":false,"pushed_at":"2022-05-27T19:29:07.000Z","size":493,"stargazers_count":5,"open_issues_count":2,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-30T19:07:47.601Z","etag":null,"topics":["java","mutiny","quarkus","reactive","trading","vertx","vuejs"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/i-wonderful.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-15T21:25:04.000Z","updated_at":"2024-06-21T20:31:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"7f99eb40-f075-47b3-a713-befdaea60568","html_url":"https://github.com/i-wonderful/tinkoff-robot-spread","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-wonderful%2Ftinkoff-robot-spread","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-wonderful%2Ftinkoff-robot-spread/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-wonderful%2Ftinkoff-robot-spread/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/i-wonderful%2Ftinkoff-robot-spread/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/i-wonderful","download_url":"https://codeload.github.com/i-wonderful/tinkoff-robot-spread/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237843772,"owners_count":19375201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","mutiny","quarkus","reactive","trading","vertx","vuejs"],"created_at":"2024-09-26T07:40:18.909Z","updated_at":"2025-10-23T15:30:22.623Z","avatar_url":"https://github.com/i-wonderful.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tinkoff Spread Robot\n\nРобот торгующий на спредах. \u003cbr/\u003e\n[Документация](https://i-wonderful.github.io/tinkoff-robot-spread/)\n\n## Запуск. \n### 1. Указать токен \nВ файле настроек ./main/resources/application.properties \nпараметр robot.token.real и токен песочницы robot.token.sandbox.\nВыставить флаг работы в песочнице robot.sandbox.modе желаемым образом.\n### 2. Запустить бд в докере:\n```shell script\ndocker run -it --rm=true \\\n    --name postgres-quarkus -e POSTGRES_USER=trobot \\\n    -e POSTGRES_PASSWORD=trobot -e POSTGRES_DB=trobot \\\n    -p 5433:5432 postgres:14.1\n```\n### 3. Сборка и запуск: \n```shell script\n./mvnw package\n```\n```shell script\njava -jar ./target/quarkus-app/quarkus-run.jar\n```\nОткрыть в браузере: http://localhost:8081/\n\n\u003e **_NOTE:_**  Можно запустить в дев режиме: ./mvnw compile quarkus:dev\n\n## Описание работы\n\nПри размере спреда больше определенной величины, выставляем две заявки на продажу и покупку на шаг цены отличающиеся \nот существующих в стакане. Для быстрого реагирования подписываемся на изменение orderbook. Если спред слишком меленький, \nзаявки убираем. Если спред изменился, а заявки уже существуют, проверяем их оптимальность: они должны быть на вершине стакана. \n\nЕсли знаем какими акциями хотим торговать, указываем их тикеры в файле настроек ./main/resources/application.properties \nв параметре robot.strategy.shares.tickers.find через запятую. Если не знаем какими акциями будем торговать, оставляем это поле пустым.\nВ этом случае запуститься поиск по всем акциям, отбирающих нужные акции по величине спреда и цене. \nВеличина спреда указывается в настройках, параметр robot.strategy.shares.spread.percent число double. \nЭто процент которым является абсолютная величина спреда к цене самое акции (ask price в данном случае). Как правила это небольшая величина порядка 0.7.\nТак же если не хотим торговать слишком дорогими акциями, указываем максимальную цену \nв параметрах robot.strategy.shares.price.max.usd и robot.strategy.shares.price.max.rub.\n\nЧтобы поиск по всем акциям не вызывал превышения лимитов запросов, ищем их партиями. \nВ одну минуту запускается таймер, где обрабатывается следующие robot.strategy.shares.count.one.minute количество акций (считаем спреды акций и оставляем нужные).\nКогда нашли очередную порцию акций, помещаем их в кеш, где хранятся все интересующие нас акции, перезапускаем работающую в данный момент стратегию.\nСтаратегия запускается когда мы нашли первую партию подходящих акций. \nКоличество акций которыми мы хотим торговать определяется параметром robot.strategy.shares.max.count. \nКогда мы нашли нужное число акций, таймеры останавливаются, больше ничего не ищем. \n\nВ стратегии подписываемся на стрим изменения стакана и стрим сделок. \nОбрабатываем данные стакана, решаем выставлять ли заявки или убирать. Если выставлять проверяем есть ли они и на вершине ли стакана.\nКогда сделка совершена, записываем данные в бд. \nВ бд для статистики храним пользовательский сеанс (время начала и завершения работы) и сделки в это время.\n\nЛоггирование осуществляется асинхронними отправками сообщений. Лог выводится в ui. Более подробный лог в консоль и файл trobot.log.\n\nЕсть кеширование некоторых запросов, результаты которых постоянны.\n\nЧтобы это все благополучно работало, задействовано максимум асинхронных вызовов. Все написано на реактивной библ. smallrye-mutiny \nи других реактивных расширениях фреймворка quarkus. Сообщения передаются в vertx eventBus. На фронте они выводятся в реалтайме.\n\nВ планах расширить критерии поиска акций, сделать остановку робота по таймеру, \nулучшить ui, улучшить eventHandler, доработать логику купли-продажи, потестить нейтив сборку.\n\np.s сейчас указан appname=i-wonderful и с ним тестировалось последний торговый день, \nранее был ошибочно указан appname=iwonderful, если можно посмотрите те заявки тоже.\n\n\n\n                                     ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-wonderful%2Ftinkoff-robot-spread","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fi-wonderful%2Ftinkoff-robot-spread","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fi-wonderful%2Ftinkoff-robot-spread/lists"}