Download the PHP package metaseller/tinkoff-robot-buyer without Composer
On this page you can find all versions of the php package metaseller/tinkoff-robot-buyer. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download metaseller/tinkoff-robot-buyer
More information about metaseller/tinkoff-robot-buyer
Files in metaseller/tinkoff-robot-buyer
Package tinkoff-robot-buyer
Short Description Консольное приложение на Yii2, реализующее автоматизированную стратегию покупки ETF и автоматизированное управление портфелем через API Т-Инвестиций
License Apache-2.0
Homepage https://github.com/metaseller/tinkoff-robot-buyer
Informations about the package tinkoff-robot-buyer
tinkoff-robot-buyer-php
Данный Pet-проект был начат как проект для демонстрации базовых возможностей работы с T-Invest Api 2 (https://www.tinkoff.ru/invest/open-api/) на PHP через фреймворки metaseller/tinkoff-invest-api-v2-php и metaseller/tinkoff-invest-api-v2-yii2 ради фана, а также для участия в конкурсе Tinkoff Invest Robot Сontest (https://meetup.tbank.ru/event/tinkoff-invest-robot-contest/)
Впоследствии он развился до полноценного инструмента управления портфелями в рамках Т-Инвестиций, который реализует следующие стратегии инвестирования
1) Стратегия робота-покупателя, который на локальных просадках покупает лоты выбранного ETF инструмента на выбранный счет с заданной скоростью. 2) Стратегия робота-управляющего портфелем, который удерживает в рамках портфелей заданное соотношение облигаций/акций, поступающие и свободные средства автоматически размещает в целевые инструменты, а пока средства накапливаются автоматически паркует и распарковывает деньги в лоты выбранного денежного фонда. 3) Вспомогательный функционал и нотификации об операциях в Телеграм (через бота)
Введение
Вторая версия API T-Invest в настоящее время позиционируется как gRPC-интерфейс для взаимодействия с торговой платформой Тинькофф Инвестиции.
В настоящее доступны официальные SDK для популярных языков программирования, таких как python (https://developer.tbank.ru/invest/sdk/python_sdk/faq_python), java, csharp и пр.
Мной сделан небольшой неофициальный SDK для PHP7+ (https://github.com/metaseller/tinkoff-invest-api-v2-php) и обертка вокруг него для популярного фреймворка Yii 2 Framework (https://github.com/metaseller/tinkoff-invest-api-v2-yii2).
По мере сил и времени предполагается дальнейшая доработка функционала SDK. Буду очень рад, если найдутся контрибьютеры, которые подключатся к процессу :)
Вообще первой мыслью было снизить порог входа и облегчить жизнь для PHP программистов, поскольку многие имеют желание использовать функционал T-Invest Api 2 в своих продуктах/сайтах, разрабатываемых на PHP.
Но все, надеюсь, понимают, что PHP - это не лучший выбор для разработки торговых систем.
SDK, упомянутые выше, выполнены в виде библиотек и доступны для очень простой установки через composer.
Робот в рамках данного проекта работает как консольное приложение на Yii2 Framework и преследует следующие цели:
1) Продемонстрировать возможность использования SDK, снизить порог входа и облегчить жизнь для PHP программистов использующих T-Invest Api 2.
2) Продемонстрировать функционал работы с T-Invest Api 2 (как подключиться к API, как запросить данные об аккаунте и идентификаторы портфелей, как получить информацию о составе портфеля, как вывести историю пополнения портфеля, как подписаться на стрим свечей)
3) Реализовать логику нескольких стратегий, конфигурируемых через файлы конфига, работающих как консольное приложение, вызываемое по cron.
Пошаговая установка и запуск проекта
Вам нужно локально или на сервере развернуть данный Yii2 проект, инициализировать его, например prod окружением.
Для работы нам потребуется:
- PHP 7.4 или новее (я делал и тестировал на php 7.4 / Ubuntu 18.04.5)
- PECL, Composer версии 2+.
- Redis
- СУБД пока не используется
Как установить и настроить composer, если его нет: https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos Лучше делать 'глобальную установку'.
Проект использует зависимость от проектов (https://github.com/metaseller/tinkoff-invest-api-v2-yii2, https://github.com/metaseller/tinkoff-invest-api-v2-php).
Далее нам понадобится расширение grps.so для PHP (https://cloud.google.com/php/grpc).
а после не забываем в php.ini добавить (лучше в оба, в обычный и cli)
А если вам необходимо логгировать исполнение, то можно также добавить в php.ini
Само собой не забыть
Я в качестве сервиса кеша использовал у себя Redis, которые настроил доступным с вот таким конфигом:
Если Вам лень возиться с Redis, вы можете в конфигах проекта (см https://github.com/metaseller/tinkoff-robot-buyer/blob/main/config/console.php#L46, https://github.com/metaseller/tinkoff-robot-buyer/blob/main/config/web.php#L51)
заменить сервис кеша на yii\caching\FileCache (https://www.yiiframework.com/doc/api/2.0/yii-caching-filecache), не забыв выпилить из конфига
Redis (https://github.com/metaseller/tinkoff-robot-buyer/blob/main/config/web.php#L40).
PS: Ну и в целом, рано или поздно придется ознакомиться с документацией по GRPC:
1) Quick start with PHP -> https://grpc.io/docs/languages/php/quickstart/ 2) Basic tutorials -> https://grpc.io/docs/languages/php/basics/
PSS: Вот здесь вы можете видеть общий список используемых для запуска проекта зависимостей: https://packagist.org/packages/metaseller/tinkoff-robot-buyer
1) Будем устанавливать используя composer.
На подготовленном сервере переходим в нужную нам папку, например
и выполняем команду:
в папку contest.metaseller.local будет скачан/установлен проект и подтянуты автоматически все зависимости.
Заходим в эту папку
и выполняем команду
если не выполняется делаем
и запускаем. Эта команда инициализирует окружение (выбираем 0 - dev)
Затем на всякий случай проверяем/выставляем права на папку logs:
Далее настраивает ту или иную стратегию так, как описано в разделах выше.
Также нужно настроить cron, для этого
добавляем в crontab строку
(В качестве менеджера процессов, запускаемых по расписанию используется библиотека https://github.com/omnilight/yii2-scheduling, в проекте она конфигурируется в файле https://github.com/metaseller/tinkoff-robot-buyer/blob/main/config/schedule.php)
Стратегия 1. Робот покупатель ETF.
Одна из популярных инвестиционных стратегий - это регулярно покупать и держать то, во что веришь. Регулярно - это значит и на росте и падении, не пытаясь поймать дно или тренд. Равномерность все нивелирует. И чем равномернее набор позиции - тем лучше! Наш робот доведет эту мысль до абсолюта :)
Робот регулярно покупает указанный в конфиге ETF, используя вольную реализацию алгоритма Trailing Buy (перефразированный Traling Stop), постоянно готовясь к набору позиции и покупая или на росте, или на отскоке на определенную дельту от локального минимума.
Реализованный робот НЕ является роботом-скальпером, он НЕ продает инструмент. Он покупает и накапливает инструмент на выделенном счету.
Как работает робот:
1) Для начала необходимо настроить аккаунты Т-Инвестиций. Для этого нам нужен файл ./config/t-invest.php
Робот конфигурируется через файл ./config/tinkoff-buy-strategy.php следующими параметрами:
Для этих настроек вам нужен токен доступа к API Т-Инвестиций (https://developer.tbank.ru/invest/intro/intro/token) и идентификаторы портфелей вашего аккаунта.
Идентификаторы портфелей, кстати, можно получить командой (после того, как вы прописали токен):
Далее вам нужен файлик ./config/strategy-etf.php в нем настраивается логика работы стратегии робота-покупателя.
Данный файлик используется в ./config/strategies.php.
Робот покупает ETF #TMOS@ (https://www.tbank.ru/invest/etfs/TMOS@/) регулярно по следующей логике:
1) Число "накопленное количество лотов к покупке" в начале каждого торгового для оно равно 0. Затем каждые 5 минут (INCREMENT_PERIOD) с начала (и только в ходе) торгов к этому значению добавляется +1 лот (INCREMENT_VALUE). Это делается отдельной консольной командой, вызываемое по cron.
2) Одновременно с инкрементом запоминается в кэш значение "последняя цена" (лучший ASK по стакану). Как только "накопленное количество лотов к покупке" стало больше или равно значения BUY_LOTS_BOTTOM_LIMIT "последняя цена" перестает меняться в этом скрипте.
3) Параллельно каждую 1 минуту (BUY_CHECK_PERIOD) отдельной консольной командой вызывается скрипт, который, в случае, если "накопленное количество лотов к покупке" >= BUY_LOTS_BOTTOM_LIMIT сравнивает "последнюю цену" с текущим лучшим ASK по стакану. Если лучший ASK меньше, чем "последняя цена" (цена падает), то запомненное значение "последняя цена" обновляется на меньшее значение (следует за падением цены, становится "Traling price"), и бот ожидает дальнейшего движения цены.
4) Как только лучший ASK в стакане стал больше либо равен значения "Trailing price" на BUY_TRAILING_PERCENTAGE процентов (цена отскочила вверх или просто растет), происходит выставление лимитной заявки на покупку "накопленного количество лотов к покупке" по цене равное лучшему ASK в стакане. А число "накопленного количество лотов к покупке" устанавливается в ноль. Факт успешности исполнения заявки НЕ отслеживается.
5) За небольшое количество времени до конца торгов, если текущее "накопленное количество лотов к покупке" > BUY_LOTS_BOTTOM_LIMIT / 2, то форсировано выставляется лимитная заявка на покупку "накопленного количество лотов к покупке" по цене "лучший ASK в стакане". То есть "накопленное количество лотов к покупке" не переносится на следующий день.
Вот такая незамысловатая стратегия регулярной покупки. Лимитная заявка на "Лучший ASK в стакане" и "небольшие" тестовые объемы практически всегда гарантируют выполнение заявки на покупку.
Пункты 1-2 обрабатываются действием actionIncrementEtfTrailing (https://github.com/metaseller/tinkoff-robot-buyer/blob/main/commands/AutoBuyEtfController.php#L44) консольного контролера Yii2 AutoBuyEtfController.
Пункты 3-5 обрабатываются действием actionBuyEtfTrailing (https://github.com/metaseller/tinkoff-robot-buyer/blob/main/commands/AutoBuyEtfController.php#L106) консольного контролера Yii2 AutoBuyEtfController.
Все действия робота, вызовы фоновых заданий по cron, ошибки API запросов логируются в стандартной для Yii папке (./runtime/logs) в соответствующем лог-таргет файле, а также выводятся в stdout.
Cron вызов данных методов в соответствии с настройками конфигурируется в ./config/schedule-strategy-etf.php
У робота нет UI, вы можете следить за ходом работы своего робота через соответствующий лог файл (например открыв его командой tail -f ./runtime/logs/strategy-etf.log)
или переопределить логику обработчика ошибок и самостоятельно добавить туда отправку нотификации о событиях или неполадках себе через email/telegram или как-то иначе.
Наличие денег для выставления заявки роботом не контролируется. Робот тестировался и успешно работает на аккаунте, где выключена маржинальная торговля (с ней робот НЕ тестировался), и если средств для выставления заявки не хватает, то робот логирует соответствующее сообщение об ошибке выставления заявки и покупка просто не происходит.
Стратегия 2. Комплексное управление портфелем.
В рамках данной стратегии робот настраивается следующими файлами.
1) Общий файл настроек стратегии ./config/strategy-manage.php
В этом файлике мы даем стратегии семантический ярлык test_strategy, говорим системе, что она должна управлять в рамках этой стратегии
аккаунтом/портфелем account3 (см настройки ./config/t-invest.php).
Стратегия удерживает баланс облигаций и акций, вычисляя его как
Данная настройка в 2026 году будет заставлять робота удерживать на счету 57% акций и 43% облигаций (это для условного человека 1982 года рождения). Через год баланс автоматически сместится на 1% в сторону облигаций.
В этом же файле указывается тикер инструмента фондов денежного рынка, который будет использоваться для автопарковки средств.
2) Далее для настройки стратегии нам нужен пул акций с расставленными Вами весами на каждую акцию (это файлик ./config/strategy-manage-shares.php). Веса указываются процентами (%) от суммы, которую робот выделяет/рассчитывает для акций.
Этот файлик формируется Вашими предпочтениями, вы можете генерировать его опираясь на личные предпочтения, менять веса, а можете просто этим файликом повторить IMOEX, для этого в проекте есть команда
Который выводит актуальный состав индекса вот в таком виде:
3) Также нужно настроить с какими облигациями должен работать робот. Это делается в файлике ./config/strategy-manage-bonds.php.
Структура этого файла другая, тут указывается пул облигаций (их ISIN) и лимит количества к покупке. Этот файл вам нужно заполнять с "запасом" и относительно регулярно, чтобы у робота постоянно было с чем работать и определенная вариативность.
Вы сами выбираете эмитентов и выпуски, которые удовлетворяют вашему риск-менеджменту и ожиданиям доходности.
4) Можно настроить связь робота с телеграм-ботом через файл ./config/telegram.php, тогда о ходе работы вы будете получать уведомления в указанную группу в ТГ
Как работает робот:
Первое, что делает робот в рамках настроенной стратегии (test_strategy) - это вычисление лимитов и баланса. Это делается консольной командой
Данный консольный метод выведет информацию примерно в таком виде:
Из этого отчета видно, что количество акций на управляемом роботом счете account3 равно 597735.26 руб, что превышает рассчитанный лимит 594146.25,
что означает, что робот должен купить облигацию из доступного пула. Обратите внимание, несмотря на то, что робот управляет счетом account3, для расчета он
также учитывает состав портфеля account2, поскольку мы так ему велели в настройках стратегии.
Далее робот, учитывая вычисленные лимиты, рассчитывает для себя что ему потенциально разрешено купить.
Для акций это команда
которая рассчитывает и выводит данные вот такой таблицей:
Данный расчет выполнен для лимита (500000 руб) с учетом того, что уже есть у нас в портфеле. Тут виден дисбаланс, который возник, например из-за изменения долей акций при ребалансоровке или при запуске стратегии на непустом портфеле. Это норм, робот НИЧЕГО НЕ ПРОДАЕТ, он при пополнении пытается исправить этот дисбаланс.
Для облигаций это команда:
которая рассчитывает и выводит данные вот такой таблицей:
Система вычислила, что (в соответствии с настройками стратегии) у нее есть пул на 66+ тысяч рублей облигаций к покупке. Робот учитывает уже купленные позиции на счету и вычисляет что ему потенциально можно еще купить.
Далее, в соответствии с cron-задачами (см ./config/schedule-strategy-manage.php). Робот выполняет следующий алгоритм (он в целом одинаков и для акций и для облигаций):
1) Робот выполняет задачи по крону, учитывая время работы биржи. 2) Робот знает текущее состояние (покупаем акции / покупаем облигации / паркуем деньги) 3) В каждую итерацию робот считает сколько сейчас есть денег на счету, сколько денег припарковано, сколько доступно, сколько уже заблокировано). 4) Если денег хватает на покупку чего-то (с учетом комиссий) - робот выставляет торговую заявку выше на шаг лучшей ставки на покупку (Лучший BID + 1 шаг изменения цены). Если свободных денег не хватает - бот автоматически продает нужное (с учетом всех комиссий) количество фондов денежного рынка. 5) Если денег нет, но робот видит, что ранее была выставлена задача, которая не исполнилась, он заново делает вычисления лучшей цены и пододвигает свою заявку. 6) Логика 4-5 выполняется в течение дня. В конце дня робот, если видит, что еще есть средства закрывает их "агрессивно" по лучшей цене из стакана. 7) В конце торгового дня, не потраченные средства робот автоматически паркует (покупает лоты) указанного фонда денежного рынка.
Логика повторяется каждый день, остается только пополнять регулярно счет.
Вы можете закидывать деньги на управляемый счет регулярно вручную, через механизм автопополнения. Также на счет будут поступать дивиденды и купоны от облигаций, которые будут накапливаться и тратиться на покупку новых инструментов, как только накопиться на счету критическая масса денег. А копятся средства в лотах фондов денежного рынка (в этом может быть определенная неэффективность, если поступлений в течение дня много. Бот может днем распаркопать/продать определенное количество лотов, а потом вечером это же количество купить назад припарковать, если поступили новые средства. Купить/продать = комиссия).
Дополнительные информационные функции
Одна из целей реализации данного проекта - это демонстрация базовых возможностей работы с API T-Invest 2 на PHP7. Помимо стратегий, данное консольное приложение имеет ряд вспомогательных функций автоматизированного получения данных. Приведу несколько команд:
1) Получение в STDOUT информации о вашем профиле:
Результат:
2) Получение в STDOUT информации о ваших аккаунтах/портфелях:
3) Получение в STDOUT информации о составе портфеля и сравнение его с IMOEX:
4) Получение и обработка последних операций в портфеле (информация о новых операциях отправляется в TG как альтернатива не работающим пушам). Также метод является источником данных для работы стратегии управления, вызывается по крону:
5) Получение в STDOUT информации о пополнениях портфеля с разбивкой по годам и месяцам последнего года:
Команда обслуживается логикой консольного контроллера InfoController (https://github.com/metaseller/tinkoff-robot-buyer/blob/main/commands/InfoController.php)
Отказ от ответственности
Данный проект - это личный PET проект, написанный для собственных нужд. Это некоммерческий в настоящее время проект с открытым кодом. Он может содержать определенные ошибки/баги и при определенных условиях работать неэффективно.
Приведенные настройки, как и описанная стратегия, реализованная в данном роботе, приведены только для примера и ни при каких условиях не являются индивидуальной инвестиционной рекомендацией. Вы должны понимать, что торговля на фондовом рынке, а также инвестиции могут принести существенные убытки.
Вы тестируете и используете его только на свой страх и риск.
Полезные ссылки
1) Данный демо-проект: https://github.com/metaseller/tinkoff-robot-buyer (https://packagist.org/packages/metaseller/tinkoff-robot-buyer) 2) Неофициальный SDK Tinkoff Invest Api v2 для PHP: https://github.com/metaseller/tinkoff-invest-api-v2-php (https://packagist.org/packages/metaseller/tinkoff-invest-api-v2-php) 3) Обертка для Yii2 вокруг неофициального SDK Tinkoff Invest Api v2 для PHP: https://github.com/metaseller/tinkoff-invest-api-v2-yii2 (https://packagist.org/packages/metaseller/tinkoff-invest-api-v2-yii2) 4) Документация Tinkoff Invest Api для разработчиков доступна по ссылке: https://developer.tbank.ru/invest/services 5) Коммьюнити разработчиков в Telegram: https://t.me/joinchat/VaW05CDzcSdsPULM 6) Коммьюнити разработчиков по алгоритмической торговле: https://t.me/tradinggroupTinkoff
All versions of tinkoff-robot-buyer with dependencies
yiisoft/yii2 Version ~2.0.54
yiisoft/yii2-bootstrap4 Version ~2.0.0
yiisoft/yii2-swiftmailer Version ~2.0.0 || ~2.1.0
yiisoft/yii2-redis Version ^2.0
ext-curl Version *
ext-fileinfo Version *
ext-intl Version *
ext-json Version *
ext-imagick Version ^3.4
ext-exif Version ^7.2
ext-pdo Version ^7.4
omnilight/yii2-scheduling Version *
metaseller/tinkoff-invest-api-v2-yii2 Version >=0.2.1
telegram-bot/api Version ~2.3.25
sonko-dmitry/yii2-telegram-bot-api Version *
ext-dom Version *